< prev index next >
src/hotspot/share/oops/oop.inline.hpp
Print this page
*** 84,117 ****
void oopDesc::init_mark_raw() {
set_mark_raw(markOopDesc::prototype_for_object(this));
}
Klass* oopDesc::klass() const {
if (UseCompressedClassPointers) {
! return Klass::decode_klass_not_null(_metadata._compressed_klass);
} else {
! return _metadata._klass;
}
}
Klass* oopDesc::klass_or_null() const volatile {
if (UseCompressedClassPointers) {
! return Klass::decode_klass(_metadata._compressed_klass);
} else {
! return _metadata._klass;
}
}
Klass* oopDesc::klass_or_null_acquire() const volatile {
if (UseCompressedClassPointers) {
// Workaround for non-const load_acquire parameter.
const volatile narrowKlass* addr = &_metadata._compressed_klass;
volatile narrowKlass* xaddr = const_cast<volatile narrowKlass*>(addr);
! return Klass::decode_klass(OrderAccess::load_acquire(xaddr));
} else {
! return OrderAccess::load_acquire(&_metadata._klass);
}
}
Klass** oopDesc::klass_addr(HeapWord* mem) {
// Only used internally and with CMS and will not work with
--- 84,124 ----
void oopDesc::init_mark_raw() {
set_mark_raw(markOopDesc::prototype_for_object(this));
}
+ narrowKlass oopDesc::compressed_klass_mask() { return ((narrowKlass) 1 << narrow_storage_props_shift) - 1; }
+ uintptr_t oopDesc::klass_mask() { return ((uintptr_t) 1 << wide_storage_props_shift) - 1; }
+
+ narrowKlass oopDesc::compressed_klass_masked(narrowKlass raw) { return raw & compressed_klass_mask(); }
+ Klass* oopDesc::klass_masked(uintptr_t raw) { return reinterpret_cast<Klass*>(raw & klass_mask()); }
+
+
Klass* oopDesc::klass() const {
if (UseCompressedClassPointers) {
! return Klass::decode_klass_not_null(compressed_klass_masked(_metadata._compressed_klass));
} else {
! return klass_masked(_metadata._wide_storage_props);
}
}
Klass* oopDesc::klass_or_null() const volatile {
if (UseCompressedClassPointers) {
! return Klass::decode_klass(compressed_klass_masked(_metadata._compressed_klass));
} else {
! return klass_masked(_metadata._wide_storage_props);
}
}
Klass* oopDesc::klass_or_null_acquire() const volatile {
if (UseCompressedClassPointers) {
// Workaround for non-const load_acquire parameter.
const volatile narrowKlass* addr = &_metadata._compressed_klass;
volatile narrowKlass* xaddr = const_cast<volatile narrowKlass*>(addr);
! return Klass::decode_klass(compressed_klass_masked(OrderAccess::load_acquire(xaddr)));
} else {
! return klass_masked(OrderAccess::load_acquire(&_metadata._wide_storage_props));
}
}
Klass** oopDesc::klass_addr(HeapWord* mem) {
// Only used internally and with CMS and will not work with
*** 119,128 ****
--- 126,141 ----
assert(!UseCompressedClassPointers, "only supported with uncompressed klass pointers");
ByteSize offset = byte_offset_of(oopDesc, _metadata._klass);
return (Klass**) (((char*)mem) + in_bytes(offset));
}
+ uintptr_t* oopDesc::wide_metadata_addr(HeapWord* mem) {
+ assert(!UseCompressedClassPointers, "only supported with uncompressed klass pointers");
+ ByteSize offset = byte_offset_of(oopDesc, _metadata._wide_storage_props);
+ return (uintptr_t*) (((char*)mem) + in_bytes(offset));
+ }
+
narrowKlass* oopDesc::compressed_klass_addr(HeapWord* mem) {
assert(UseCompressedClassPointers, "only called by compressed klass pointers");
ByteSize offset = byte_offset_of(oopDesc, _metadata._compressed_klass);
return (narrowKlass*) (((char*)mem) + in_bytes(offset));
}
*** 137,146 ****
--- 150,161 ----
#define CHECK_SET_KLASS(k) \
do { \
assert(Universe::is_bootstrapping() || k != NULL, "NULL Klass"); \
assert(Universe::is_bootstrapping() || k->is_klass(), "not a Klass"); \
+ assert(((reinterpret_cast<uintptr_t>(k) & (~ oopDesc::klass_mask())) == 0), \
+ "No room for storage props "); \
} while (0)
void oopDesc::set_klass(Klass* k) {
CHECK_SET_KLASS(k);
if (UseCompressedClassPointers) {
*** 156,169 ****
--- 171,214 ----
OrderAccess::release_store(compressed_klass_addr(mem),
Klass::encode_klass_not_null(klass));
} else {
OrderAccess::release_store(klass_addr(mem), klass);
}
+ assert(((oopDesc*)mem)->klass() == klass, "failed oopDesc::klass() encode/decode");
+ }
+
+ void oopDesc::set_metadata(ArrayStorageProperties storage_props, Klass* klass) {
+ CHECK_SET_KLASS(klass);
+ if (UseCompressedClassPointers) {
+ *compressed_klass_addr() = (Klass::encode_klass_not_null(klass) | storage_props.encode<narrowKlass>(narrow_storage_props_shift));
+ } else {
+ *wide_metadata_addr((HeapWord*)this) = (reinterpret_cast<uintptr_t>(klass) | storage_props.encode<uintptr_t>(wide_storage_props_shift));
+ }
}
+ void oopDesc::release_set_metadata(HeapWord* mem, ArrayStorageProperties storage_props, Klass* klass) {
+ CHECK_SET_KLASS(klass);
+ if (UseCompressedClassPointers) {
+ OrderAccess::release_store(oopDesc::compressed_klass_addr(mem),
+ Klass::encode_klass_not_null(klass) | storage_props.encode<narrowKlass>(narrow_storage_props_shift));
+ } else {
+ OrderAccess::release_store(oopDesc::wide_metadata_addr(mem),
+ (reinterpret_cast<uintptr_t>(klass) | storage_props.encode<uintptr_t>(wide_storage_props_shift)));
+ }
+ }
#undef CHECK_SET_KLASS
+
+ ArrayStorageProperties oopDesc::array_storage_properties() const {
+ if (UseCompressedClassPointers) {
+ return ArrayStorageProperties(_metadata._narrow_storage_props >> narrow_storage_props_shift);
+ } else {
+ return ArrayStorageProperties(_metadata._wide_storage_props >> wide_storage_props_shift);
+ }
+ }
+
+
int oopDesc::klass_gap() const {
return *(int*)(((intptr_t)this) + klass_gap_offset_in_bytes());
}
void oopDesc::set_klass_gap(HeapWord* mem, int v) {
< prev index next >