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()) {
|