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