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 {
178 return obj->_metadata._klass;
179 }
180 }
181
182 void* oopDesc::load_oop_raw(oop obj, int offset) {
183 uintptr_t addr = (uintptr_t)(void*)obj + (uint)offset;
184 if (UseCompressedOops) {
185 narrowOop narrow_oop = *(narrowOop*)addr;
186 if (CompressedOops::is_null(narrow_oop)) return nullptr;
187 return (void*)CompressedOops::decode_raw(narrow_oop);
188 } else {
189 return *(void**)addr;
190 }
191 }
192
193 oop oopDesc::obj_field_acquire(int offset) const { return HeapAccess<MO_ACQUIRE>::oop_load_at(as_oop(), offset); }
|
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 // Except when using compact headers.
162 return UseCompressedClassPointers && !UseCompactObjectHeaders;
163 }
164
165 #if INCLUDE_CDS_JAVA_HEAP
166 void oopDesc::set_narrow_klass(narrowKlass nk) {
167 assert(CDSConfig::is_dumping_heap(), "Used by CDS only. Do not abuse!");
168 assert(UseCompressedClassPointers, "must be");
169 _metadata._compressed_klass = nk;
170 }
171 #endif
172
173 void* oopDesc::load_klass_raw(oop obj) {
174 if (UseCompactObjectHeaders) {
175 return obj->klass();
176 } else if (UseCompressedClassPointers) {
177 narrowKlass narrow_klass = obj->_metadata._compressed_klass;
178 if (narrow_klass == 0) return nullptr;
179 return (void*)CompressedKlassPointers::decode_raw(narrow_klass);
180 } else {
181 return obj->_metadata._klass;
182 }
183 }
184
185 void* oopDesc::load_oop_raw(oop obj, int offset) {
186 uintptr_t addr = (uintptr_t)(void*)obj + (uint)offset;
187 if (UseCompressedOops) {
188 narrowOop narrow_oop = *(narrowOop*)addr;
189 if (CompressedOops::is_null(narrow_oop)) return nullptr;
190 return (void*)CompressedOops::decode_raw(narrow_oop);
191 } else {
192 return *(void**)addr;
193 }
194 }
195
196 oop oopDesc::obj_field_acquire(int offset) const { return HeapAccess<MO_ACQUIRE>::oop_load_at(as_oop(), offset); }
|