< prev index next >
src/hotspot/share/oops/oop.inline.hpp
Print this page
@@ -80,15 +80,15 @@
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));
+ set_mark(markWord::prototype_for_klass(klass()));
}
void oopDesc::init_mark_raw() {
- set_mark_raw(markWord::prototype_for_object(this));
+ set_mark_raw(markWord::prototype_for_klass(klass()));
}
Klass* oopDesc::klass() const {
if (UseCompressedClassPointers) {
return CompressedKlassPointers::decode_not_null(_metadata._compressed_klass);
@@ -481,6 +481,32 @@
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 >