< prev index next >

src/hotspot/share/oops/instanceKlass.cpp

Print this page


1302 }
1303 
1304 void InstanceKlass::check_valid_for_instantiation(bool throwError, TRAPS) {
1305   if (is_interface() || is_abstract()) {
1306     ResourceMark rm(THREAD);
1307     THROW_MSG(throwError ? vmSymbols::java_lang_InstantiationError()
1308               : vmSymbols::java_lang_InstantiationException(), external_name());
1309   }
1310   if (this == SystemDictionary::Class_klass()) {
1311     ResourceMark rm(THREAD);
1312     THROW_MSG(throwError ? vmSymbols::java_lang_IllegalAccessError()
1313               : vmSymbols::java_lang_IllegalAccessException(), external_name());
1314   }
1315 }
1316 
1317 Klass* InstanceKlass::array_klass_impl(bool or_null, int n, TRAPS) {
1318   // Need load-acquire for lock-free read
1319   if (array_klasses_acquire() == NULL) {
1320     if (or_null) return NULL;
1321 
1322     ResourceMark rm;
1323     JavaThread *jt = (JavaThread *)THREAD;
1324     {
1325       // Atomic creation of array_klasses
1326       MutexLocker ma(MultiArray_lock, THREAD);
1327 
1328       // Check if update has already taken place
1329       if (array_klasses() == NULL) {
1330         Klass*    k = ObjArrayKlass::allocate_objArray_klass(class_loader_data(), 1, this, CHECK_NULL);
1331         // use 'release' to pair with lock-free load
1332         release_set_array_klasses(k);
1333       }
1334     }
1335   }
1336   // _this will always be set at this point
1337   ObjArrayKlass* oak = (ObjArrayKlass*)array_klasses();
1338   if (or_null) {
1339     return oak->array_klass_or_null(n);
1340   }
1341   return oak->array_klass(n, THREAD);
1342 }


1351   Method* clinit = find_method(
1352       vmSymbols::class_initializer_name(), vmSymbols::void_method_signature());
1353   if (clinit != NULL && clinit->has_valid_initializer_flags()) {
1354     return clinit;
1355   }
1356   return NULL;
1357 }
1358 
1359 void InstanceKlass::call_class_initializer(TRAPS) {
1360   if (ReplayCompiles &&
1361       (ReplaySuppressInitializers == 1 ||
1362        (ReplaySuppressInitializers >= 2 && class_loader() != NULL))) {
1363     // Hide the existence of the initializer for the purpose of replaying the compile
1364     return;
1365   }
1366 
1367   methodHandle h_method(THREAD, class_initializer());
1368   assert(!is_initialized(), "we cannot initialize twice");
1369   LogTarget(Info, class, init) lt;
1370   if (lt.is_enabled()) {
1371     ResourceMark rm;
1372     LogStream ls(lt);
1373     ls.print("%d Initializing ", call_class_initializer_counter++);
1374     name()->print_value_on(&ls);
1375     ls.print_cr("%s (" INTPTR_FORMAT ")", h_method() == NULL ? "(no method)" : "", p2i(this));
1376   }
1377   if (h_method() != NULL) {
1378     JavaCallArguments args; // No arguments
1379     JavaValue result(T_VOID);
1380     JavaCalls::call(&result, h_method, &args, CHECK); // Static call (no args)
1381   }
1382 }
1383 
1384 
1385 void InstanceKlass::mask_for(const methodHandle& method, int bci,
1386   InterpreterOopMap* entry_for) {
1387   // Lazily create the _oop_map_cache at first request
1388   // Lock-free access requires load_acquire.
1389   OopMapCache* oop_map_cache = Atomic::load_acquire(&_oop_map_cache);
1390   if (oop_map_cache == NULL) {
1391     MutexLocker x(OopMapCacheAlloc_lock);


2661 
2662   // If we have a hash, append it
2663   for (int hash_index = 0; hash_index < hash_len; ) {
2664     dest[dest_index++] = hash_buf[hash_index++];
2665   }
2666 
2667   // Add the semicolon and the NULL
2668   dest[dest_index++] = JVM_SIGNATURE_ENDCLASS;
2669   dest[dest_index] = '\0';
2670   return dest;
2671 }
2672 
2673 // Used to obtain the package name from a fully qualified class name.
2674 Symbol* InstanceKlass::package_from_name(const Symbol* name, TRAPS) {
2675   if (name == NULL) {
2676     return NULL;
2677   } else {
2678     if (name->utf8_length() <= 0) {
2679       return NULL;
2680     }
2681     ResourceMark rm;
2682     const char* package_name = ClassLoader::package_from_name((const char*) name->as_C_string());
2683     if (package_name == NULL) {
2684       return NULL;
2685     }
2686     Symbol* pkg_name = SymbolTable::new_symbol(package_name);
2687     return pkg_name;
2688   }
2689 }
2690 
2691 ModuleEntry* InstanceKlass::module() const {
2692   // For an unsafe anonymous class return the host class' module
2693   if (is_unsafe_anonymous()) {
2694     assert(unsafe_anonymous_host() != NULL, "unsafe anonymous class must have a host class");
2695     return unsafe_anonymous_host()->module();
2696   }
2697 
2698   // Class is in a named package
2699   if (!in_unnamed_package()) {
2700     return _package_entry->module();
2701   }


2703   // Class is in an unnamed package, return its loader's unnamed module
2704   return class_loader_data()->unnamed_module();
2705 }
2706 
2707 void InstanceKlass::set_package(ClassLoaderData* loader_data, TRAPS) {
2708 
2709   // ensure java/ packages only loaded by boot or platform builtin loaders
2710   check_prohibited_package(name(), loader_data, CHECK);
2711 
2712   TempNewSymbol pkg_name = package_from_name(name(), CHECK);
2713 
2714   if (pkg_name != NULL && loader_data != NULL) {
2715 
2716     // Find in class loader's package entry table.
2717     _package_entry = loader_data->packages()->lookup_only(pkg_name);
2718 
2719     // If the package name is not found in the loader's package
2720     // entry table, it is an indication that the package has not
2721     // been defined. Consider it defined within the unnamed module.
2722     if (_package_entry == NULL) {
2723       ResourceMark rm;
2724 
2725       if (!ModuleEntryTable::javabase_defined()) {
2726         // Before java.base is defined during bootstrapping, define all packages in
2727         // the java.base module.  If a non-java.base package is erroneously placed
2728         // in the java.base module it will be caught later when java.base
2729         // is defined by ModuleEntryTable::verify_javabase_packages check.
2730         assert(ModuleEntryTable::javabase_moduleEntry() != NULL, JAVA_BASE_NAME " module is NULL");
2731         _package_entry = loader_data->packages()->lookup(pkg_name, ModuleEntryTable::javabase_moduleEntry());
2732       } else {
2733         assert(loader_data->unnamed_module() != NULL, "unnamed module is NULL");
2734         _package_entry = loader_data->packages()->lookup(pkg_name,
2735                                                          loader_data->unnamed_module());
2736       }
2737 
2738       // A package should have been successfully created
2739       assert(_package_entry != NULL, "Package entry for class %s not found, loader %s",
2740              name()->as_C_string(), loader_data->loader_name_and_id());
2741     }
2742 
2743     if (log_is_enabled(Debug, module)) {
2744       ResourceMark rm;
2745       ModuleEntry* m = _package_entry->module();
2746       log_trace(module)("Setting package: class: %s, package: %s, loader: %s, module: %s",
2747                         external_name(),
2748                         pkg_name->as_C_string(),
2749                         loader_data->loader_name_and_id(),
2750                         (m->is_named() ? m->name()->as_C_string() : UNNAMED_MODULE));
2751     }
2752   } else {
2753     ResourceMark rm;
2754     log_trace(module)("Setting package: class: %s, package: unnamed, loader: %s, module: %s",
2755                       external_name(),
2756                       (loader_data != NULL) ? loader_data->loader_name_and_id() : "NULL",
2757                       UNNAMED_MODULE);
2758   }
2759 }
2760 
2761 
2762 // different versions of is_same_class_package
2763 
2764 bool InstanceKlass::is_same_class_package(const Klass* class2) const {
2765   oop classloader1 = this->class_loader();
2766   PackageEntry* classpkg1 = this->package();
2767   if (class2->is_objArray_klass()) {
2768     class2 = ObjArrayKlass::cast(class2)->bottom_klass();
2769   }
2770 
2771   oop classloader2;
2772   PackageEntry* classpkg2;
2773   if (class2->is_instance_klass()) {




1302 }
1303 
1304 void InstanceKlass::check_valid_for_instantiation(bool throwError, TRAPS) {
1305   if (is_interface() || is_abstract()) {
1306     ResourceMark rm(THREAD);
1307     THROW_MSG(throwError ? vmSymbols::java_lang_InstantiationError()
1308               : vmSymbols::java_lang_InstantiationException(), external_name());
1309   }
1310   if (this == SystemDictionary::Class_klass()) {
1311     ResourceMark rm(THREAD);
1312     THROW_MSG(throwError ? vmSymbols::java_lang_IllegalAccessError()
1313               : vmSymbols::java_lang_IllegalAccessException(), external_name());
1314   }
1315 }
1316 
1317 Klass* InstanceKlass::array_klass_impl(bool or_null, int n, TRAPS) {
1318   // Need load-acquire for lock-free read
1319   if (array_klasses_acquire() == NULL) {
1320     if (or_null) return NULL;
1321 
1322     ResourceMark rm(THREAD);
1323     JavaThread *jt = (JavaThread *)THREAD;
1324     {
1325       // Atomic creation of array_klasses
1326       MutexLocker ma(MultiArray_lock, THREAD);
1327 
1328       // Check if update has already taken place
1329       if (array_klasses() == NULL) {
1330         Klass*    k = ObjArrayKlass::allocate_objArray_klass(class_loader_data(), 1, this, CHECK_NULL);
1331         // use 'release' to pair with lock-free load
1332         release_set_array_klasses(k);
1333       }
1334     }
1335   }
1336   // _this will always be set at this point
1337   ObjArrayKlass* oak = (ObjArrayKlass*)array_klasses();
1338   if (or_null) {
1339     return oak->array_klass_or_null(n);
1340   }
1341   return oak->array_klass(n, THREAD);
1342 }


1351   Method* clinit = find_method(
1352       vmSymbols::class_initializer_name(), vmSymbols::void_method_signature());
1353   if (clinit != NULL && clinit->has_valid_initializer_flags()) {
1354     return clinit;
1355   }
1356   return NULL;
1357 }
1358 
1359 void InstanceKlass::call_class_initializer(TRAPS) {
1360   if (ReplayCompiles &&
1361       (ReplaySuppressInitializers == 1 ||
1362        (ReplaySuppressInitializers >= 2 && class_loader() != NULL))) {
1363     // Hide the existence of the initializer for the purpose of replaying the compile
1364     return;
1365   }
1366 
1367   methodHandle h_method(THREAD, class_initializer());
1368   assert(!is_initialized(), "we cannot initialize twice");
1369   LogTarget(Info, class, init) lt;
1370   if (lt.is_enabled()) {
1371     ResourceMark rm(THREAD);
1372     LogStream ls(lt);
1373     ls.print("%d Initializing ", call_class_initializer_counter++);
1374     name()->print_value_on(&ls);
1375     ls.print_cr("%s (" INTPTR_FORMAT ")", h_method() == NULL ? "(no method)" : "", p2i(this));
1376   }
1377   if (h_method() != NULL) {
1378     JavaCallArguments args; // No arguments
1379     JavaValue result(T_VOID);
1380     JavaCalls::call(&result, h_method, &args, CHECK); // Static call (no args)
1381   }
1382 }
1383 
1384 
1385 void InstanceKlass::mask_for(const methodHandle& method, int bci,
1386   InterpreterOopMap* entry_for) {
1387   // Lazily create the _oop_map_cache at first request
1388   // Lock-free access requires load_acquire.
1389   OopMapCache* oop_map_cache = Atomic::load_acquire(&_oop_map_cache);
1390   if (oop_map_cache == NULL) {
1391     MutexLocker x(OopMapCacheAlloc_lock);


2661 
2662   // If we have a hash, append it
2663   for (int hash_index = 0; hash_index < hash_len; ) {
2664     dest[dest_index++] = hash_buf[hash_index++];
2665   }
2666 
2667   // Add the semicolon and the NULL
2668   dest[dest_index++] = JVM_SIGNATURE_ENDCLASS;
2669   dest[dest_index] = '\0';
2670   return dest;
2671 }
2672 
2673 // Used to obtain the package name from a fully qualified class name.
2674 Symbol* InstanceKlass::package_from_name(const Symbol* name, TRAPS) {
2675   if (name == NULL) {
2676     return NULL;
2677   } else {
2678     if (name->utf8_length() <= 0) {
2679       return NULL;
2680     }
2681     ResourceMark rm(THREAD);
2682     const char* package_name = ClassLoader::package_from_name((const char*) name->as_C_string());
2683     if (package_name == NULL) {
2684       return NULL;
2685     }
2686     Symbol* pkg_name = SymbolTable::new_symbol(package_name);
2687     return pkg_name;
2688   }
2689 }
2690 
2691 ModuleEntry* InstanceKlass::module() const {
2692   // For an unsafe anonymous class return the host class' module
2693   if (is_unsafe_anonymous()) {
2694     assert(unsafe_anonymous_host() != NULL, "unsafe anonymous class must have a host class");
2695     return unsafe_anonymous_host()->module();
2696   }
2697 
2698   // Class is in a named package
2699   if (!in_unnamed_package()) {
2700     return _package_entry->module();
2701   }


2703   // Class is in an unnamed package, return its loader's unnamed module
2704   return class_loader_data()->unnamed_module();
2705 }
2706 
2707 void InstanceKlass::set_package(ClassLoaderData* loader_data, TRAPS) {
2708 
2709   // ensure java/ packages only loaded by boot or platform builtin loaders
2710   check_prohibited_package(name(), loader_data, CHECK);
2711 
2712   TempNewSymbol pkg_name = package_from_name(name(), CHECK);
2713 
2714   if (pkg_name != NULL && loader_data != NULL) {
2715 
2716     // Find in class loader's package entry table.
2717     _package_entry = loader_data->packages()->lookup_only(pkg_name);
2718 
2719     // If the package name is not found in the loader's package
2720     // entry table, it is an indication that the package has not
2721     // been defined. Consider it defined within the unnamed module.
2722     if (_package_entry == NULL) {
2723       ResourceMark rm(THREAD);
2724 
2725       if (!ModuleEntryTable::javabase_defined()) {
2726         // Before java.base is defined during bootstrapping, define all packages in
2727         // the java.base module.  If a non-java.base package is erroneously placed
2728         // in the java.base module it will be caught later when java.base
2729         // is defined by ModuleEntryTable::verify_javabase_packages check.
2730         assert(ModuleEntryTable::javabase_moduleEntry() != NULL, JAVA_BASE_NAME " module is NULL");
2731         _package_entry = loader_data->packages()->lookup(pkg_name, ModuleEntryTable::javabase_moduleEntry());
2732       } else {
2733         assert(loader_data->unnamed_module() != NULL, "unnamed module is NULL");
2734         _package_entry = loader_data->packages()->lookup(pkg_name,
2735                                                          loader_data->unnamed_module());
2736       }
2737 
2738       // A package should have been successfully created
2739       assert(_package_entry != NULL, "Package entry for class %s not found, loader %s",
2740              name()->as_C_string(), loader_data->loader_name_and_id());
2741     }
2742 
2743     if (log_is_enabled(Debug, module)) {
2744       ResourceMark rm(THREAD);
2745       ModuleEntry* m = _package_entry->module();
2746       log_trace(module)("Setting package: class: %s, package: %s, loader: %s, module: %s",
2747                         external_name(),
2748                         pkg_name->as_C_string(),
2749                         loader_data->loader_name_and_id(),
2750                         (m->is_named() ? m->name()->as_C_string() : UNNAMED_MODULE));
2751     }
2752   } else {
2753     ResourceMark rm(THREAD);
2754     log_trace(module)("Setting package: class: %s, package: unnamed, loader: %s, module: %s",
2755                       external_name(),
2756                       (loader_data != NULL) ? loader_data->loader_name_and_id() : "NULL",
2757                       UNNAMED_MODULE);
2758   }
2759 }
2760 
2761 
2762 // different versions of is_same_class_package
2763 
2764 bool InstanceKlass::is_same_class_package(const Klass* class2) const {
2765   oop classloader1 = this->class_loader();
2766   PackageEntry* classpkg1 = this->package();
2767   if (class2->is_objArray_klass()) {
2768     class2 = ObjArrayKlass::cast(class2)->bottom_klass();
2769   }
2770 
2771   oop classloader2;
2772   PackageEntry* classpkg2;
2773   if (class2->is_instance_klass()) {


< prev index next >