78 const volatile narrowKlass* addr = &_metadata._compressed_klass;
79 volatile narrowKlass* xaddr = const_cast<volatile narrowKlass*>(addr);
80 return Klass::decode_klass(OrderAccess::load_acquire(xaddr));
81 } else {
82 return OrderAccess::load_acquire(&_metadata._klass);
83 }
84 }
85
86 Klass** oopDesc::klass_addr() {
87 // Only used internally and with CMS and will not work with
88 // UseCompressedOops
89 assert(!UseCompressedClassPointers, "only supported with uncompressed klass pointers");
90 return (Klass**) &_metadata._klass;
91 }
92
93 narrowKlass* oopDesc::compressed_klass_addr() {
94 assert(UseCompressedClassPointers, "only called by compressed klass pointers");
95 return &_metadata._compressed_klass;
96 }
97
98 #define CHECK_SET_KLASS(k) \
99 do { \
100 assert(Universe::is_bootstrapping() || k != NULL, "NULL Klass"); \
101 assert(Universe::is_bootstrapping() || k->is_klass(), "not a Klass"); \
102 } while (0)
103
104 void oopDesc::set_klass(Klass* k) {
105 CHECK_SET_KLASS(k);
106 if (UseCompressedClassPointers) {
107 *compressed_klass_addr() = Klass::encode_klass_not_null(k);
108 } else {
109 *klass_addr() = k;
110 }
111 }
112
113 void oopDesc::release_set_klass(Klass* k) {
114 CHECK_SET_KLASS(k);
115 if (UseCompressedClassPointers) {
116 OrderAccess::release_store(compressed_klass_addr(),
117 Klass::encode_klass_not_null(k));
|
78 const volatile narrowKlass* addr = &_metadata._compressed_klass;
79 volatile narrowKlass* xaddr = const_cast<volatile narrowKlass*>(addr);
80 return Klass::decode_klass(OrderAccess::load_acquire(xaddr));
81 } else {
82 return OrderAccess::load_acquire(&_metadata._klass);
83 }
84 }
85
86 Klass** oopDesc::klass_addr() {
87 // Only used internally and with CMS and will not work with
88 // UseCompressedOops
89 assert(!UseCompressedClassPointers, "only supported with uncompressed klass pointers");
90 return (Klass**) &_metadata._klass;
91 }
92
93 narrowKlass* oopDesc::compressed_klass_addr() {
94 assert(UseCompressedClassPointers, "only called by compressed klass pointers");
95 return &_metadata._compressed_klass;
96 }
97
98 #if INCLUDE_VBC // fast oop only test (does not load klass)
99 bool oopDesc::klass_is_value_based() {
100 if (UseCompressedClassPointers) {
101 return Klass::decode_ptr_is_value_based(_metadata._compressed_klass);
102 } else {
103 return Klass::ptr_is_value_based(_metadata._klass);
104 }
105 }
106 #endif
107
108 #define CHECK_SET_KLASS(k) \
109 do { \
110 assert(Universe::is_bootstrapping() || k != NULL, "NULL Klass"); \
111 assert(Universe::is_bootstrapping() || k->is_klass(), "not a Klass"); \
112 } while (0)
113
114 void oopDesc::set_klass(Klass* k) {
115 CHECK_SET_KLASS(k);
116 if (UseCompressedClassPointers) {
117 *compressed_klass_addr() = Klass::encode_klass_not_null(k);
118 } else {
119 *klass_addr() = k;
120 }
121 }
122
123 void oopDesc::release_set_klass(Klass* k) {
124 CHECK_SET_KLASS(k);
125 if (UseCompressedClassPointers) {
126 OrderAccess::release_store(compressed_klass_addr(),
127 Klass::encode_klass_not_null(k));
|