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