< prev index next >

src/hotspot/share/oops/oop.cpp

Print this page

137 VerifyOopClosure VerifyOopClosure::verify_oop;
138 
139 template <class T> void VerifyOopClosure::do_oop_work(T* p) {
140   oop obj = RawAccess<>::oop_load(p);
141   guarantee(oopDesc::is_oop_or_null(obj), "invalid oop: " PTR_FORMAT, p2i(obj));
142 }
143 
144 void VerifyOopClosure::do_oop(oop* p)       { VerifyOopClosure::do_oop_work(p); }
145 void VerifyOopClosure::do_oop(narrowOop* p) { VerifyOopClosure::do_oop_work(p); }
146 
147 // type test operations that doesn't require inclusion of oop.inline.hpp.
148 bool oopDesc::is_instance_noinline()    const { return is_instance();    }
149 bool oopDesc::is_instanceRef_noinline() const { return is_instanceRef(); }
150 bool oopDesc::is_stackChunk_noinline()  const { return is_stackChunk();  }
151 bool oopDesc::is_array_noinline()       const { return is_array();       }
152 bool oopDesc::is_objArray_noinline()    const { return is_objArray();    }
153 bool oopDesc::is_typeArray_noinline()   const { return is_typeArray();   }
154 
155 bool oopDesc::has_klass_gap() {
156   // Only has a klass gap when compressed class pointers are used.
157   return UseCompressedClassPointers;

158 }
159 
160 #if INCLUDE_CDS_JAVA_HEAP
161 void oopDesc::set_narrow_klass(narrowKlass nk) {
162   assert(CDSConfig::is_dumping_heap(), "Used by CDS only. Do not abuse!");
163   assert(UseCompressedClassPointers, "must be");
164   _metadata._compressed_klass = nk;
165 }
166 #endif
167 
168 void* oopDesc::load_klass_raw(oop obj) {
169   if (UseCompressedClassPointers) {


170     narrowKlass narrow_klass = obj->_metadata._compressed_klass;
171     if (narrow_klass == 0) return nullptr;
172     return (void*)CompressedKlassPointers::decode_raw(narrow_klass);
173   } else {
174     return obj->_metadata._klass;
175   }
176 }
177 
178 void* oopDesc::load_oop_raw(oop obj, int offset) {
179   uintptr_t addr = (uintptr_t)(void*)obj + (uint)offset;
180   if (UseCompressedOops) {
181     narrowOop narrow_oop = *(narrowOop*)addr;
182     if (CompressedOops::is_null(narrow_oop)) return nullptr;
183     return (void*)CompressedOops::decode_raw(narrow_oop);
184   } else {
185     return *(void**)addr;
186   }
187 }
188 
189 oop oopDesc::obj_field_acquire(int offset) const                      { return HeapAccess<MO_ACQUIRE>::oop_load_at(as_oop(), offset); }

137 VerifyOopClosure VerifyOopClosure::verify_oop;
138 
139 template <class T> void VerifyOopClosure::do_oop_work(T* p) {
140   oop obj = RawAccess<>::oop_load(p);
141   guarantee(oopDesc::is_oop_or_null(obj), "invalid oop: " PTR_FORMAT, p2i(obj));
142 }
143 
144 void VerifyOopClosure::do_oop(oop* p)       { VerifyOopClosure::do_oop_work(p); }
145 void VerifyOopClosure::do_oop(narrowOop* p) { VerifyOopClosure::do_oop_work(p); }
146 
147 // type test operations that doesn't require inclusion of oop.inline.hpp.
148 bool oopDesc::is_instance_noinline()    const { return is_instance();    }
149 bool oopDesc::is_instanceRef_noinline() const { return is_instanceRef(); }
150 bool oopDesc::is_stackChunk_noinline()  const { return is_stackChunk();  }
151 bool oopDesc::is_array_noinline()       const { return is_array();       }
152 bool oopDesc::is_objArray_noinline()    const { return is_objArray();    }
153 bool oopDesc::is_typeArray_noinline()   const { return is_typeArray();   }
154 
155 bool oopDesc::has_klass_gap() {
156   // Only has a klass gap when compressed class pointers are used.
157   // Except when using compact headers.
158   return UseCompressedClassPointers && !UseCompactObjectHeaders;
159 }
160 
161 #if INCLUDE_CDS_JAVA_HEAP
162 void oopDesc::set_narrow_klass(narrowKlass nk) {
163   assert(CDSConfig::is_dumping_heap(), "Used by CDS only. Do not abuse!");
164   assert(UseCompressedClassPointers, "must be");
165   _metadata._compressed_klass = nk;
166 }
167 #endif
168 
169 void* oopDesc::load_klass_raw(oop obj) {
170   if (UseCompactObjectHeaders) {
171     return obj->klass();
172   } else if (UseCompressedClassPointers) {
173     narrowKlass narrow_klass = obj->_metadata._compressed_klass;
174     if (narrow_klass == 0) return nullptr;
175     return (void*)CompressedKlassPointers::decode_raw(narrow_klass);
176   } else {
177     return obj->_metadata._klass;
178   }
179 }
180 
181 void* oopDesc::load_oop_raw(oop obj, int offset) {
182   uintptr_t addr = (uintptr_t)(void*)obj + (uint)offset;
183   if (UseCompressedOops) {
184     narrowOop narrow_oop = *(narrowOop*)addr;
185     if (CompressedOops::is_null(narrow_oop)) return nullptr;
186     return (void*)CompressedOops::decode_raw(narrow_oop);
187   } else {
188     return *(void**)addr;
189   }
190 }
191 
192 oop oopDesc::obj_field_acquire(int offset) const                      { return HeapAccess<MO_ACQUIRE>::oop_load_at(as_oop(), offset); }
< prev index next >