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