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); } |