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