@@ -218,6 +218,7 @@ Object* const cUndef = reinterpret_cast<Object*>(0x22L);
218
218
* // Garbage collector flags
219
219
* unsigned int marked : 2;
220
220
* unsigned int scanned : 1;
221
+ * unsigned int referenced : 4;
221
222
*
222
223
* // Data type flags
223
224
* object_type type_id : 15;
@@ -229,7 +230,7 @@ Object* const cUndef = reinterpret_cast<Object*>(0x22L);
229
230
* unsigned int bias_locked : 1;
230
231
* unsigned int locked_count : 4;
231
232
* unsigned int lock_inflated : 1;
232
- * unsigned int object_id : 16 ;
233
+ * unsigned int object_id : 12 ;
233
234
* unsigned int reserved : 3;
234
235
*
235
236
* // Graph flags
@@ -294,58 +295,65 @@ Object* const cUndef = reinterpret_cast<Object*>(0x22L);
294
295
#define RBX_MEMORY_SET_SCANNED (f ) RBX_MEMORY_SET_BIT(SCANNED,f)
295
296
#define RBX_MEMORY_UNSET_SCANNED (f ) RBX_MEMORY_UNSET_BIT(SCANNED,f)
296
297
297
- #define RBX_MEMORY_TYPE_ID_SHIFT 19
298
+ #define RBX_MEMORY_REFERENCED_SHIFT 19
299
+ #define RBX_MEMORY_REFERENCED_VALUE_MASK 0xfL
300
+ #define RBX_MEMORY_REFERENCED_BIT_MASK (((1L << 4 ) - 1 ) << RBX_MEMORY_REFERENCED_SHIFT)
301
+
302
+ #define RBX_MEMORY_SET_REFERENCED (f,v ) RBX_MEMORY_SET_FIELD(REFERENCED,f,v)
303
+ #define RBX_MEMORY_GET_REFERENCED (f ) RBX_MEMORY_GET_FIELD(REFERENCED,f)
304
+
305
+ #define RBX_MEMORY_TYPE_ID_SHIFT 23
298
306
#define RBX_MEMORY_TYPE_ID_VALUE_MASK 0x7fffL
299
307
#define RBX_MEMORY_TYPE_ID_BIT_MASK (((1L << 15 ) - 1 ) << RBX_MEMORY_TYPE_ID_SHIFT)
300
308
301
309
#define RBX_MEMORY_SET_TYPE_ID (f,v ) RBX_MEMORY_SET_FIELD(TYPE_ID,f,v)
302
310
#define RBX_MEMORY_GET_TYPE_ID (f ) RBX_MEMORY_GET_FIELD(TYPE_ID,f)
303
311
304
- #define RBX_MEMORY_DATA_BIT (1L << 34 )
305
- #define RBX_MEMORY_DATA_MASK (1L << 34 )
312
+ #define RBX_MEMORY_DATA_BIT (1L << 38 )
313
+ #define RBX_MEMORY_DATA_MASK (1L << 38 )
306
314
307
315
#define RBX_MEMORY_DATA_P (f ) RBX_MEMORY_GET_BIT(DATA,f)
308
316
#define RBX_MEMORY_SET_DATA (f ) RBX_MEMORY_SET_BIT(DATA,f)
309
317
#define RBX_MEMORY_UNSET_DATA (f ) RBX_MEMORY_UNSET_BIT(DATA,f)
310
318
311
- #define RBX_MEMORY_FROZEN_BIT (1L << 35 )
312
- #define RBX_MEMORY_FROZEN_MASK (1L << 35 )
319
+ #define RBX_MEMORY_FROZEN_BIT (1L << 39 )
320
+ #define RBX_MEMORY_FROZEN_MASK (1L << 39 )
313
321
314
322
#define RBX_MEMORY_FROZEN_P (f ) RBX_MEMORY_GET_BIT(FROZEN,f)
315
323
#define RBX_MEMORY_SET_FROZEN (f ) RBX_MEMORY_SET_BIT(FROZEN,f)
316
324
#define RBX_MEMORY_UNSET_FROZEN (f ) RBX_MEMORY_UNSET_BIT(FROZEN,f)
317
325
318
- #define RBX_MEMORY_TAINTED_BIT (1L << 36 )
319
- #define RBX_MEMORY_TAINTED_MASK (1L << 36 )
326
+ #define RBX_MEMORY_TAINTED_BIT (1L << 40 )
327
+ #define RBX_MEMORY_TAINTED_MASK (1L << 40 )
320
328
321
329
#define RBX_MEMORY_TAINTED_P (f ) RBX_MEMORY_GET_BIT(TAINTED,f)
322
330
#define RBX_MEMORY_SET_TAINTED (f ) RBX_MEMORY_SET_BIT(TAINTED,f)
323
331
#define RBX_MEMORY_UNSET_TAINTED (f ) RBX_MEMORY_UNSET_BIT(TAINTED,f)
324
332
325
- #define RBX_MEMORY_BIAS_LOCKED_BIT (1L << 37 )
326
- #define RBX_MEMORY_BIAS_LOCKED_MASK (1L << 37 )
333
+ #define RBX_MEMORY_BIAS_LOCKED_BIT (1L << 41 )
334
+ #define RBX_MEMORY_BIAS_LOCKED_MASK (1L << 41 )
327
335
328
336
#define RBX_MEMORY_BIAS_LOCKED_P (f ) RBX_MEMORY_GET_BIT(BIAS_LOCKED,f)
329
337
#define RBX_MEMORY_SET_BIAS_LOCKED (f ) RBX_MEMORY_SET_BIT(BIAS_LOCKED,f)
330
338
#define RBX_MEMORY_UNSET_BIAS_LOCKED (f ) RBX_MEMORY_UNSET_BIT(BIAS_LOCKED,f)
331
339
332
- #define RBX_MEMORY_LOCKED_COUNT_SHIFT 38
340
+ #define RBX_MEMORY_LOCKED_COUNT_SHIFT 42
333
341
#define RBX_MEMORY_LOCKED_COUNT_VALUE_MASK 0xfL
334
342
#define RBX_MEMORY_LOCKED_COUNT_BIT_MASK (((1L << 4 ) - 1 ) << RBX_MEMORY_LOCKED_COUNT_SHIFT)
335
343
336
344
#define RBX_MEMORY_SET_LOCKED_COUNT (f,v ) RBX_MEMORY_SET_FIELD(LOCKED_COUNT,f,v)
337
345
#define RBX_MEMORY_GET_LOCKED_COUNT (f ) RBX_MEMORY_GET_FIELD(LOCKED_COUNT,f)
338
346
339
- #define RBX_MEMORY_LOCK_INFLATED_BIT (1L << 42 )
340
- #define RBX_MEMORY_LOCK_INFLATED_MASK (1L << 42 )
347
+ #define RBX_MEMORY_LOCK_INFLATED_BIT (1L << 46 )
348
+ #define RBX_MEMORY_LOCK_INFLATED_MASK (1L << 46 )
341
349
342
350
#define RBX_MEMORY_LOCK_INFLATED_P (f ) RBX_MEMORY_GET_BIT(LOCK_INFLATED,f)
343
351
#define RBX_MEMORY_SET_LOCK_INFLATED (f ) RBX_MEMORY_SET_BIT(LOCK_INFLATED,f)
344
352
#define RBX_MEMORY_UNSET_LOCK_INFLATED (f ) RBX_MEMORY_UNSET_BIT(LOCK_INFLATED,f)
345
353
346
- #define RBX_MEMORY_OBJECT_ID_SHIFT 43
347
- #define RBX_MEMORY_OBJECT_ID_VALUE_MASK 0xffffL
348
- #define RBX_MEMORY_OBJECT_ID_BIT_MASK (((1L << 16 ) - 1 ) << RBX_MEMORY_OBJECT_ID_SHIFT)
354
+ #define RBX_MEMORY_OBJECT_ID_SHIFT 47
355
+ #define RBX_MEMORY_OBJECT_ID_VALUE_MASK 0xfffL
356
+ #define RBX_MEMORY_OBJECT_ID_BIT_MASK (((1L << 12 ) - 1 ) << RBX_MEMORY_OBJECT_ID_SHIFT)
349
357
350
358
#define RBX_MEMORY_SET_OBJECT_ID (f,v ) RBX_MEMORY_SET_FIELD(OBJECT_ID,f,v)
351
359
#define RBX_MEMORY_GET_OBJECT_ID (f ) RBX_MEMORY_GET_FIELD(OBJECT_ID,f)
@@ -481,6 +489,22 @@ Object* const cUndef = reinterpret_cast<Object*>(0x22L);
481
489
return RBX_MEMORY_SCANNED_P (header.load ());
482
490
}
483
491
492
+ unsigned int referenced () const {
493
+ if (inflated_p ()) {
494
+ return RBX_MEMORY_GET_REFERENCED (inflated_header ()->flags );
495
+ }
496
+
497
+ return RBX_MEMORY_GET_REFERENCED (header.load ());
498
+ }
499
+
500
+ void referenced (unsigned int count) {
501
+ if (inflated_p ()) {
502
+ RBX_MEMORY_SET_REFERENCED (inflated_header ()->flags , count);
503
+ } else {
504
+ header.store (RBX_MEMORY_SET_REFERENCED (header.load (), count));
505
+ }
506
+ }
507
+
484
508
object_type type_id () const {
485
509
if (inflated_p ()) {
486
510
return static_cast <object_type>(
0 commit comments