src/hotspot/share/oops/oop.cpp
changeset 52014 1aa9beac610e
parent 51796 9d3a00c8c047
child 52062 8dbf1a13af49
equal deleted inserted replaced
52013:92383597fa21 52014:1aa9beac610e
   169 bool oopDesc::has_klass_gap() {
   169 bool oopDesc::has_klass_gap() {
   170   // Only has a klass gap when compressed class pointers are used.
   170   // Only has a klass gap when compressed class pointers are used.
   171   return UseCompressedClassPointers;
   171   return UseCompressedClassPointers;
   172 }
   172 }
   173 
   173 
       
   174 oop oopDesc::decode_oop_raw(narrowOop narrow_oop) {
       
   175   return (oop)(void*)( (uintptr_t)Universe::narrow_oop_base() +
       
   176                       ((uintptr_t)narrow_oop << Universe::narrow_oop_shift()));
       
   177 }
       
   178 
       
   179 void* oopDesc::load_klass_raw(oop obj) {
       
   180   if (UseCompressedClassPointers) {
       
   181     narrowKlass narrow_klass = *(obj->compressed_klass_addr());
       
   182     if (narrow_klass == 0) return NULL;
       
   183     return (void*)Klass::decode_klass_raw(narrow_klass);
       
   184   } else {
       
   185     return *(void**)(obj->klass_addr());
       
   186   }
       
   187 }
       
   188 
       
   189 void* oopDesc::load_oop_raw(oop obj, int offset) {
       
   190   uintptr_t addr = (uintptr_t)(void*)obj + (uint)offset;
       
   191   if (UseCompressedOops) {
       
   192     narrowOop narrow_oop = *(narrowOop*)addr;
       
   193     if (narrow_oop == 0) return NULL;
       
   194     return (void*)decode_oop_raw(narrow_oop);
       
   195   } else {
       
   196     return *(void**)addr;
       
   197   }
       
   198 }
       
   199 
       
   200 bool oopDesc::is_valid(oop obj) {
       
   201   if (!is_object_aligned(obj)) return false;
       
   202   if ((size_t)(oopDesc*)obj < os::min_page_size()) return false;
       
   203 
       
   204   // We need at least the mark and the klass word in the committed region.
       
   205   if (!os::is_readable_range(obj, (oopDesc*)obj + 1)) return false;
       
   206   if (!Universe::heap()->is_in(obj)) return false;
       
   207 
       
   208   Klass* k = (Klass*)load_klass_raw(obj);
       
   209 
       
   210   if (!os::is_readable_range(k, k + 1)) return false;
       
   211   return MetaspaceUtils::is_range_in_committed(k, k + 1);
       
   212 }
       
   213 
       
   214 oop oopDesc::oop_or_null(address addr) {
       
   215   if (is_valid(oop(addr))) {
       
   216     // We were just given an oop directly.
       
   217     return oop(addr);
       
   218   }
       
   219 
       
   220   // Try to find addr using block_start.
       
   221   HeapWord* p = Universe::heap()->block_start(addr);
       
   222   if (p != NULL && Universe::heap()->block_is_obj(p)) {
       
   223     if (!is_valid(oop(p))) return NULL;
       
   224     return oop(p);
       
   225   }
       
   226 
       
   227   // If we can't find it it just may mean that heap wasn't parsable.
       
   228   return NULL;
       
   229 }
       
   230 
   174 oop oopDesc::obj_field_acquire(int offset) const                      { return HeapAccess<MO_ACQUIRE>::oop_load_at(as_oop(), offset); }
   231 oop oopDesc::obj_field_acquire(int offset) const                      { return HeapAccess<MO_ACQUIRE>::oop_load_at(as_oop(), offset); }
   175 
   232 
   176 void oopDesc::obj_field_put_raw(int offset, oop value)                { RawAccess<>::oop_store_at(as_oop(), offset, value); }
   233 void oopDesc::obj_field_put_raw(int offset, oop value)                { RawAccess<>::oop_store_at(as_oop(), offset, value); }
   177 void oopDesc::release_obj_field_put(int offset, oop value)            { HeapAccess<MO_RELEASE>::oop_store_at(as_oop(), offset, value); }
   234 void oopDesc::release_obj_field_put(int offset, oop value)            { HeapAccess<MO_RELEASE>::oop_store_at(as_oop(), offset, value); }
   178 void oopDesc::obj_field_put_volatile(int offset, oop value)           { HeapAccess<MO_SEQ_CST>::oop_store_at(as_oop(), offset, value); }
   235 void oopDesc::obj_field_put_volatile(int offset, oop value)           { HeapAccess<MO_SEQ_CST>::oop_store_at(as_oop(), offset, value); }