< 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,516 ---- 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() const { + return mark_must_be_preserved(mark_raw()); + } + + 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 >