< prev index next >
src/hotspot/share/oops/oop.inline.hpp
Print this page
*** 80,94 ****
markWord oopDesc::cas_set_mark_raw(markWord new_mark, markWord old_mark, atomic_memory_order order) {
return Atomic::cmpxchg(new_mark, &_mark, old_mark, order);
}
void oopDesc::init_mark() {
! set_mark(markWord::prototype_for_object(this));
}
void oopDesc::init_mark_raw() {
! set_mark_raw(markWord::prototype_for_object(this));
}
Klass* oopDesc::klass() const {
if (UseCompressedClassPointers) {
return CompressedKlassPointers::decode_not_null(_metadata._compressed_klass);
--- 80,94 ----
markWord oopDesc::cas_set_mark_raw(markWord new_mark, markWord old_mark, atomic_memory_order order) {
return Atomic::cmpxchg(new_mark, &_mark, old_mark, order);
}
void oopDesc::init_mark() {
! set_mark(markWord::prototype_for_klass(klass()));
}
void oopDesc::init_mark_raw() {
! set_mark_raw(markWord::prototype_for_klass(klass()));
}
Klass* oopDesc::klass() const {
if (UseCompressedClassPointers) {
return CompressedKlassPointers::decode_not_null(_metadata._compressed_klass);
*** 481,486 ****
--- 481,512 ----
void oopDesc::set_displaced_mark_raw(markWord m) {
mark_raw().set_displaced_mark_helper(m);
}
+ // Supports deferred calling of obj->klass().
+ class DeferredObjectToKlass {
+ const oopDesc* _obj;
+
+ public:
+ DeferredObjectToKlass(const oopDesc* obj) : _obj(obj) {}
+
+ // Implicitly convertible to const Klass*.
+ operator const Klass*() const {
+ return _obj->klass();
+ }
+ };
+
+ bool oopDesc::mark_must_be_preserved(markWord m) const {
+ // There's a circular dependency between oop.inline.hpp and
+ // markWord.inline.hpp because markWord::must_be_preserved wants to call
+ // oopDesc::klass(). This could be solved by calling klass() here. However,
+ // not all paths inside must_be_preserved calls klass(). Defer the call until
+ // the klass is actually needed.
+ return m.must_be_preserved(DeferredObjectToKlass(this));
+ }
+
+ bool oopDesc::mark_must_be_preserved_for_promotion_failure(markWord m) const {
+ return m.must_be_preserved_for_promotion_failure(DeferredObjectToKlass(this));
+ }
+
#endif // SHARE_OOPS_OOP_INLINE_HPP
< prev index next >