33 // |
33 // |
34 // Object entry |
34 // Object entry |
35 // ------------ |
35 // ------------ |
36 // |
36 // |
37 // 6 |
37 // 6 |
38 // 3 2 1 0 |
38 // 3 3 2 1 0 |
39 // +---------------------------------------------------------------------+-+-+ |
39 // +--------------------------------------------------------------------+-+-+-+ |
40 // |11111111 11111111 11111111 11111111 11111111 11111111 11111111 111111|1|1| |
40 // |11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111|1|1|1| |
41 // +---------------------------------------------------------------------+-+-+ |
41 // +--------------------------------------------------------------------+-+-+-+ |
42 // | | | |
42 // | | | | |
43 // | 1-1 Partial Array Flag (1-bit) * | |
43 // | 2-2 Follow Flag (1-bit) * | | |
44 // | | |
44 // | | | |
45 // | 0-0 Final Flag (1-bit) * |
45 // | 1-1 Partial Array Flag (1-bit) * | |
|
46 // | | |
|
47 // | 0-0 Final Flag (1-bit) * |
46 // | |
48 // | |
47 // * 63-2 Object Address (62-bits) |
49 // * 63-3 Object Address (61-bits) |
48 // |
50 // |
49 // |
51 // |
50 // Partial array entry |
52 // Partial array entry |
51 // ------------------- |
53 // ------------------- |
52 // |
54 // |
67 |
69 |
68 class ZMarkStackEntry { |
70 class ZMarkStackEntry { |
69 private: |
71 private: |
70 typedef ZBitField<uint64_t, bool, 0, 1> field_finalizable; |
72 typedef ZBitField<uint64_t, bool, 0, 1> field_finalizable; |
71 typedef ZBitField<uint64_t, bool, 1, 1> field_partial_array; |
73 typedef ZBitField<uint64_t, bool, 1, 1> field_partial_array; |
72 typedef ZBitField<uint64_t, uintptr_t, 2, 62> field_object_address; |
74 typedef ZBitField<uint64_t, bool, 2, 1> field_follow; |
|
75 typedef ZBitField<uint64_t, uintptr_t, 3, 61> field_object_address; |
73 typedef ZBitField<uint64_t, size_t, 2, 30> field_partial_array_length; |
76 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; |
77 typedef ZBitField<uint64_t, size_t, 32, 32> field_partial_array_offset; |
75 |
78 |
76 uint64_t _entry; |
79 uint64_t _entry; |
77 |
80 |
81 // _entry to allow it to be optimized out when instantiating ZMarkStack, |
84 // _entry to allow it to be optimized out when instantiating ZMarkStack, |
82 // which has a long array of ZMarkStackEntry elements, but doesn't care |
85 // which has a long array of ZMarkStackEntry elements, but doesn't care |
83 // what _entry is initialized to. |
86 // what _entry is initialized to. |
84 } |
87 } |
85 |
88 |
86 ZMarkStackEntry(uintptr_t object_address, bool finalizable) : |
89 ZMarkStackEntry(uintptr_t object_address, bool follow, bool finalizable) : |
87 _entry(field_object_address::encode(object_address) | |
90 _entry(field_object_address::encode(object_address) | |
|
91 field_follow::encode(follow) | |
88 field_partial_array::encode(false) | |
92 field_partial_array::encode(false) | |
89 field_finalizable::encode(finalizable)) {} |
93 field_finalizable::encode(finalizable)) {} |
90 |
94 |
91 ZMarkStackEntry(size_t partial_array_offset, size_t partial_array_length, bool finalizable) : |
95 ZMarkStackEntry(size_t partial_array_offset, size_t partial_array_length, bool finalizable) : |
92 _entry(field_partial_array_offset::encode(partial_array_offset) | |
96 _entry(field_partial_array_offset::encode(partial_array_offset) | |
108 |
112 |
109 size_t partial_array_length() const { |
113 size_t partial_array_length() const { |
110 return field_partial_array_length::decode(_entry); |
114 return field_partial_array_length::decode(_entry); |
111 } |
115 } |
112 |
116 |
|
117 bool follow() const { |
|
118 return field_follow::decode(_entry); |
|
119 } |
|
120 |
113 uintptr_t object_address() const { |
121 uintptr_t object_address() const { |
114 return field_object_address::decode(_entry); |
122 return field_object_address::decode(_entry); |
115 } |
123 } |
116 }; |
124 }; |
117 |
125 |