< prev index next > src/hotspot/share/oops/oop.inline.hpp
Print this page
markWord oopDesc::cas_set_mark(markWord new_mark, markWord old_mark, atomic_memory_order order) {
return Atomic::cmpxchg(&_mark, old_mark, new_mark, order);
}
markWord oopDesc::prototype_mark() const {
! if (UseCompactObjectHeaders) {
return klass()->prototype_header();
} else {
return markWord::prototype();
}
}
void oopDesc::init_mark() {
set_mark(prototype_mark());
}
Klass* oopDesc::klass() const {
switch (ObjLayout::klass_mode()) {
case ObjLayout::Compact:
return mark().klass();
case ObjLayout::Compressed:
markWord oopDesc::cas_set_mark(markWord new_mark, markWord old_mark, atomic_memory_order order) {
return Atomic::cmpxchg(&_mark, old_mark, new_mark, order);
}
markWord oopDesc::prototype_mark() const {
! if (UseCompactObjectHeaders || EnableValhalla) {
return klass()->prototype_header();
} else {
return markWord::prototype();
}
}
void oopDesc::init_mark() {
set_mark(prototype_mark());
}
+ // This is for parallel gc, which doesn't always have the klass.
+ // markWord::must_be_preserved preserves the original prototype header bits for EnableValhalla,
+ // I don't know why serial gc doesn't work the same.
+ void oopDesc::reinit_mark() {
+ if (UseCompactObjectHeaders) {
+ set_mark(klass()->prototype_header());
+ } else {
+ set_mark(markWord::prototype());
+ }
+ }
+
Klass* oopDesc::klass() const {
switch (ObjLayout::klass_mode()) {
case ObjLayout::Compact:
return mark().klass();
case ObjLayout::Compressed:
bool oopDesc::is_instance() const { return klass()->is_instance_klass(); }
bool oopDesc::is_instanceRef() const { return klass()->is_reference_instance_klass(); }
bool oopDesc::is_stackChunk() const { return klass()->is_stack_chunk_instance_klass(); }
bool oopDesc::is_array() const { return klass()->is_array_klass(); }
bool oopDesc::is_objArray() const { return klass()->is_objArray_klass(); }
+ bool oopDesc::is_refArray() const { return klass()->is_refArray_klass(); }
bool oopDesc::is_typeArray() const { return klass()->is_typeArray_klass(); }
+ bool oopDesc::is_refined_objArray() const { return klass()->is_refined_objArray_klass(); }
+
+ bool oopDesc::is_inline_type() const { return mark().is_inline_type(); }
+ #ifdef _LP64
+ bool oopDesc::is_flatArray() const {
+ markWord mrk = mark();
+ return (mrk.is_unlocked()) ? mrk.is_flat_array() : klass()->is_flatArray_klass();
+ }
+ bool oopDesc::is_null_free_array() const {
+ markWord mrk = mark();
+ return (mrk.is_unlocked()) ? mrk.is_null_free_array() : klass()->is_null_free_array_klass();
+ }
+ #else
+ bool oopDesc::is_flatArray() const { return klass()->is_flatArray_klass(); }
+ bool oopDesc::is_null_free_array() const { return klass()->is_null_free_array_klass(); }
+ #endif
template<typename T>
T* oopDesc::field_addr(int offset) const { return reinterpret_cast<T*>(cast_from_oop<intptr_t>(as_oop()) + offset); }
template <typename T>
< prev index next >