102 address adr_default_value_offset() const {
103 assert(_adr_valueklass_fixed_block != NULL, "Should have been initialized");
104 return ((address)_adr_valueklass_fixed_block) + in_bytes(default_value_offset_offset());
105 }
106
107 address adr_value_array_klass() const {
108 assert(_adr_valueklass_fixed_block != NULL, "Should have been initialized");
109 return ((address)_adr_valueklass_fixed_block) + in_bytes(byte_offset_of(ValueKlassFixedBlock, _value_array_klass));
110 }
111
112 Klass* get_value_array_klass() const {
113 return *(Klass**)adr_value_array_klass();
114 }
115
116 Klass* acquire_value_array_klass() const {
117 return OrderAccess::load_acquire((Klass**)adr_value_array_klass());
118 }
119
120 Klass* allocate_value_array_klass(TRAPS);
121
122 int collect_fields(GrowableArray<SigEntry>* sig, int base_off = 0) const;
123
124 void cleanup_blobs();
125
126 protected:
127 // Returns the array class for the n'th dimension
128 Klass* array_klass_impl(ArrayStorageProperties storage_props, bool or_null, int n, TRAPS);
129
130 // Returns the array class with this class as element type
131 Klass* array_klass_impl(ArrayStorageProperties storage_props, bool or_null, TRAPS);
132
133 // Specifically flat array klass
134 Klass* value_array_klass(ArrayStorageProperties storage_props, bool or_null, int rank, TRAPS);
135
136 public:
137 // Type testing
138 bool is_value_slow() const { return true; }
139
140 // value_mirror is the primary mirror
141 oop value_mirror() const { return java_lang_Class::inline_type_mirror(java_mirror()); }
142 oop indirect_mirror() const { return java_lang_Class::indirect_type_mirror(java_mirror()); }
143
144 // Casting from Klass*
145 static ValueKlass* cast(Klass* k) {
146 assert(k->is_value(), "cast to ValueKlass");
147 return (ValueKlass*) k;
148 }
149
150 // Use this to return the size of an instance in heap words
151 // Implementation is currently simple because all value types are allocated
152 // in Java heap like Java objects.
153 virtual int size_helper() const {
154 return layout_helper_to_size_helper(layout_helper());
155 }
156
157 // Metadata iterators
158 void array_klasses_do(void f(Klass* k));
159
160 // allocate_instance() allocates a stand alone value in the Java heap
161 instanceOop allocate_instance(TRAPS);
162
163 // minimum number of bytes occupied by nonstatic fields, HeapWord aligned or pow2
164 int raw_value_byte_size() const;
165
166 int first_field_offset() const;
167
168 address data_for_oop(oop o) const {
169 return ((address) (void*) o) + first_field_offset();
170 }
171
172 oop oop_for_data(address data) const {
173 oop o = (oop) (data - first_field_offset());
174 assert(oopDesc::is_oop(o, false), "Not an oop");
175 return o;
176 }
177
178 // Query if h/w provides atomic load/store
179 bool is_atomic();
180
181 bool flatten_array();
182
183 bool contains_oops() const { return nonstatic_oop_map_count() > 0; }
184 int nonstatic_oop_count();
185
186 // Prototype general store methods...
|
102 address adr_default_value_offset() const {
103 assert(_adr_valueklass_fixed_block != NULL, "Should have been initialized");
104 return ((address)_adr_valueklass_fixed_block) + in_bytes(default_value_offset_offset());
105 }
106
107 address adr_value_array_klass() const {
108 assert(_adr_valueklass_fixed_block != NULL, "Should have been initialized");
109 return ((address)_adr_valueklass_fixed_block) + in_bytes(byte_offset_of(ValueKlassFixedBlock, _value_array_klass));
110 }
111
112 Klass* get_value_array_klass() const {
113 return *(Klass**)adr_value_array_klass();
114 }
115
116 Klass* acquire_value_array_klass() const {
117 return OrderAccess::load_acquire((Klass**)adr_value_array_klass());
118 }
119
120 Klass* allocate_value_array_klass(TRAPS);
121
122 address adr_alignment() const {
123 assert(_adr_valueklass_fixed_block != NULL, "Should have been initialized");
124 return ((address)_adr_valueklass_fixed_block) + in_bytes(byte_offset_of(ValueKlassFixedBlock, _alignment));
125 }
126
127 address adr_first_field_offset() const {
128 assert(_adr_valueklass_fixed_block != NULL, "Should have been initialized");
129 return ((address)_adr_valueklass_fixed_block) + in_bytes(byte_offset_of(ValueKlassFixedBlock, _first_field_offset));
130 }
131
132 address adr_exact_size_in_bytes() const {
133 assert(_adr_valueklass_fixed_block != NULL, "Should have been initialized");
134 return ((address)_adr_valueklass_fixed_block) + in_bytes(byte_offset_of(ValueKlassFixedBlock, _exact_size_in_bytes));
135 }
136
137 public:
138 int get_alignment() const {
139 return *(int*)adr_alignment();
140 }
141
142 void set_alignment(int alignment) {
143 *(int*)adr_alignment() = alignment;
144 }
145
146 int get_first_field_offset() const {
147 int offset = *(int*)adr_first_field_offset();
148 assert(offset != 0, "Must be initialized before use");
149 return *(int*)adr_first_field_offset();
150 }
151
152 void set_first_field_offset(int offset) {
153 *(int*)adr_first_field_offset() = offset;
154 }
155
156 int get_exact_size_in_bytes() {
157 return *(int*)adr_exact_size_in_bytes();
158 }
159
160 void set_exact_size_in_bytes(int exact_size) {
161 *(int*)adr_exact_size_in_bytes() = exact_size;
162 }
163
164 private:
165 int collect_fields(GrowableArray<SigEntry>* sig, int base_off = 0) const;
166
167 void cleanup_blobs();
168
169 int first_field_offset_old() const;
170
171 protected:
172 // Returns the array class for the n'th dimension
173 Klass* array_klass_impl(ArrayStorageProperties storage_props, bool or_null, int n, TRAPS);
174
175 // Returns the array class with this class as element type
176 Klass* array_klass_impl(ArrayStorageProperties storage_props, bool or_null, TRAPS);
177
178 // Specifically flat array klass
179 Klass* value_array_klass(ArrayStorageProperties storage_props, bool or_null, int rank, TRAPS);
180
181 public:
182 // Type testing
183 bool is_value_slow() const { return true; }
184
185 // value_mirror is the primary mirror
186 oop value_mirror() const { return java_lang_Class::inline_type_mirror(java_mirror()); }
187 oop indirect_mirror() const { return java_lang_Class::indirect_type_mirror(java_mirror()); }
188
189 // Casting from Klass*
190 static ValueKlass* cast(Klass* k) {
191 assert(k->is_value(), "cast to ValueKlass");
192 return (ValueKlass*) k;
193 }
194
195 // Use this to return the size of an instance in heap words
196 // Implementation is currently simple because all value types are allocated
197 // in Java heap like Java objects.
198 virtual int size_helper() const {
199 return layout_helper_to_size_helper(layout_helper());
200 }
201
202 // Metadata iterators
203 void array_klasses_do(void f(Klass* k));
204
205 // allocate_instance() allocates a stand alone value in the Java heap
206 instanceOop allocate_instance(TRAPS);
207
208 // minimum number of bytes occupied by nonstatic fields, HeapWord aligned or pow2
209 int raw_value_byte_size() const;
210
211 int first_field_offset() const {
212 // To be refactored/simplified once old layout code and UseNewLayout are removed
213 if (UseNewLayout) {
214 return get_first_field_offset();
215 } else {
216 return first_field_offset_old();
217 }
218 };
219
220 address data_for_oop(oop o) const {
221 return ((address) (void*) o) + first_field_offset();
222 }
223
224 oop oop_for_data(address data) const {
225 oop o = (oop) (data - first_field_offset());
226 assert(oopDesc::is_oop(o, false), "Not an oop");
227 return o;
228 }
229
230 // Query if h/w provides atomic load/store
231 bool is_atomic();
232
233 bool flatten_array();
234
235 bool contains_oops() const { return nonstatic_oop_map_count() > 0; }
236 int nonstatic_oop_count();
237
238 // Prototype general store methods...
|