< prev index next >

src/hotspot/share/oops/oop.cpp

Print this page

 66 
 67 char* oopDesc::print_string() {
 68   stringStream st;
 69   print_on(&st);
 70   return st.as_string();
 71 }
 72 
 73 void oopDesc::print_value() {
 74   print_value_on(tty);
 75 }
 76 
 77 char* oopDesc::print_value_string() {
 78   char buf[100];
 79   stringStream st(buf, sizeof(buf));
 80   print_value_on(&st);
 81   return st.as_string();
 82 }
 83 
 84 void oopDesc::print_value_on(outputStream* st) const {
 85   oop obj = const_cast<oopDesc*>(this);
 86   if (java_lang_String::is_instance(obj)) {
 87     java_lang_String::print(obj, st);
 88     print_address_on(st);
 89   } else {
 90     Klass* k = klass_without_asserts();
 91     if (k == nullptr) {
 92       st->print("null klass");
 93     } else if (!Metaspace::contains(k)) {
 94       st->print("klass not in Metaspace");
 95     } else if (!k->is_klass()) {
 96       st->print("klass not a Klass");
 97     } else {
 98       k->oop_print_value_on(obj, st);
 99     }
100   }
101 }
102 
103 
104 void oopDesc::verify_on(outputStream* st, oopDesc* oop_desc) {
105   if (oop_desc != nullptr) {
106     oop_desc->klass()->oop_verify_on(oop_desc, st);

122 bool oopDesc::is_oop(oop obj) {
123   return Universe::heap()->is_oop(obj);
124 }
125 
126 // used only for asserts and guarantees
127 bool oopDesc::is_oop_or_null(oop obj) {
128   return obj == nullptr ? true : is_oop(obj);
129 }
130 
131 VerifyOopClosure VerifyOopClosure::verify_oop;
132 
133 template <class T> void VerifyOopClosure::do_oop_work(T* p) {
134   oop obj = RawAccess<>::oop_load(p);
135   guarantee(oopDesc::is_oop_or_null(obj), "invalid oop: " PTR_FORMAT, p2i(obj));
136 }
137 
138 void VerifyOopClosure::do_oop(oop* p)       { VerifyOopClosure::do_oop_work(p); }
139 void VerifyOopClosure::do_oop(narrowOop* p) { VerifyOopClosure::do_oop_work(p); }
140 
141 // type test operations that doesn't require inclusion of oop.inline.hpp.
142 bool oopDesc::is_instance_noinline()    const { return is_instance();    }
143 bool oopDesc::is_instanceRef_noinline() const { return is_instanceRef(); }
144 bool oopDesc::is_stackChunk_noinline()  const { return is_stackChunk();  }
145 bool oopDesc::is_array_noinline()       const { return is_array();       }
146 bool oopDesc::is_objArray_noinline()    const { return is_objArray();    }
147 bool oopDesc::is_typeArray_noinline()   const { return is_typeArray();   }



148 
149 #if INCLUDE_CDS_JAVA_HEAP
150 void oopDesc::set_narrow_klass(narrowKlass nk) {
151   assert(CDSConfig::is_dumping_heap(), "Used by CDS only. Do not abuse!");
152   assert(UseCompressedClassPointers, "must be");
153   _metadata._compressed_klass = nk;
154 }
155 #endif
156 
157 void* oopDesc::load_oop_raw(oop obj, int offset) {
158   uintptr_t addr = (uintptr_t)(void*)obj + (uint)offset;
159   if (UseCompressedOops) {
160     narrowOop narrow_oop = *(narrowOop*)addr;
161     if (CompressedOops::is_null(narrow_oop)) return nullptr;
162     return (void*)CompressedOops::decode_raw(narrow_oop);
163   } else {
164     return *(void**)addr;
165   }
166 }
167 

 66 
 67 char* oopDesc::print_string() {
 68   stringStream st;
 69   print_on(&st);
 70   return st.as_string();
 71 }
 72 
 73 void oopDesc::print_value() {
 74   print_value_on(tty);
 75 }
 76 
 77 char* oopDesc::print_value_string() {
 78   char buf[100];
 79   stringStream st(buf, sizeof(buf));
 80   print_value_on(&st);
 81   return st.as_string();
 82 }
 83 
 84 void oopDesc::print_value_on(outputStream* st) const {
 85   oop obj = const_cast<oopDesc*>(this);
 86   if (java_lang_String::is_instance_without_asserts(obj)) {
 87     java_lang_String::print(obj, st);
 88     print_address_on(st);
 89   } else {
 90     Klass* k = klass_without_asserts();
 91     if (k == nullptr) {
 92       st->print("null klass");
 93     } else if (!Metaspace::contains(k)) {
 94       st->print("klass not in Metaspace");
 95     } else if (!k->is_klass()) {
 96       st->print("klass not a Klass");
 97     } else {
 98       k->oop_print_value_on(obj, st);
 99     }
100   }
101 }
102 
103 
104 void oopDesc::verify_on(outputStream* st, oopDesc* oop_desc) {
105   if (oop_desc != nullptr) {
106     oop_desc->klass()->oop_verify_on(oop_desc, st);

122 bool oopDesc::is_oop(oop obj) {
123   return Universe::heap()->is_oop(obj);
124 }
125 
126 // used only for asserts and guarantees
127 bool oopDesc::is_oop_or_null(oop obj) {
128   return obj == nullptr ? true : is_oop(obj);
129 }
130 
131 VerifyOopClosure VerifyOopClosure::verify_oop;
132 
133 template <class T> void VerifyOopClosure::do_oop_work(T* p) {
134   oop obj = RawAccess<>::oop_load(p);
135   guarantee(oopDesc::is_oop_or_null(obj), "invalid oop: " PTR_FORMAT, p2i(obj));
136 }
137 
138 void VerifyOopClosure::do_oop(oop* p)       { VerifyOopClosure::do_oop_work(p); }
139 void VerifyOopClosure::do_oop(narrowOop* p) { VerifyOopClosure::do_oop_work(p); }
140 
141 // type test operations that doesn't require inclusion of oop.inline.hpp.
142 bool oopDesc::is_instance_noinline()        const { return is_instance();         }
143 bool oopDesc::is_instanceRef_noinline()     const { return is_instanceRef();      }
144 bool oopDesc::is_stackChunk_noinline()      const { return is_stackChunk();       }
145 bool oopDesc::is_array_noinline()           const { return is_array();            }
146 bool oopDesc::is_objArray_noinline()        const { return is_objArray();         }
147 bool oopDesc::is_refArray_noinline()        const { return is_refArray();         }
148 bool oopDesc::is_typeArray_noinline()       const { return is_typeArray();        }
149 bool oopDesc::is_flatArray_noinline()       const { return is_flatArray();        }
150 bool oopDesc::is_null_free_array_noinline() const { return is_null_free_array();  }
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 
< prev index next >