48 //
49 //
50 // Partial array entry
51 // -------------------
52 //
53 // 6 3 3
54 // 3 2 1 2 1 0
55 // +------------------------------------+---------------------------------+-+-+
56 // |11111111 11111111 11111111 11111111 |11111111 11111111 11111111 111111|1|1|
57 // +------------------------------------+---------------------------------+-+-+
58 // | | | |
59 // | | 1-1 Partial Array Flag (1-bit) * |
60 // | | |
61 // | | 0-0 Final Flag (1-bit) *
62 // | |
63 // | * 31-2 Partial Array Length (30-bits)
64 // |
65 // * 63-32 Partial Array Address Offset (32-bits)
66 //
67
68 class ZMarkStackEntry VALUE_OBJ_CLASS_SPEC {
69 private:
70 typedef ZBitField<uint64_t, bool, 0, 1> field_finalizable;
71 typedef ZBitField<uint64_t, bool, 1, 1> field_partial_array;
72 typedef ZBitField<uint64_t, uintptr_t, 2, 62> field_object_address;
73 typedef ZBitField<uint64_t, size_t, 2, 30> field_partial_array_length;
74 typedef ZBitField<uint64_t, size_t, 32, 32> field_partial_array_offset;
75
76 uint64_t _entry;
77
78 public:
79 ZMarkStackEntry() {
80 // This constructor is intentionally left emtpy and does not initialize
81 // _entry to allow it to be optimized out when instantiating ZMarkStack,
82 // which has a long array of ZMarkStackEntry elements, but doesn't care
83 // what _entry is initialized to.
84 }
85
86 ZMarkStackEntry(uintptr_t object_address, bool finalizable) :
87 _entry(field_object_address::encode(object_address) |
88 field_partial_array::encode(false) |
|
48 //
49 //
50 // Partial array entry
51 // -------------------
52 //
53 // 6 3 3
54 // 3 2 1 2 1 0
55 // +------------------------------------+---------------------------------+-+-+
56 // |11111111 11111111 11111111 11111111 |11111111 11111111 11111111 111111|1|1|
57 // +------------------------------------+---------------------------------+-+-+
58 // | | | |
59 // | | 1-1 Partial Array Flag (1-bit) * |
60 // | | |
61 // | | 0-0 Final Flag (1-bit) *
62 // | |
63 // | * 31-2 Partial Array Length (30-bits)
64 // |
65 // * 63-32 Partial Array Address Offset (32-bits)
66 //
67
68 class ZMarkStackEntry {
69 private:
70 typedef ZBitField<uint64_t, bool, 0, 1> field_finalizable;
71 typedef ZBitField<uint64_t, bool, 1, 1> field_partial_array;
72 typedef ZBitField<uint64_t, uintptr_t, 2, 62> field_object_address;
73 typedef ZBitField<uint64_t, size_t, 2, 30> field_partial_array_length;
74 typedef ZBitField<uint64_t, size_t, 32, 32> field_partial_array_offset;
75
76 uint64_t _entry;
77
78 public:
79 ZMarkStackEntry() {
80 // This constructor is intentionally left emtpy and does not initialize
81 // _entry to allow it to be optimized out when instantiating ZMarkStack,
82 // which has a long array of ZMarkStackEntry elements, but doesn't care
83 // what _entry is initialized to.
84 }
85
86 ZMarkStackEntry(uintptr_t object_address, bool finalizable) :
87 _entry(field_object_address::encode(object_address) |
88 field_partial_array::encode(false) |
|