67 *(markWord*)(((char*)mem) + mark_offset_in_bytes()) = m;
68 }
69
70 void oopDesc::release_set_mark(HeapWord* mem, markWord m) {
71 Atomic::release_store((markWord*)(((char*)mem) + mark_offset_in_bytes()), m);
72 }
73
74 void oopDesc::release_set_mark(markWord m) {
75 Atomic::release_store(&_mark, m);
76 }
77
78 markWord oopDesc::cas_set_mark(markWord new_mark, markWord old_mark) {
79 return Atomic::cmpxchg(&_mark, old_mark, new_mark);
80 }
81
82 markWord oopDesc::cas_set_mark(markWord new_mark, markWord old_mark, atomic_memory_order order) {
83 return Atomic::cmpxchg(&_mark, old_mark, new_mark, order);
84 }
85
86 markWord oopDesc::prototype_mark() const {
87 if (UseCompactObjectHeaders) {
88 return klass()->prototype_header();
89 } else {
90 return markWord::prototype();
91 }
92 }
93
94 void oopDesc::init_mark() {
95 set_mark(prototype_mark());
96 }
97
98 Klass* oopDesc::klass() const {
99 switch (ObjLayout::klass_mode()) {
100 case ObjLayout::Compact:
101 return mark().klass();
102 case ObjLayout::Compressed:
103 return CompressedKlassPointers::decode_not_null(_metadata._compressed_klass);
104 default:
105 return _metadata._klass;
106 }
107 }
215
216 assert(s == klass->oop_size(this), "wrong array object size");
217 } else {
218 // Must be zero, so bite the bullet and take the virtual call.
219 s = klass->oop_size(this);
220 }
221 }
222
223 assert(s > 0, "Oop size must be greater than zero, not %zu", s);
224 assert(is_object_aligned(s), "Oop size is not properly aligned: %zu", s);
225 return s;
226 }
227
228 bool oopDesc::is_instance() const { return klass()->is_instance_klass(); }
229 bool oopDesc::is_instanceRef() const { return klass()->is_reference_instance_klass(); }
230 bool oopDesc::is_stackChunk() const { return klass()->is_stack_chunk_instance_klass(); }
231 bool oopDesc::is_array() const { return klass()->is_array_klass(); }
232 bool oopDesc::is_objArray() const { return klass()->is_objArray_klass(); }
233 bool oopDesc::is_typeArray() const { return klass()->is_typeArray_klass(); }
234
235 template<typename T>
236 T* oopDesc::field_addr(int offset) const { return reinterpret_cast<T*>(cast_from_oop<intptr_t>(as_oop()) + offset); }
237
238 template <typename T>
239 size_t oopDesc::field_offset(T* p) const { return pointer_delta((void*)p, (void*)this, 1); }
240
241 template <DecoratorSet decorators>
242 inline oop oopDesc::obj_field_access(int offset) const { return HeapAccess<decorators>::oop_load_at(as_oop(), offset); }
243 inline oop oopDesc::obj_field(int offset) const { return HeapAccess<>::oop_load_at(as_oop(), offset); }
244
245 inline void oopDesc::obj_field_put(int offset, oop value) { HeapAccess<>::oop_store_at(as_oop(), offset, value); }
246 template <DecoratorSet decorators>
247 inline void oopDesc::obj_field_put_access(int offset, oop value) { HeapAccess<decorators>::oop_store_at(as_oop(), offset, value); }
248
249 inline jbyte oopDesc::byte_field(int offset) const { return *field_addr<jbyte>(offset); }
250 inline void oopDesc::byte_field_put(int offset, jbyte value) { *field_addr<jbyte>(offset) = value; }
251
252 inline jchar oopDesc::char_field(int offset) const { return *field_addr<jchar>(offset); }
253 inline void oopDesc::char_field_put(int offset, jchar value) { *field_addr<jchar>(offset) = value; }
254
|
67 *(markWord*)(((char*)mem) + mark_offset_in_bytes()) = m;
68 }
69
70 void oopDesc::release_set_mark(HeapWord* mem, markWord m) {
71 Atomic::release_store((markWord*)(((char*)mem) + mark_offset_in_bytes()), m);
72 }
73
74 void oopDesc::release_set_mark(markWord m) {
75 Atomic::release_store(&_mark, m);
76 }
77
78 markWord oopDesc::cas_set_mark(markWord new_mark, markWord old_mark) {
79 return Atomic::cmpxchg(&_mark, old_mark, new_mark);
80 }
81
82 markWord oopDesc::cas_set_mark(markWord new_mark, markWord old_mark, atomic_memory_order order) {
83 return Atomic::cmpxchg(&_mark, old_mark, new_mark, order);
84 }
85
86 markWord oopDesc::prototype_mark() const {
87 if (UseCompactObjectHeaders || EnableValhalla) {
88 return klass()->prototype_header();
89 } else {
90 return markWord::prototype();
91 }
92 }
93
94 void oopDesc::init_mark() {
95 set_mark(prototype_mark());
96 }
97
98 Klass* oopDesc::klass() const {
99 switch (ObjLayout::klass_mode()) {
100 case ObjLayout::Compact:
101 return mark().klass();
102 case ObjLayout::Compressed:
103 return CompressedKlassPointers::decode_not_null(_metadata._compressed_klass);
104 default:
105 return _metadata._klass;
106 }
107 }
215
216 assert(s == klass->oop_size(this), "wrong array object size");
217 } else {
218 // Must be zero, so bite the bullet and take the virtual call.
219 s = klass->oop_size(this);
220 }
221 }
222
223 assert(s > 0, "Oop size must be greater than zero, not %zu", s);
224 assert(is_object_aligned(s), "Oop size is not properly aligned: %zu", s);
225 return s;
226 }
227
228 bool oopDesc::is_instance() const { return klass()->is_instance_klass(); }
229 bool oopDesc::is_instanceRef() const { return klass()->is_reference_instance_klass(); }
230 bool oopDesc::is_stackChunk() const { return klass()->is_stack_chunk_instance_klass(); }
231 bool oopDesc::is_array() const { return klass()->is_array_klass(); }
232 bool oopDesc::is_objArray() const { return klass()->is_objArray_klass(); }
233 bool oopDesc::is_typeArray() const { return klass()->is_typeArray_klass(); }
234
235 bool oopDesc::is_inline_type() const { return mark().is_inline_type(); }
236 #ifdef _LP64
237 bool oopDesc::is_flatArray() const {
238 markWord mrk = mark();
239 return (mrk.is_unlocked()) ? mrk.is_flat_array() : klass()->is_flatArray_klass();
240 }
241 bool oopDesc::is_null_free_array() const {
242 markWord mrk = mark();
243 return (mrk.is_unlocked()) ? mrk.is_null_free_array() : klass()->is_null_free_array_klass();
244 }
245 #else
246 bool oopDesc::is_flatArray() const { return klass()->is_flatArray_klass(); }
247 bool oopDesc::is_null_free_array() const { return klass()->is_null_free_array_klass(); }
248 #endif
249
250 template<typename T>
251 T* oopDesc::field_addr(int offset) const { return reinterpret_cast<T*>(cast_from_oop<intptr_t>(as_oop()) + offset); }
252
253 template <typename T>
254 size_t oopDesc::field_offset(T* p) const { return pointer_delta((void*)p, (void*)this, 1); }
255
256 template <DecoratorSet decorators>
257 inline oop oopDesc::obj_field_access(int offset) const { return HeapAccess<decorators>::oop_load_at(as_oop(), offset); }
258 inline oop oopDesc::obj_field(int offset) const { return HeapAccess<>::oop_load_at(as_oop(), offset); }
259
260 inline void oopDesc::obj_field_put(int offset, oop value) { HeapAccess<>::oop_store_at(as_oop(), offset, value); }
261 template <DecoratorSet decorators>
262 inline void oopDesc::obj_field_put_access(int offset, oop value) { HeapAccess<decorators>::oop_store_at(as_oop(), offset, value); }
263
264 inline jbyte oopDesc::byte_field(int offset) const { return *field_addr<jbyte>(offset); }
265 inline void oopDesc::byte_field_put(int offset, jbyte value) { *field_addr<jbyte>(offset) = value; }
266
267 inline jchar oopDesc::char_field(int offset) const { return *field_addr<jchar>(offset); }
268 inline void oopDesc::char_field_put(int offset, jchar value) { *field_addr<jchar>(offset) = value; }
269
|