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
|