| 1 | /* | 
|---|
| 2 | * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved. | 
|---|
| 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 
|---|
| 4 | * | 
|---|
| 5 | * This code is free software; you can redistribute it and/or modify it | 
|---|
| 6 | * under the terms of the GNU General Public License version 2 only, as | 
|---|
| 7 | * published by the Free Software Foundation. | 
|---|
| 8 | * | 
|---|
| 9 | * This code is distributed in the hope that it will be useful, but WITHOUT | 
|---|
| 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
|---|
| 11 | * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License | 
|---|
| 12 | * version 2 for more details (a copy is included in the LICENSE file that | 
|---|
| 13 | * accompanied this code). | 
|---|
| 14 | * | 
|---|
| 15 | * You should have received a copy of the GNU General Public License version | 
|---|
| 16 | * 2 along with this work; if not, write to the Free Software Foundation, | 
|---|
| 17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | 
|---|
| 18 | * | 
|---|
| 19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | 
|---|
| 20 | * or visit www.oracle.com if you need additional information or have any | 
|---|
| 21 | * questions. | 
|---|
| 22 | * | 
|---|
| 23 | */ | 
|---|
| 24 |  | 
|---|
| 25 | #include "precompiled.hpp" | 
|---|
| 26 | #include "classfile/classLoaderData.inline.hpp" | 
|---|
| 27 | #include "classfile/classLoaderDataGraph.inline.hpp" | 
|---|
| 28 | #include "classfile/dictionary.hpp" | 
|---|
| 29 | #include "classfile/javaClasses.hpp" | 
|---|
| 30 | #include "classfile/moduleEntry.hpp" | 
|---|
| 31 | #include "classfile/systemDictionary.hpp" | 
|---|
| 32 | #include "classfile/vmSymbols.hpp" | 
|---|
| 33 | #include "gc/shared/collectedHeap.inline.hpp" | 
|---|
| 34 | #include "logging/log.hpp" | 
|---|
| 35 | #include "memory/heapInspection.hpp" | 
|---|
| 36 | #include "memory/heapShared.hpp" | 
|---|
| 37 | #include "memory/metadataFactory.hpp" | 
|---|
| 38 | #include "memory/metaspaceClosure.hpp" | 
|---|
| 39 | #include "memory/metaspaceShared.hpp" | 
|---|
| 40 | #include "memory/oopFactory.hpp" | 
|---|
| 41 | #include "memory/resourceArea.hpp" | 
|---|
| 42 | #include "memory/universe.hpp" | 
|---|
| 43 | #include "oops/compressedOops.inline.hpp" | 
|---|
| 44 | #include "oops/instanceKlass.hpp" | 
|---|
| 45 | #include "oops/klass.inline.hpp" | 
|---|
| 46 | #include "oops/oop.inline.hpp" | 
|---|
| 47 | #include "oops/oopHandle.inline.hpp" | 
|---|
| 48 | #include "runtime/atomic.hpp" | 
|---|
| 49 | #include "runtime/handles.inline.hpp" | 
|---|
| 50 | #include "runtime/orderAccess.hpp" | 
|---|
| 51 | #include "utilities/macros.hpp" | 
|---|
| 52 | #include "utilities/stack.inline.hpp" | 
|---|
| 53 |  | 
|---|
| 54 | void Klass::set_java_mirror(Handle m) { | 
|---|
| 55 | assert(!m.is_null(), "New mirror should never be null."); | 
|---|
| 56 | assert(_java_mirror.resolve() == NULL, "should only be used to initialize mirror"); | 
|---|
| 57 | _java_mirror = class_loader_data()->add_handle(m); | 
|---|
| 58 | } | 
|---|
| 59 |  | 
|---|
| 60 | oop Klass::java_mirror() const { | 
|---|
| 61 | return _java_mirror.resolve(); | 
|---|
| 62 | } | 
|---|
| 63 |  | 
|---|
| 64 | oop Klass::java_mirror_no_keepalive() const { | 
|---|
| 65 | return _java_mirror.peek(); | 
|---|
| 66 | } | 
|---|
| 67 |  | 
|---|
| 68 | bool Klass::is_cloneable() const { | 
|---|
| 69 | return _access_flags.is_cloneable_fast() || | 
|---|
| 70 | is_subtype_of(SystemDictionary::Cloneable_klass()); | 
|---|
| 71 | } | 
|---|
| 72 |  | 
|---|
| 73 | void Klass::set_is_cloneable() { | 
|---|
| 74 | if (name() == vmSymbols::java_lang_invoke_MemberName()) { | 
|---|
| 75 | assert(is_final(), "no subclasses allowed"); | 
|---|
| 76 | // MemberName cloning should not be intrinsified and always happen in JVM_Clone. | 
|---|
| 77 | } else if (is_instance_klass() && InstanceKlass::cast(this)->reference_type() != REF_NONE) { | 
|---|
| 78 | // Reference cloning should not be intrinsified and always happen in JVM_Clone. | 
|---|
| 79 | } else { | 
|---|
| 80 | _access_flags.set_is_cloneable_fast(); | 
|---|
| 81 | } | 
|---|
| 82 | } | 
|---|
| 83 |  | 
|---|
| 84 | void Klass::set_name(Symbol* n) { | 
|---|
| 85 | _name = n; | 
|---|
| 86 | if (_name != NULL) _name->increment_refcount(); | 
|---|
| 87 | } | 
|---|
| 88 |  | 
|---|
| 89 | bool Klass::is_subclass_of(const Klass* k) const { | 
|---|
| 90 | // Run up the super chain and check | 
|---|
| 91 | if (this == k) return true; | 
|---|
| 92 |  | 
|---|
| 93 | Klass* t = const_cast<Klass*>(this)->super(); | 
|---|
| 94 |  | 
|---|
| 95 | while (t != NULL) { | 
|---|
| 96 | if (t == k) return true; | 
|---|
| 97 | t = t->super(); | 
|---|
| 98 | } | 
|---|
| 99 | return false; | 
|---|
| 100 | } | 
|---|
| 101 |  | 
|---|
| 102 | bool Klass::search_secondary_supers(Klass* k) const { | 
|---|
| 103 | // Put some extra logic here out-of-line, before the search proper. | 
|---|
| 104 | // This cuts down the size of the inline method. | 
|---|
| 105 |  | 
|---|
| 106 | // This is necessary, since I am never in my own secondary_super list. | 
|---|
| 107 | if (this == k) | 
|---|
| 108 | return true; | 
|---|
| 109 | // Scan the array-of-objects for a match | 
|---|
| 110 | int cnt = secondary_supers()->length(); | 
|---|
| 111 | for (int i = 0; i < cnt; i++) { | 
|---|
| 112 | if (secondary_supers()->at(i) == k) { | 
|---|
| 113 | ((Klass*)this)->set_secondary_super_cache(k); | 
|---|
| 114 | return true; | 
|---|
| 115 | } | 
|---|
| 116 | } | 
|---|
| 117 | return false; | 
|---|
| 118 | } | 
|---|
| 119 |  | 
|---|
| 120 | // Return self, except for abstract classes with exactly 1 | 
|---|
| 121 | // implementor.  Then return the 1 concrete implementation. | 
|---|
| 122 | Klass *Klass::up_cast_abstract() { | 
|---|
| 123 | Klass *r = this; | 
|---|
| 124 | while( r->is_abstract() ) {   // Receiver is abstract? | 
|---|
| 125 | Klass *s = r->subklass();   // Check for exactly 1 subklass | 
|---|
| 126 | if (s == NULL || s->next_sibling() != NULL) // Oops; wrong count; give up | 
|---|
| 127 | return this;              // Return 'this' as a no-progress flag | 
|---|
| 128 | r = s;                    // Loop till find concrete class | 
|---|
| 129 | } | 
|---|
| 130 | return r;                   // Return the 1 concrete class | 
|---|
| 131 | } | 
|---|
| 132 |  | 
|---|
| 133 | // Find LCA in class hierarchy | 
|---|
| 134 | Klass *Klass::LCA( Klass *k2 ) { | 
|---|
| 135 | Klass *k1 = this; | 
|---|
| 136 | while( 1 ) { | 
|---|
| 137 | if( k1->is_subtype_of(k2) ) return k2; | 
|---|
| 138 | if( k2->is_subtype_of(k1) ) return k1; | 
|---|
| 139 | k1 = k1->super(); | 
|---|
| 140 | k2 = k2->super(); | 
|---|
| 141 | } | 
|---|
| 142 | } | 
|---|
| 143 |  | 
|---|
| 144 |  | 
|---|
| 145 | void Klass::check_valid_for_instantiation(bool throwError, TRAPS) { | 
|---|
| 146 | ResourceMark rm(THREAD); | 
|---|
| 147 | THROW_MSG(throwError ? vmSymbols::java_lang_InstantiationError() | 
|---|
| 148 | : vmSymbols::java_lang_InstantiationException(), external_name()); | 
|---|
| 149 | } | 
|---|
| 150 |  | 
|---|
| 151 |  | 
|---|
| 152 | void Klass::copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos, int length, TRAPS) { | 
|---|
| 153 | ResourceMark rm(THREAD); | 
|---|
| 154 | assert(s != NULL, "Throw NPE!"); | 
|---|
| 155 | THROW_MSG(vmSymbols::java_lang_ArrayStoreException(), | 
|---|
| 156 | err_msg( "arraycopy: source type %s is not an array", s->klass()->external_name())); | 
|---|
| 157 | } | 
|---|
| 158 |  | 
|---|
| 159 |  | 
|---|
| 160 | void Klass::initialize(TRAPS) { | 
|---|
| 161 | ShouldNotReachHere(); | 
|---|
| 162 | } | 
|---|
| 163 |  | 
|---|
| 164 | Klass* Klass::find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const { | 
|---|
| 165 | #ifdef ASSERT | 
|---|
| 166 | tty->print_cr( "Error: find_field called on a klass oop." | 
|---|
| 167 | " Likely error: reflection method does not correctly" | 
|---|
| 168 | " wrap return value in a mirror object."); | 
|---|
| 169 | #endif | 
|---|
| 170 | ShouldNotReachHere(); | 
|---|
| 171 | return NULL; | 
|---|
| 172 | } | 
|---|
| 173 |  | 
|---|
| 174 | Method* Klass::uncached_lookup_method(const Symbol* name, const Symbol* signature, | 
|---|
| 175 | OverpassLookupMode overpass_mode, | 
|---|
| 176 | PrivateLookupMode private_mode) const { | 
|---|
| 177 | #ifdef ASSERT | 
|---|
| 178 | tty->print_cr( "Error: uncached_lookup_method called on a klass oop." | 
|---|
| 179 | " Likely error: reflection method does not correctly" | 
|---|
| 180 | " wrap return value in a mirror object."); | 
|---|
| 181 | #endif | 
|---|
| 182 | ShouldNotReachHere(); | 
|---|
| 183 | return NULL; | 
|---|
| 184 | } | 
|---|
| 185 |  | 
|---|
| 186 | void* Klass::operator new(size_t size, ClassLoaderData* loader_data, size_t word_size, TRAPS) throw() { | 
|---|
| 187 | return Metaspace::allocate(loader_data, word_size, MetaspaceObj::ClassType, THREAD); | 
|---|
| 188 | } | 
|---|
| 189 |  | 
|---|
| 190 | // "Normal" instantiation is preceeded by a MetaspaceObj allocation | 
|---|
| 191 | // which zeros out memory - calloc equivalent. | 
|---|
| 192 | // The constructor is also used from CppVtableCloner, | 
|---|
| 193 | // which doesn't zero out the memory before calling the constructor. | 
|---|
| 194 | // Need to set the _java_mirror field explicitly to not hit an assert that the field | 
|---|
| 195 | // should be NULL before setting it. | 
|---|
| 196 | Klass::Klass(KlassID id) : _id(id), | 
|---|
| 197 | _java_mirror(NULL), | 
|---|
| 198 | _prototype_header(markOopDesc::prototype()), | 
|---|
| 199 | _shared_class_path_index(-1) { | 
|---|
| 200 | CDS_ONLY(_shared_class_flags = 0;) | 
|---|
| 201 | CDS_JAVA_HEAP_ONLY(_archived_mirror = 0;) | 
|---|
| 202 | _primary_supers[0] = this; | 
|---|
| 203 | set_super_check_offset(in_bytes(primary_supers_offset())); | 
|---|
| 204 | } | 
|---|
| 205 |  | 
|---|
| 206 | jint Klass::array_layout_helper(BasicType etype) { | 
|---|
| 207 | assert(etype >= T_BOOLEAN && etype <= T_OBJECT, "valid etype"); | 
|---|
| 208 | // Note that T_ARRAY is not allowed here. | 
|---|
| 209 | int  hsize = arrayOopDesc::base_offset_in_bytes(etype); | 
|---|
| 210 | int  esize = type2aelembytes(etype); | 
|---|
| 211 | bool isobj = (etype == T_OBJECT); | 
|---|
| 212 | int  tag   =  isobj ? _lh_array_tag_obj_value : _lh_array_tag_type_value; | 
|---|
| 213 | int lh = array_layout_helper(tag, hsize, etype, exact_log2(esize)); | 
|---|
| 214 |  | 
|---|
| 215 | assert(lh < (int)_lh_neutral_value, "must look like an array layout"); | 
|---|
| 216 | assert(layout_helper_is_array(lh), "correct kind"); | 
|---|
| 217 | assert(layout_helper_is_objArray(lh) == isobj, "correct kind"); | 
|---|
| 218 | assert(layout_helper_is_typeArray(lh) == !isobj, "correct kind"); | 
|---|
| 219 | assert(layout_helper_header_size(lh) == hsize, "correct decode"); | 
|---|
| 220 | assert(layout_helper_element_type(lh) == etype, "correct decode"); | 
|---|
| 221 | assert(1 << layout_helper_log2_element_size(lh) == esize, "correct decode"); | 
|---|
| 222 |  | 
|---|
| 223 | return lh; | 
|---|
| 224 | } | 
|---|
| 225 |  | 
|---|
| 226 | bool Klass::can_be_primary_super_slow() const { | 
|---|
| 227 | if (super() == NULL) | 
|---|
| 228 | return true; | 
|---|
| 229 | else if (super()->super_depth() >= primary_super_limit()-1) | 
|---|
| 230 | return false; | 
|---|
| 231 | else | 
|---|
| 232 | return true; | 
|---|
| 233 | } | 
|---|
| 234 |  | 
|---|
| 235 | void Klass::initialize_supers(Klass* k, Array<InstanceKlass*>* transitive_interfaces, TRAPS) { | 
|---|
| 236 | if (k == NULL) { | 
|---|
| 237 | set_super(NULL); | 
|---|
| 238 | _primary_supers[0] = this; | 
|---|
| 239 | assert(super_depth() == 0, "Object must already be initialized properly"); | 
|---|
| 240 | } else if (k != super() || k == SystemDictionary::Object_klass()) { | 
|---|
| 241 | assert(super() == NULL || super() == SystemDictionary::Object_klass(), | 
|---|
| 242 | "initialize this only once to a non-trivial value"); | 
|---|
| 243 | set_super(k); | 
|---|
| 244 | Klass* sup = k; | 
|---|
| 245 | int sup_depth = sup->super_depth(); | 
|---|
| 246 | juint my_depth  = MIN2(sup_depth + 1, (int)primary_super_limit()); | 
|---|
| 247 | if (!can_be_primary_super_slow()) | 
|---|
| 248 | my_depth = primary_super_limit(); | 
|---|
| 249 | for (juint i = 0; i < my_depth; i++) { | 
|---|
| 250 | _primary_supers[i] = sup->_primary_supers[i]; | 
|---|
| 251 | } | 
|---|
| 252 | Klass* *super_check_cell; | 
|---|
| 253 | if (my_depth < primary_super_limit()) { | 
|---|
| 254 | _primary_supers[my_depth] = this; | 
|---|
| 255 | super_check_cell = &_primary_supers[my_depth]; | 
|---|
| 256 | } else { | 
|---|
| 257 | // Overflow of the primary_supers array forces me to be secondary. | 
|---|
| 258 | super_check_cell = &_secondary_super_cache; | 
|---|
| 259 | } | 
|---|
| 260 | set_super_check_offset((address)super_check_cell - (address) this); | 
|---|
| 261 |  | 
|---|
| 262 | #ifdef ASSERT | 
|---|
| 263 | { | 
|---|
| 264 | juint j = super_depth(); | 
|---|
| 265 | assert(j == my_depth, "computed accessor gets right answer"); | 
|---|
| 266 | Klass* t = this; | 
|---|
| 267 | while (!t->can_be_primary_super()) { | 
|---|
| 268 | t = t->super(); | 
|---|
| 269 | j = t->super_depth(); | 
|---|
| 270 | } | 
|---|
| 271 | for (juint j1 = j+1; j1 < primary_super_limit(); j1++) { | 
|---|
| 272 | assert(primary_super_of_depth(j1) == NULL, "super list padding"); | 
|---|
| 273 | } | 
|---|
| 274 | while (t != NULL) { | 
|---|
| 275 | assert(primary_super_of_depth(j) == t, "super list initialization"); | 
|---|
| 276 | t = t->super(); | 
|---|
| 277 | --j; | 
|---|
| 278 | } | 
|---|
| 279 | assert(j == (juint)-1, "correct depth count"); | 
|---|
| 280 | } | 
|---|
| 281 | #endif | 
|---|
| 282 | } | 
|---|
| 283 |  | 
|---|
| 284 | if (secondary_supers() == NULL) { | 
|---|
| 285 |  | 
|---|
| 286 | // Now compute the list of secondary supertypes. | 
|---|
| 287 | // Secondaries can occasionally be on the super chain, | 
|---|
| 288 | // if the inline "_primary_supers" array overflows. | 
|---|
| 289 | int  = 0; | 
|---|
| 290 | Klass* p; | 
|---|
| 291 | for (p = super(); !(p == NULL || p->can_be_primary_super()); p = p->super()) { | 
|---|
| 292 | ++extras; | 
|---|
| 293 | } | 
|---|
| 294 |  | 
|---|
| 295 | ResourceMark rm(THREAD);  // need to reclaim GrowableArrays allocated below | 
|---|
| 296 |  | 
|---|
| 297 | // Compute the "real" non-extra secondaries. | 
|---|
| 298 | GrowableArray<Klass*>* secondaries = compute_secondary_supers(extras, transitive_interfaces); | 
|---|
| 299 | if (secondaries == NULL) { | 
|---|
| 300 | // secondary_supers set by compute_secondary_supers | 
|---|
| 301 | return; | 
|---|
| 302 | } | 
|---|
| 303 |  | 
|---|
| 304 | GrowableArray<Klass*>* primaries = new GrowableArray<Klass*>(extras); | 
|---|
| 305 |  | 
|---|
| 306 | for (p = super(); !(p == NULL || p->can_be_primary_super()); p = p->super()) { | 
|---|
| 307 | int i;                    // Scan for overflow primaries being duplicates of 2nd'arys | 
|---|
| 308 |  | 
|---|
| 309 | // This happens frequently for very deeply nested arrays: the | 
|---|
| 310 | // primary superclass chain overflows into the secondary.  The | 
|---|
| 311 | // secondary list contains the element_klass's secondaries with | 
|---|
| 312 | // an extra array dimension added.  If the element_klass's | 
|---|
| 313 | // secondary list already contains some primary overflows, they | 
|---|
| 314 | // (with the extra level of array-ness) will collide with the | 
|---|
| 315 | // normal primary superclass overflows. | 
|---|
| 316 | for( i = 0; i < secondaries->length(); i++ ) { | 
|---|
| 317 | if( secondaries->at(i) == p ) | 
|---|
| 318 | break; | 
|---|
| 319 | } | 
|---|
| 320 | if( i < secondaries->length() ) | 
|---|
| 321 | continue;               // It's a dup, don't put it in | 
|---|
| 322 | primaries->push(p); | 
|---|
| 323 | } | 
|---|
| 324 | // Combine the two arrays into a metadata object to pack the array. | 
|---|
| 325 | // The primaries are added in the reverse order, then the secondaries. | 
|---|
| 326 | int new_length = primaries->length() + secondaries->length(); | 
|---|
| 327 | Array<Klass*>* s2 = MetadataFactory::new_array<Klass*>( | 
|---|
| 328 | class_loader_data(), new_length, CHECK); | 
|---|
| 329 | int fill_p = primaries->length(); | 
|---|
| 330 | for (int j = 0; j < fill_p; j++) { | 
|---|
| 331 | s2->at_put(j, primaries->pop());  // add primaries in reverse order. | 
|---|
| 332 | } | 
|---|
| 333 | for( int j = 0; j < secondaries->length(); j++ ) { | 
|---|
| 334 | s2->at_put(j+fill_p, secondaries->at(j));  // add secondaries on the end. | 
|---|
| 335 | } | 
|---|
| 336 |  | 
|---|
| 337 | #ifdef ASSERT | 
|---|
| 338 | // We must not copy any NULL placeholders left over from bootstrap. | 
|---|
| 339 | for (int j = 0; j < s2->length(); j++) { | 
|---|
| 340 | assert(s2->at(j) != NULL, "correct bootstrapping order"); | 
|---|
| 341 | } | 
|---|
| 342 | #endif | 
|---|
| 343 |  | 
|---|
| 344 | set_secondary_supers(s2); | 
|---|
| 345 | } | 
|---|
| 346 | } | 
|---|
| 347 |  | 
|---|
| 348 | GrowableArray<Klass*>* Klass::compute_secondary_supers(int , | 
|---|
| 349 | Array<InstanceKlass*>* transitive_interfaces) { | 
|---|
| 350 | assert(num_extra_slots == 0, "override for complex klasses"); | 
|---|
| 351 | assert(transitive_interfaces == NULL, "sanity"); | 
|---|
| 352 | set_secondary_supers(Universe::the_empty_klass_array()); | 
|---|
| 353 | return NULL; | 
|---|
| 354 | } | 
|---|
| 355 |  | 
|---|
| 356 |  | 
|---|
| 357 | // superklass links | 
|---|
| 358 | InstanceKlass* Klass::superklass() const { | 
|---|
| 359 | assert(super() == NULL || super()->is_instance_klass(), "must be instance klass"); | 
|---|
| 360 | return _super == NULL ? NULL : InstanceKlass::cast(_super); | 
|---|
| 361 | } | 
|---|
| 362 |  | 
|---|
| 363 | // subklass links.  Used by the compiler (and vtable initialization) | 
|---|
| 364 | // May be cleaned concurrently, so must use the Compile_lock. | 
|---|
| 365 | // The log parameter is for clean_weak_klass_links to report unlinked classes. | 
|---|
| 366 | Klass* Klass::subklass(bool log) const { | 
|---|
| 367 | // Need load_acquire on the _subklass, because it races with inserts that | 
|---|
| 368 | // publishes freshly initialized data. | 
|---|
| 369 | for (Klass* chain = OrderAccess::load_acquire(&_subklass); | 
|---|
| 370 | chain != NULL; | 
|---|
| 371 | // Do not need load_acquire on _next_sibling, because inserts never | 
|---|
| 372 | // create _next_sibling edges to dead data. | 
|---|
| 373 | chain = Atomic::load(&chain->_next_sibling)) | 
|---|
| 374 | { | 
|---|
| 375 | if (chain->is_loader_alive()) { | 
|---|
| 376 | return chain; | 
|---|
| 377 | } else if (log) { | 
|---|
| 378 | if (log_is_enabled(Trace, class, unload)) { | 
|---|
| 379 | ResourceMark rm; | 
|---|
| 380 | log_trace(class, unload)( "unlinking class (subclass): %s", chain->external_name()); | 
|---|
| 381 | } | 
|---|
| 382 | } | 
|---|
| 383 | } | 
|---|
| 384 | return NULL; | 
|---|
| 385 | } | 
|---|
| 386 |  | 
|---|
| 387 | Klass* Klass::next_sibling(bool log) const { | 
|---|
| 388 | // Do not need load_acquire on _next_sibling, because inserts never | 
|---|
| 389 | // create _next_sibling edges to dead data. | 
|---|
| 390 | for (Klass* chain = Atomic::load(&_next_sibling); | 
|---|
| 391 | chain != NULL; | 
|---|
| 392 | chain = Atomic::load(&chain->_next_sibling)) { | 
|---|
| 393 | // Only return alive klass, there may be stale klass | 
|---|
| 394 | // in this chain if cleaned concurrently. | 
|---|
| 395 | if (chain->is_loader_alive()) { | 
|---|
| 396 | return chain; | 
|---|
| 397 | } else if (log) { | 
|---|
| 398 | if (log_is_enabled(Trace, class, unload)) { | 
|---|
| 399 | ResourceMark rm; | 
|---|
| 400 | log_trace(class, unload)( "unlinking class (sibling): %s", chain->external_name()); | 
|---|
| 401 | } | 
|---|
| 402 | } | 
|---|
| 403 | } | 
|---|
| 404 | return NULL; | 
|---|
| 405 | } | 
|---|
| 406 |  | 
|---|
| 407 | void Klass::set_subklass(Klass* s) { | 
|---|
| 408 | assert(s != this, "sanity check"); | 
|---|
| 409 | OrderAccess::release_store(&_subklass, s); | 
|---|
| 410 | } | 
|---|
| 411 |  | 
|---|
| 412 | void Klass::set_next_sibling(Klass* s) { | 
|---|
| 413 | assert(s != this, "sanity check"); | 
|---|
| 414 | // Does not need release semantics. If used by cleanup, it will link to | 
|---|
| 415 | // already safely published data, and if used by inserts, will be published | 
|---|
| 416 | // safely using cmpxchg. | 
|---|
| 417 | Atomic::store(s, &_next_sibling); | 
|---|
| 418 | } | 
|---|
| 419 |  | 
|---|
| 420 | void Klass::append_to_sibling_list() { | 
|---|
| 421 | assert_locked_or_safepoint(Compile_lock); | 
|---|
| 422 | debug_only(verify();) | 
|---|
| 423 | // add ourselves to superklass' subklass list | 
|---|
| 424 | InstanceKlass* super = superklass(); | 
|---|
| 425 | if (super == NULL) return;        // special case: class Object | 
|---|
| 426 | assert((!super->is_interface()    // interfaces cannot be supers | 
|---|
| 427 | && (super->superklass() == NULL || !is_interface())), | 
|---|
| 428 | "an interface can only be a subklass of Object"); | 
|---|
| 429 |  | 
|---|
| 430 | // Make sure there is no stale subklass head | 
|---|
| 431 | super->clean_subklass(); | 
|---|
| 432 |  | 
|---|
| 433 | for (;;) { | 
|---|
| 434 | Klass* prev_first_subklass = OrderAccess::load_acquire(&_super->_subklass); | 
|---|
| 435 | if (prev_first_subklass != NULL) { | 
|---|
| 436 | // set our sibling to be the superklass' previous first subklass | 
|---|
| 437 | assert(prev_first_subklass->is_loader_alive(), "May not attach not alive klasses"); | 
|---|
| 438 | set_next_sibling(prev_first_subklass); | 
|---|
| 439 | } | 
|---|
| 440 | // Note that the prev_first_subklass is always alive, meaning no sibling_next links | 
|---|
| 441 | // are ever created to not alive klasses. This is an important invariant of the lock-free | 
|---|
| 442 | // cleaning protocol, that allows us to safely unlink dead klasses from the sibling list. | 
|---|
| 443 | if (Atomic::cmpxchg(this, &super->_subklass, prev_first_subklass) == prev_first_subklass) { | 
|---|
| 444 | return; | 
|---|
| 445 | } | 
|---|
| 446 | } | 
|---|
| 447 | debug_only(verify();) | 
|---|
| 448 | } | 
|---|
| 449 |  | 
|---|
| 450 | void Klass::clean_subklass() { | 
|---|
| 451 | for (;;) { | 
|---|
| 452 | // Need load_acquire, due to contending with concurrent inserts | 
|---|
| 453 | Klass* subklass = OrderAccess::load_acquire(&_subklass); | 
|---|
| 454 | if (subklass == NULL || subklass->is_loader_alive()) { | 
|---|
| 455 | return; | 
|---|
| 456 | } | 
|---|
| 457 | // Try to fix _subklass until it points at something not dead. | 
|---|
| 458 | Atomic::cmpxchg(subklass->next_sibling(), &_subklass, subklass); | 
|---|
| 459 | } | 
|---|
| 460 | } | 
|---|
| 461 |  | 
|---|
| 462 | void Klass::clean_weak_klass_links(bool unloading_occurred, bool clean_alive_klasses) { | 
|---|
| 463 | if (!ClassUnloading || !unloading_occurred) { | 
|---|
| 464 | return; | 
|---|
| 465 | } | 
|---|
| 466 |  | 
|---|
| 467 | Klass* root = SystemDictionary::Object_klass(); | 
|---|
| 468 | Stack<Klass*, mtGC> stack; | 
|---|
| 469 |  | 
|---|
| 470 | stack.push(root); | 
|---|
| 471 | while (!stack.is_empty()) { | 
|---|
| 472 | Klass* current = stack.pop(); | 
|---|
| 473 |  | 
|---|
| 474 | assert(current->is_loader_alive(), "just checking, this should be live"); | 
|---|
| 475 |  | 
|---|
| 476 | // Find and set the first alive subklass | 
|---|
| 477 | Klass* sub = current->subklass(true); | 
|---|
| 478 | current->clean_subklass(); | 
|---|
| 479 | if (sub != NULL) { | 
|---|
| 480 | stack.push(sub); | 
|---|
| 481 | } | 
|---|
| 482 |  | 
|---|
| 483 | // Find and set the first alive sibling | 
|---|
| 484 | Klass* sibling = current->next_sibling(true); | 
|---|
| 485 | current->set_next_sibling(sibling); | 
|---|
| 486 | if (sibling != NULL) { | 
|---|
| 487 | stack.push(sibling); | 
|---|
| 488 | } | 
|---|
| 489 |  | 
|---|
| 490 | // Clean the implementors list and method data. | 
|---|
| 491 | if (clean_alive_klasses && current->is_instance_klass()) { | 
|---|
| 492 | InstanceKlass* ik = InstanceKlass::cast(current); | 
|---|
| 493 | ik->clean_weak_instanceklass_links(); | 
|---|
| 494 |  | 
|---|
| 495 | // JVMTI RedefineClasses creates previous versions that are not in | 
|---|
| 496 | // the class hierarchy, so process them here. | 
|---|
| 497 | while ((ik = ik->previous_versions()) != NULL) { | 
|---|
| 498 | ik->clean_weak_instanceklass_links(); | 
|---|
| 499 | } | 
|---|
| 500 | } | 
|---|
| 501 | } | 
|---|
| 502 | } | 
|---|
| 503 |  | 
|---|
| 504 | void Klass::metaspace_pointers_do(MetaspaceClosure* it) { | 
|---|
| 505 | if (log_is_enabled(Trace, cds)) { | 
|---|
| 506 | ResourceMark rm; | 
|---|
| 507 | log_trace(cds)( "Iter(Klass): %p (%s)", this, external_name()); | 
|---|
| 508 | } | 
|---|
| 509 |  | 
|---|
| 510 | it->push(&_name); | 
|---|
| 511 | it->push(&_secondary_super_cache); | 
|---|
| 512 | it->push(&_secondary_supers); | 
|---|
| 513 | for (int i = 0; i < _primary_super_limit; i++) { | 
|---|
| 514 | it->push(&_primary_supers[i]); | 
|---|
| 515 | } | 
|---|
| 516 | it->push(&_super); | 
|---|
| 517 | it->push((Klass**)&_subklass); | 
|---|
| 518 | it->push((Klass**)&_next_sibling); | 
|---|
| 519 | it->push(&_next_link); | 
|---|
| 520 |  | 
|---|
| 521 | vtableEntry* vt = start_of_vtable(); | 
|---|
| 522 | for (int i=0; i<vtable_length(); i++) { | 
|---|
| 523 | it->push(vt[i].method_addr()); | 
|---|
| 524 | } | 
|---|
| 525 | } | 
|---|
| 526 |  | 
|---|
| 527 | void Klass::remove_unshareable_info() { | 
|---|
| 528 | assert (DumpSharedSpaces || DynamicDumpSharedSpaces, | 
|---|
| 529 | "only called during CDS dump time"); | 
|---|
| 530 | JFR_ONLY(REMOVE_ID(this);) | 
|---|
| 531 | if (log_is_enabled(Trace, cds, unshareable)) { | 
|---|
| 532 | ResourceMark rm; | 
|---|
| 533 | log_trace(cds, unshareable)( "remove: %s", external_name()); | 
|---|
| 534 | } | 
|---|
| 535 |  | 
|---|
| 536 | set_subklass(NULL); | 
|---|
| 537 | set_next_sibling(NULL); | 
|---|
| 538 | set_next_link(NULL); | 
|---|
| 539 |  | 
|---|
| 540 | // Null out class_loader_data because we don't share that yet. | 
|---|
| 541 | set_class_loader_data(NULL); | 
|---|
| 542 | set_is_shared(); | 
|---|
| 543 | } | 
|---|
| 544 |  | 
|---|
| 545 | void Klass::remove_java_mirror() { | 
|---|
| 546 | assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "only called during CDS dump time"); | 
|---|
| 547 | if (log_is_enabled(Trace, cds, unshareable)) { | 
|---|
| 548 | ResourceMark rm; | 
|---|
| 549 | log_trace(cds, unshareable)( "remove java_mirror: %s", external_name()); | 
|---|
| 550 | } | 
|---|
| 551 | // Just null out the mirror.  The class_loader_data() no longer exists. | 
|---|
| 552 | _java_mirror = NULL; | 
|---|
| 553 | } | 
|---|
| 554 |  | 
|---|
| 555 | void Klass::restore_unshareable_info(ClassLoaderData* loader_data, Handle protection_domain, TRAPS) { | 
|---|
| 556 | assert(is_klass(), "ensure C++ vtable is restored"); | 
|---|
| 557 | assert(is_shared(), "must be set"); | 
|---|
| 558 | JFR_ONLY(RESTORE_ID(this);) | 
|---|
| 559 | if (log_is_enabled(Trace, cds, unshareable)) { | 
|---|
| 560 | ResourceMark rm; | 
|---|
| 561 | log_trace(cds, unshareable)( "restore: %s", external_name()); | 
|---|
| 562 | } | 
|---|
| 563 |  | 
|---|
| 564 | // If an exception happened during CDS restore, some of these fields may already be | 
|---|
| 565 | // set.  We leave the class on the CLD list, even if incomplete so that we don't | 
|---|
| 566 | // modify the CLD list outside a safepoint. | 
|---|
| 567 | if (class_loader_data() == NULL) { | 
|---|
| 568 | // Restore class_loader_data to the null class loader data | 
|---|
| 569 | set_class_loader_data(loader_data); | 
|---|
| 570 |  | 
|---|
| 571 | // Add to null class loader list first before creating the mirror | 
|---|
| 572 | // (same order as class file parsing) | 
|---|
| 573 | loader_data->add_class(this); | 
|---|
| 574 | } | 
|---|
| 575 |  | 
|---|
| 576 | Handle loader(THREAD, loader_data->class_loader()); | 
|---|
| 577 | ModuleEntry* module_entry = NULL; | 
|---|
| 578 | Klass* k = this; | 
|---|
| 579 | if (k->is_objArray_klass()) { | 
|---|
| 580 | k = ObjArrayKlass::cast(k)->bottom_klass(); | 
|---|
| 581 | } | 
|---|
| 582 | // Obtain klass' module. | 
|---|
| 583 | if (k->is_instance_klass()) { | 
|---|
| 584 | InstanceKlass* ik = (InstanceKlass*) k; | 
|---|
| 585 | module_entry = ik->module(); | 
|---|
| 586 | } else { | 
|---|
| 587 | module_entry = ModuleEntryTable::javabase_moduleEntry(); | 
|---|
| 588 | } | 
|---|
| 589 | // Obtain java.lang.Module, if available | 
|---|
| 590 | Handle module_handle(THREAD, ((module_entry != NULL) ? module_entry->module() : (oop)NULL)); | 
|---|
| 591 |  | 
|---|
| 592 | if (this->has_raw_archived_mirror()) { | 
|---|
| 593 | ResourceMark rm; | 
|---|
| 594 | log_debug(cds, mirror)( "%s has raw archived mirror", external_name()); | 
|---|
| 595 | if (HeapShared::open_archive_heap_region_mapped()) { | 
|---|
| 596 | bool present = java_lang_Class::restore_archived_mirror(this, loader, module_handle, | 
|---|
| 597 | protection_domain, | 
|---|
| 598 | CHECK); | 
|---|
| 599 | if (present) { | 
|---|
| 600 | return; | 
|---|
| 601 | } | 
|---|
| 602 | } | 
|---|
| 603 |  | 
|---|
| 604 | // No archived mirror data | 
|---|
| 605 | log_debug(cds, mirror)( "No archived mirror data for %s", external_name()); | 
|---|
| 606 | _java_mirror = NULL; | 
|---|
| 607 | this->clear_has_raw_archived_mirror(); | 
|---|
| 608 | } | 
|---|
| 609 |  | 
|---|
| 610 | // Only recreate it if not present.  A previous attempt to restore may have | 
|---|
| 611 | // gotten an OOM later but keep the mirror if it was created. | 
|---|
| 612 | if (java_mirror() == NULL) { | 
|---|
| 613 | log_trace(cds, mirror)( "Recreate mirror for %s", external_name()); | 
|---|
| 614 | java_lang_Class::create_mirror(this, loader, module_handle, protection_domain, CHECK); | 
|---|
| 615 | } | 
|---|
| 616 | } | 
|---|
| 617 |  | 
|---|
| 618 | #if INCLUDE_CDS_JAVA_HEAP | 
|---|
| 619 | // Used at CDS dump time to access the archived mirror. No GC barrier. | 
|---|
| 620 | oop Klass::archived_java_mirror_raw() { | 
|---|
| 621 | assert(has_raw_archived_mirror(), "must have raw archived mirror"); | 
|---|
| 622 | return CompressedOops::decode(_archived_mirror); | 
|---|
| 623 | } | 
|---|
| 624 |  | 
|---|
| 625 | narrowOop Klass::archived_java_mirror_raw_narrow() { | 
|---|
| 626 | assert(has_raw_archived_mirror(), "must have raw archived mirror"); | 
|---|
| 627 | return _archived_mirror; | 
|---|
| 628 | } | 
|---|
| 629 |  | 
|---|
| 630 | // No GC barrier | 
|---|
| 631 | void Klass::set_archived_java_mirror_raw(oop m) { | 
|---|
| 632 | assert(DumpSharedSpaces, "called only during runtime"); | 
|---|
| 633 | _archived_mirror = CompressedOops::encode(m); | 
|---|
| 634 | } | 
|---|
| 635 | #endif // INCLUDE_CDS_JAVA_HEAP | 
|---|
| 636 |  | 
|---|
| 637 | Klass* Klass::array_klass_or_null(int rank) { | 
|---|
| 638 | EXCEPTION_MARK; | 
|---|
| 639 | // No exception can be thrown by array_klass_impl when called with or_null == true. | 
|---|
| 640 | // (In anycase, the execption mark will fail if it do so) | 
|---|
| 641 | return array_klass_impl(true, rank, THREAD); | 
|---|
| 642 | } | 
|---|
| 643 |  | 
|---|
| 644 |  | 
|---|
| 645 | Klass* Klass::array_klass_or_null() { | 
|---|
| 646 | EXCEPTION_MARK; | 
|---|
| 647 | // No exception can be thrown by array_klass_impl when called with or_null == true. | 
|---|
| 648 | // (In anycase, the execption mark will fail if it do so) | 
|---|
| 649 | return array_klass_impl(true, THREAD); | 
|---|
| 650 | } | 
|---|
| 651 |  | 
|---|
| 652 |  | 
|---|
| 653 | Klass* Klass::array_klass_impl(bool or_null, int rank, TRAPS) { | 
|---|
| 654 | fatal( "array_klass should be dispatched to InstanceKlass, ObjArrayKlass or TypeArrayKlass"); | 
|---|
| 655 | return NULL; | 
|---|
| 656 | } | 
|---|
| 657 |  | 
|---|
| 658 |  | 
|---|
| 659 | Klass* Klass::array_klass_impl(bool or_null, TRAPS) { | 
|---|
| 660 | fatal( "array_klass should be dispatched to InstanceKlass, ObjArrayKlass or TypeArrayKlass"); | 
|---|
| 661 | return NULL; | 
|---|
| 662 | } | 
|---|
| 663 |  | 
|---|
| 664 | void Klass::check_array_allocation_length(int length, int max_length, TRAPS) { | 
|---|
| 665 | if (length > max_length) { | 
|---|
| 666 | if (!THREAD->in_retryable_allocation()) { | 
|---|
| 667 | report_java_out_of_memory( "Requested array size exceeds VM limit"); | 
|---|
| 668 | JvmtiExport::post_array_size_exhausted(); | 
|---|
| 669 | THROW_OOP(Universe::out_of_memory_error_array_size()); | 
|---|
| 670 | } else { | 
|---|
| 671 | THROW_OOP(Universe::out_of_memory_error_retry()); | 
|---|
| 672 | } | 
|---|
| 673 | } else if (length < 0) { | 
|---|
| 674 | THROW_MSG(vmSymbols::java_lang_NegativeArraySizeException(), err_msg( "%d", length)); | 
|---|
| 675 | } | 
|---|
| 676 | } | 
|---|
| 677 |  | 
|---|
| 678 | oop Klass::class_loader() const { return class_loader_data()->class_loader(); } | 
|---|
| 679 |  | 
|---|
| 680 | // In product mode, this function doesn't have virtual function calls so | 
|---|
| 681 | // there might be some performance advantage to handling InstanceKlass here. | 
|---|
| 682 | const char* Klass::external_name() const { | 
|---|
| 683 | if (is_instance_klass()) { | 
|---|
| 684 | const InstanceKlass* ik = static_cast<const InstanceKlass*>(this); | 
|---|
| 685 | if (ik->is_unsafe_anonymous()) { | 
|---|
| 686 | char addr_buf[20]; | 
|---|
| 687 | jio_snprintf(addr_buf, 20, "/"INTPTR_FORMAT, p2i(ik)); | 
|---|
| 688 | size_t addr_len = strlen(addr_buf); | 
|---|
| 689 | size_t name_len = name()->utf8_length(); | 
|---|
| 690 | char*  result   = NEW_RESOURCE_ARRAY(char, name_len + addr_len + 1); | 
|---|
| 691 | name()->as_klass_external_name(result, (int) name_len + 1); | 
|---|
| 692 | assert(strlen(result) == name_len, ""); | 
|---|
| 693 | strcpy(result + name_len, addr_buf); | 
|---|
| 694 | assert(strlen(result) == name_len + addr_len, ""); | 
|---|
| 695 | return result; | 
|---|
| 696 | } | 
|---|
| 697 | } | 
|---|
| 698 | if (name() == NULL)  return "<unknown>"; | 
|---|
| 699 | return name()->as_klass_external_name(); | 
|---|
| 700 | } | 
|---|
| 701 |  | 
|---|
| 702 | const char* Klass::signature_name() const { | 
|---|
| 703 | if (name() == NULL)  return "<unknown>"; | 
|---|
| 704 | return name()->as_C_string(); | 
|---|
| 705 | } | 
|---|
| 706 |  | 
|---|
| 707 | const char* Klass::external_kind() const { | 
|---|
| 708 | if (is_interface()) return "interface"; | 
|---|
| 709 | if (is_abstract()) return "abstract class"; | 
|---|
| 710 | return "class"; | 
|---|
| 711 | } | 
|---|
| 712 |  | 
|---|
| 713 | // Unless overridden, modifier_flags is 0. | 
|---|
| 714 | jint Klass::compute_modifier_flags(TRAPS) const { | 
|---|
| 715 | return 0; | 
|---|
| 716 | } | 
|---|
| 717 |  | 
|---|
| 718 | int Klass::atomic_incr_biased_lock_revocation_count() { | 
|---|
| 719 | return (int) Atomic::add(1, &_biased_lock_revocation_count); | 
|---|
| 720 | } | 
|---|
| 721 |  | 
|---|
| 722 | // Unless overridden, jvmti_class_status has no flags set. | 
|---|
| 723 | jint Klass::jvmti_class_status() const { | 
|---|
| 724 | return 0; | 
|---|
| 725 | } | 
|---|
| 726 |  | 
|---|
| 727 |  | 
|---|
| 728 | // Printing | 
|---|
| 729 |  | 
|---|
| 730 | void Klass::print_on(outputStream* st) const { | 
|---|
| 731 | ResourceMark rm; | 
|---|
| 732 | // print title | 
|---|
| 733 | st->print( "%s", internal_name()); | 
|---|
| 734 | print_address_on(st); | 
|---|
| 735 | st->cr(); | 
|---|
| 736 | } | 
|---|
| 737 |  | 
|---|
| 738 | #define BULLET  " - " | 
|---|
| 739 |  | 
|---|
| 740 | void Klass::oop_print_on(oop obj, outputStream* st) { | 
|---|
| 741 | // print title | 
|---|
| 742 | st->print_cr( "%s ", internal_name()); | 
|---|
| 743 | obj->print_address_on(st); | 
|---|
| 744 |  | 
|---|
| 745 | if (WizardMode) { | 
|---|
| 746 | // print header | 
|---|
| 747 | obj->mark()->print_on(st); | 
|---|
| 748 | st->cr(); | 
|---|
| 749 | st->print(BULLET "prototype_header: "INTPTR_FORMAT, p2i(_prototype_header)); | 
|---|
| 750 | st->cr(); | 
|---|
| 751 | } | 
|---|
| 752 |  | 
|---|
| 753 | // print class | 
|---|
| 754 | st->print(BULLET "klass: "); | 
|---|
| 755 | obj->klass()->print_value_on(st); | 
|---|
| 756 | st->cr(); | 
|---|
| 757 | } | 
|---|
| 758 |  | 
|---|
| 759 | void Klass::oop_print_value_on(oop obj, outputStream* st) { | 
|---|
| 760 | // print title | 
|---|
| 761 | ResourceMark rm;              // Cannot print in debug mode without this | 
|---|
| 762 | st->print( "%s", internal_name()); | 
|---|
| 763 | obj->print_address_on(st); | 
|---|
| 764 | } | 
|---|
| 765 |  | 
|---|
| 766 | #if INCLUDE_SERVICES | 
|---|
| 767 | // Size Statistics | 
|---|
| 768 | void Klass::collect_statistics(KlassSizeStats *sz) const { | 
|---|
| 769 | sz->_klass_bytes = sz->count(this); | 
|---|
| 770 | sz->_mirror_bytes = sz->count(java_mirror_no_keepalive()); | 
|---|
| 771 | sz->_secondary_supers_bytes = sz->count_array(secondary_supers()); | 
|---|
| 772 |  | 
|---|
| 773 | sz->_ro_bytes += sz->_secondary_supers_bytes; | 
|---|
| 774 | sz->_rw_bytes += sz->_klass_bytes + sz->_mirror_bytes; | 
|---|
| 775 | } | 
|---|
| 776 | #endif // INCLUDE_SERVICES | 
|---|
| 777 |  | 
|---|
| 778 | // Verification | 
|---|
| 779 |  | 
|---|
| 780 | void Klass::verify_on(outputStream* st) { | 
|---|
| 781 |  | 
|---|
| 782 | // This can be expensive, but it is worth checking that this klass is actually | 
|---|
| 783 | // in the CLD graph but not in production. | 
|---|
| 784 | assert(Metaspace::contains((address)this), "Should be"); | 
|---|
| 785 |  | 
|---|
| 786 | guarantee(this->is_klass(), "should be klass"); | 
|---|
| 787 |  | 
|---|
| 788 | if (super() != NULL) { | 
|---|
| 789 | guarantee(super()->is_klass(), "should be klass"); | 
|---|
| 790 | } | 
|---|
| 791 | if (secondary_super_cache() != NULL) { | 
|---|
| 792 | Klass* ko = secondary_super_cache(); | 
|---|
| 793 | guarantee(ko->is_klass(), "should be klass"); | 
|---|
| 794 | } | 
|---|
| 795 | for ( uint i = 0; i < primary_super_limit(); i++ ) { | 
|---|
| 796 | Klass* ko = _primary_supers[i]; | 
|---|
| 797 | if (ko != NULL) { | 
|---|
| 798 | guarantee(ko->is_klass(), "should be klass"); | 
|---|
| 799 | } | 
|---|
| 800 | } | 
|---|
| 801 |  | 
|---|
| 802 | if (java_mirror_no_keepalive() != NULL) { | 
|---|
| 803 | guarantee(oopDesc::is_oop(java_mirror_no_keepalive()), "should be instance"); | 
|---|
| 804 | } | 
|---|
| 805 | } | 
|---|
| 806 |  | 
|---|
| 807 | void Klass::oop_verify_on(oop obj, outputStream* st) { | 
|---|
| 808 | guarantee(oopDesc::is_oop(obj), "should be oop"); | 
|---|
| 809 | guarantee(obj->klass()->is_klass(), "klass field is not a klass"); | 
|---|
| 810 | } | 
|---|
| 811 |  | 
|---|
| 812 | bool Klass::is_valid(Klass* k) { | 
|---|
| 813 | if (!is_aligned(k, sizeof(MetaWord))) return false; | 
|---|
| 814 | if ((size_t)k < os::min_page_size()) return false; | 
|---|
| 815 |  | 
|---|
| 816 | if (!os::is_readable_range(k, k + 1)) return false; | 
|---|
| 817 | if (!Metaspace::contains(k)) return false; | 
|---|
| 818 |  | 
|---|
| 819 | if (!Symbol::is_valid(k->name())) return false; | 
|---|
| 820 | return ClassLoaderDataGraph::is_valid(k->class_loader_data()); | 
|---|
| 821 | } | 
|---|
| 822 |  | 
|---|
| 823 | klassVtable Klass::vtable() const { | 
|---|
| 824 | return klassVtable(const_cast<Klass*>(this), start_of_vtable(), vtable_length() / vtableEntry::size()); | 
|---|
| 825 | } | 
|---|
| 826 |  | 
|---|
| 827 | vtableEntry* Klass::start_of_vtable() const { | 
|---|
| 828 | return (vtableEntry*) ((address)this + in_bytes(vtable_start_offset())); | 
|---|
| 829 | } | 
|---|
| 830 |  | 
|---|
| 831 | Method* Klass::method_at_vtable(int index)  { | 
|---|
| 832 | #ifndef PRODUCT | 
|---|
| 833 | assert(index >= 0, "valid vtable index"); | 
|---|
| 834 | if (DebugVtables) { | 
|---|
| 835 | verify_vtable_index(index); | 
|---|
| 836 | } | 
|---|
| 837 | #endif | 
|---|
| 838 | return start_of_vtable()[index].method(); | 
|---|
| 839 | } | 
|---|
| 840 |  | 
|---|
| 841 | ByteSize Klass::vtable_start_offset() { | 
|---|
| 842 | return in_ByteSize(InstanceKlass::header_size() * wordSize); | 
|---|
| 843 | } | 
|---|
| 844 |  | 
|---|
| 845 | #ifndef PRODUCT | 
|---|
| 846 |  | 
|---|
| 847 | bool Klass::verify_vtable_index(int i) { | 
|---|
| 848 | int limit = vtable_length()/vtableEntry::size(); | 
|---|
| 849 | assert(i >= 0 && i < limit, "index %d out of bounds %d", i, limit); | 
|---|
| 850 | return true; | 
|---|
| 851 | } | 
|---|
| 852 |  | 
|---|
| 853 | #endif // PRODUCT | 
|---|
| 854 |  | 
|---|
| 855 | // Caller needs ResourceMark | 
|---|
| 856 | // joint_in_module_of_loader provides an optimization if 2 classes are in | 
|---|
| 857 | // the same module to succinctly print out relevant information about their | 
|---|
| 858 | // module name and class loader's name_and_id for error messages. | 
|---|
| 859 | // Format: | 
|---|
| 860 | //   <fully-qualified-external-class-name1> and <fully-qualified-external-class-name2> | 
|---|
| 861 | //                      are in module <module-name>[@<version>] | 
|---|
| 862 | //                      of loader <loader-name_and_id>[, parent loader <parent-loader-name_and_id>] | 
|---|
| 863 | const char* Klass::joint_in_module_of_loader(const Klass* class2, bool include_parent_loader) const { | 
|---|
| 864 | assert(module() == class2->module(), "classes do not have the same module"); | 
|---|
| 865 | const char* class1_name = external_name(); | 
|---|
| 866 | size_t len = strlen(class1_name) + 1; | 
|---|
| 867 |  | 
|---|
| 868 | const char* class2_description = class2->class_in_module_of_loader(true, include_parent_loader); | 
|---|
| 869 | len += strlen(class2_description); | 
|---|
| 870 |  | 
|---|
| 871 | len += strlen( " and "); | 
|---|
| 872 |  | 
|---|
| 873 | char* joint_description = NEW_RESOURCE_ARRAY_RETURN_NULL(char, len); | 
|---|
| 874 |  | 
|---|
| 875 | // Just return the FQN if error when allocating string | 
|---|
| 876 | if (joint_description == NULL) { | 
|---|
| 877 | return class1_name; | 
|---|
| 878 | } | 
|---|
| 879 |  | 
|---|
| 880 | jio_snprintf(joint_description, len, "%s and %s", | 
|---|
| 881 | class1_name, | 
|---|
| 882 | class2_description); | 
|---|
| 883 |  | 
|---|
| 884 | return joint_description; | 
|---|
| 885 | } | 
|---|
| 886 |  | 
|---|
| 887 | // Caller needs ResourceMark | 
|---|
| 888 | // class_in_module_of_loader provides a standard way to include | 
|---|
| 889 | // relevant information about a class, such as its module name as | 
|---|
| 890 | // well as its class loader's name_and_id, in error messages and logging. | 
|---|
| 891 | // Format: | 
|---|
| 892 | //   <fully-qualified-external-class-name> is in module <module-name>[@<version>] | 
|---|
| 893 | //                                         of loader <loader-name_and_id>[, parent loader <parent-loader-name_and_id>] | 
|---|
| 894 | const char* Klass::class_in_module_of_loader(bool use_are, bool include_parent_loader) const { | 
|---|
| 895 | // 1. fully qualified external name of class | 
|---|
| 896 | const char* klass_name = external_name(); | 
|---|
| 897 | size_t len = strlen(klass_name) + 1; | 
|---|
| 898 |  | 
|---|
| 899 | // 2. module name + @version | 
|---|
| 900 | const char* module_name = ""; | 
|---|
| 901 | const char* version = ""; | 
|---|
| 902 | bool has_version = false; | 
|---|
| 903 | bool module_is_named = false; | 
|---|
| 904 | const char* module_name_phrase = ""; | 
|---|
| 905 | const Klass* bottom_klass = is_objArray_klass() ? | 
|---|
| 906 | ObjArrayKlass::cast(this)->bottom_klass() : this; | 
|---|
| 907 | if (bottom_klass->is_instance_klass()) { | 
|---|
| 908 | ModuleEntry* module = InstanceKlass::cast(bottom_klass)->module(); | 
|---|
| 909 | if (module->is_named()) { | 
|---|
| 910 | module_is_named = true; | 
|---|
| 911 | module_name_phrase = "module "; | 
|---|
| 912 | module_name = module->name()->as_C_string(); | 
|---|
| 913 | len += strlen(module_name); | 
|---|
| 914 | // Use version if exists and is not a jdk module | 
|---|
| 915 | if (module->should_show_version()) { | 
|---|
| 916 | has_version = true; | 
|---|
| 917 | version = module->version()->as_C_string(); | 
|---|
| 918 | // Include stlen(version) + 1 for the "@" | 
|---|
| 919 | len += strlen(version) + 1; | 
|---|
| 920 | } | 
|---|
| 921 | } else { | 
|---|
| 922 | module_name = UNNAMED_MODULE; | 
|---|
| 923 | len += UNNAMED_MODULE_LEN; | 
|---|
| 924 | } | 
|---|
| 925 | } else { | 
|---|
| 926 | // klass is an array of primitives, module is java.base | 
|---|
| 927 | module_is_named = true; | 
|---|
| 928 | module_name_phrase = "module "; | 
|---|
| 929 | module_name = JAVA_BASE_NAME; | 
|---|
| 930 | len += JAVA_BASE_NAME_LEN; | 
|---|
| 931 | } | 
|---|
| 932 |  | 
|---|
| 933 | // 3. class loader's name_and_id | 
|---|
| 934 | ClassLoaderData* cld = class_loader_data(); | 
|---|
| 935 | assert(cld != NULL, "class_loader_data should not be null"); | 
|---|
| 936 | const char* loader_name_and_id = cld->loader_name_and_id(); | 
|---|
| 937 | len += strlen(loader_name_and_id); | 
|---|
| 938 |  | 
|---|
| 939 | // 4. include parent loader information | 
|---|
| 940 | const char* parent_loader_phrase = ""; | 
|---|
| 941 | const char* parent_loader_name_and_id = ""; | 
|---|
| 942 | if (include_parent_loader && | 
|---|
| 943 | !cld->is_builtin_class_loader_data()) { | 
|---|
| 944 | oop parent_loader = java_lang_ClassLoader::parent(class_loader()); | 
|---|
| 945 | ClassLoaderData *parent_cld = ClassLoaderData::class_loader_data_or_null(parent_loader); | 
|---|
| 946 | // The parent loader's ClassLoaderData could be null if it is | 
|---|
| 947 | // a delegating class loader that has never defined a class. | 
|---|
| 948 | // In this case the loader's name must be obtained via the parent loader's oop. | 
|---|
| 949 | if (parent_cld == NULL) { | 
|---|
| 950 | oop cl_name_and_id = java_lang_ClassLoader::nameAndId(parent_loader); | 
|---|
| 951 | if (cl_name_and_id != NULL) { | 
|---|
| 952 | parent_loader_name_and_id = java_lang_String::as_utf8_string(cl_name_and_id); | 
|---|
| 953 | } | 
|---|
| 954 | } else { | 
|---|
| 955 | parent_loader_name_and_id = parent_cld->loader_name_and_id(); | 
|---|
| 956 | } | 
|---|
| 957 | parent_loader_phrase = ", parent loader "; | 
|---|
| 958 | len += strlen(parent_loader_phrase) + strlen(parent_loader_name_and_id); | 
|---|
| 959 | } | 
|---|
| 960 |  | 
|---|
| 961 | // Start to construct final full class description string | 
|---|
| 962 | len += ((use_are) ? strlen( " are in ") : strlen( " is in ")); | 
|---|
| 963 | len += strlen(module_name_phrase) + strlen( " of loader "); | 
|---|
| 964 |  | 
|---|
| 965 | char* class_description = NEW_RESOURCE_ARRAY_RETURN_NULL(char, len); | 
|---|
| 966 |  | 
|---|
| 967 | // Just return the FQN if error when allocating string | 
|---|
| 968 | if (class_description == NULL) { | 
|---|
| 969 | return klass_name; | 
|---|
| 970 | } | 
|---|
| 971 |  | 
|---|
| 972 | jio_snprintf(class_description, len, "%s %s in %s%s%s%s of loader %s%s%s", | 
|---|
| 973 | klass_name, | 
|---|
| 974 | (use_are) ? "are": "is", | 
|---|
| 975 | module_name_phrase, | 
|---|
| 976 | module_name, | 
|---|
| 977 | (has_version) ? "@": "", | 
|---|
| 978 | (has_version) ? version : "", | 
|---|
| 979 | loader_name_and_id, | 
|---|
| 980 | parent_loader_phrase, | 
|---|
| 981 | parent_loader_name_and_id); | 
|---|
| 982 |  | 
|---|
| 983 | return class_description; | 
|---|
| 984 | } | 
|---|
| 985 |  | 
|---|