132 }
133 return LockingMode == LM_LIGHTWEIGHT || !SafepointSynchronize::is_at_safepoint();
134 }
135
136 // used only for asserts and guarantees
137 bool oopDesc::is_oop_or_null(oop obj, bool ignore_mark_word) {
138 return obj == nullptr ? true : is_oop(obj, ignore_mark_word);
139 }
140
141 VerifyOopClosure VerifyOopClosure::verify_oop;
142
143 template <class T> void VerifyOopClosure::do_oop_work(T* p) {
144 oop obj = RawAccess<>::oop_load(p);
145 guarantee(oopDesc::is_oop_or_null(obj), "invalid oop: " PTR_FORMAT, p2i(obj));
146 }
147
148 void VerifyOopClosure::do_oop(oop* p) { VerifyOopClosure::do_oop_work(p); }
149 void VerifyOopClosure::do_oop(narrowOop* p) { VerifyOopClosure::do_oop_work(p); }
150
151 // type test operations that doesn't require inclusion of oop.inline.hpp.
152 bool oopDesc::is_instance_noinline() const { return is_instance(); }
153 bool oopDesc::is_instanceRef_noinline() const { return is_instanceRef(); }
154 bool oopDesc::is_stackChunk_noinline() const { return is_stackChunk(); }
155 bool oopDesc::is_array_noinline() const { return is_array(); }
156 bool oopDesc::is_objArray_noinline() const { return is_objArray(); }
157 bool oopDesc::is_typeArray_noinline() const { return is_typeArray(); }
158
159 bool oopDesc::has_klass_gap() {
160 // Only has a klass gap when compressed class pointers are used.
161 return UseCompressedClassPointers;
162 }
163
164 #if INCLUDE_CDS_JAVA_HEAP
165 void oopDesc::set_narrow_klass(narrowKlass nk) {
166 assert(CDSConfig::is_dumping_heap(), "Used by CDS only. Do not abuse!");
167 assert(UseCompressedClassPointers, "must be");
168 _metadata._compressed_klass = nk;
169 }
170 #endif
171
172 void* oopDesc::load_klass_raw(oop obj) {
173 if (UseCompressedClassPointers) {
174 narrowKlass narrow_klass = obj->_metadata._compressed_klass;
175 if (narrow_klass == 0) return nullptr;
176 return (void*)CompressedKlassPointers::decode_raw(narrow_klass);
177 } else {
|
132 }
133 return LockingMode == LM_LIGHTWEIGHT || !SafepointSynchronize::is_at_safepoint();
134 }
135
136 // used only for asserts and guarantees
137 bool oopDesc::is_oop_or_null(oop obj, bool ignore_mark_word) {
138 return obj == nullptr ? true : is_oop(obj, ignore_mark_word);
139 }
140
141 VerifyOopClosure VerifyOopClosure::verify_oop;
142
143 template <class T> void VerifyOopClosure::do_oop_work(T* p) {
144 oop obj = RawAccess<>::oop_load(p);
145 guarantee(oopDesc::is_oop_or_null(obj), "invalid oop: " PTR_FORMAT, p2i(obj));
146 }
147
148 void VerifyOopClosure::do_oop(oop* p) { VerifyOopClosure::do_oop_work(p); }
149 void VerifyOopClosure::do_oop(narrowOop* p) { VerifyOopClosure::do_oop_work(p); }
150
151 // type test operations that doesn't require inclusion of oop.inline.hpp.
152 bool oopDesc::is_instance_noinline() const { return is_instance(); }
153 bool oopDesc::is_instanceRef_noinline() const { return is_instanceRef(); }
154 bool oopDesc::is_stackChunk_noinline() const { return is_stackChunk(); }
155 bool oopDesc::is_array_noinline() const { return is_array(); }
156 bool oopDesc::is_objArray_noinline() const { return is_objArray(); }
157 bool oopDesc::is_typeArray_noinline() const { return is_typeArray(); }
158 bool oopDesc::is_flatArray_noinline() const { return is_flatArray(); }
159 bool oopDesc::is_null_free_array_noinline() const { return is_null_free_array(); }
160
161 bool oopDesc::has_klass_gap() {
162 // Only has a klass gap when compressed class pointers are used.
163 return UseCompressedClassPointers;
164 }
165
166 #if INCLUDE_CDS_JAVA_HEAP
167 void oopDesc::set_narrow_klass(narrowKlass nk) {
168 assert(CDSConfig::is_dumping_heap(), "Used by CDS only. Do not abuse!");
169 assert(UseCompressedClassPointers, "must be");
170 _metadata._compressed_klass = nk;
171 }
172 #endif
173
174 void* oopDesc::load_klass_raw(oop obj) {
175 if (UseCompressedClassPointers) {
176 narrowKlass narrow_klass = obj->_metadata._compressed_klass;
177 if (narrow_klass == 0) return nullptr;
178 return (void*)CompressedKlassPointers::decode_raw(narrow_klass);
179 } else {
|