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)); | 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 } while (0) 114 115 void oopDesc::set_klass(Klass* k) { 116 CHECK_SET_KLASS(k); 117 if (UseCompressedClassPointers) { 118 *compressed_klass_addr() = Klass::encode_klass_not_null(k); 119 } else { 120 *klass_addr() = k; 121 } 122 } 123 124 void oopDesc::release_set_klass(Klass* k) { 125 CHECK_SET_KLASS(k); 126 if (UseCompressedClassPointers) { 127 OrderAccess::release_store(compressed_klass_addr(), 128 Klass::encode_klass_not_null(k)); |