hotspot/src/share/vm/runtime/reflection.cpp
changeset 38094 46977cd73d86
parent 37480 291ee208fb72
child 38151 fffedc5e5cf8
equal deleted inserted replaced
38090:34d0dd634032 38094:46977cd73d86
   500     if (DumpSharedSpaces) {
   500     if (DumpSharedSpaces) {
   501       return ACCESS_OK;
   501       return ACCESS_OK;
   502     }
   502     }
   503 
   503 
   504     // Find the module entry for current_class, the accessor
   504     // Find the module entry for current_class, the accessor
   505     ModuleEntry* module_from = InstanceKlass::cast(current_class)->module();
   505     ModuleEntry* module_from = current_class->module();
   506     // Find the module entry for new_class, the accessee
   506     // Find the module entry for new_class, the accessee
   507     if (new_class->is_objArray_klass()) {
   507     if (new_class->is_objArray_klass()) {
   508       new_class = ObjArrayKlass::cast(new_class)->bottom_klass();
   508       new_class = ObjArrayKlass::cast(new_class)->bottom_klass();
   509     }
   509     }
   510     if (!new_class->is_instance_klass()) {
   510     if (new_class->is_typeArray_klass()) {
   511       // Everyone can read a typearray.
   511       // A TypeArray's defining module is java.base, access to the TypeArray is allowed
   512       assert (new_class->is_typeArray_klass(), "Unexpected klass type");
       
   513       return ACCESS_OK;
   512       return ACCESS_OK;
   514     }
   513     }
   515     ModuleEntry* module_to = InstanceKlass::cast(new_class)->module();
   514     ModuleEntry* module_to = new_class->module();
   516 
   515 
   517     // both in same (possibly unnamed) module
   516     // both in same (possibly unnamed) module
   518     if (module_from == module_to) {
   517     if (module_from == module_to) {
   519       return ACCESS_OK;
   518       return ACCESS_OK;
   520     }
   519     }
   530     // Establish readability, check if module_from is allowed to read module_to.
   529     // Establish readability, check if module_from is allowed to read module_to.
   531     if (!module_from->can_read(module_to)) {
   530     if (!module_from->can_read(module_to)) {
   532       return MODULE_NOT_READABLE;
   531       return MODULE_NOT_READABLE;
   533     }
   532     }
   534 
   533 
   535     PackageEntry* package_to = InstanceKlass::cast(new_class)->package();
   534     PackageEntry* package_to = new_class->package();
   536     assert(package_to != NULL, "can not obtain new_class' package");
   535     assert(package_to != NULL, "can not obtain new_class' package");
   537 
   536 
   538     // Once readability is established, if module_to exports T unqualifiedly,
   537     // Once readability is established, if module_to exports T unqualifiedly,
   539     // (to all modules), than whether module_from is in the unnamed module
   538     // (to all modules), than whether module_from is in the unnamed module
   540     // or not does not matter, access is allowed.
   539     // or not does not matter, access is allowed.
   568                                           VerifyClassAccessResults result) {
   567                                           VerifyClassAccessResults result) {
   569   assert(result != ACCESS_OK, "must be failure result");
   568   assert(result != ACCESS_OK, "must be failure result");
   570   char * msg = NULL;
   569   char * msg = NULL;
   571   if (result != OTHER_PROBLEM && new_class != NULL && current_class != NULL) {
   570   if (result != OTHER_PROBLEM && new_class != NULL && current_class != NULL) {
   572     // Find the module entry for current_class, the accessor
   571     // Find the module entry for current_class, the accessor
   573     ModuleEntry* module_from = InstanceKlass::cast(current_class)->module();
   572     ModuleEntry* module_from = current_class->module();
   574     const char * module_from_name = module_from->is_named() ? module_from->name()->as_C_string() : UNNAMED_MODULE;
   573     const char * module_from_name = module_from->is_named() ? module_from->name()->as_C_string() : UNNAMED_MODULE;
   575     const char * current_class_name = current_class->external_name();
   574     const char * current_class_name = current_class->external_name();
   576 
   575 
   577     // Find the module entry for new_class, the accessee
   576     // Find the module entry for new_class, the accessee
   578     ModuleEntry* module_to = NULL;
   577     ModuleEntry* module_to = NULL;
   579     if (new_class->is_objArray_klass()) {
   578     module_to = new_class->module();
   580       new_class = ObjArrayKlass::cast(new_class)->bottom_klass();
       
   581     }
       
   582     if (new_class->is_instance_klass()) {
       
   583       module_to = InstanceKlass::cast(new_class)->module();
       
   584     } else {
       
   585       module_to = ModuleEntryTable::javabase_module();
       
   586     }
       
   587     const char * module_to_name = module_to->is_named() ? module_to->name()->as_C_string() : UNNAMED_MODULE;
   579     const char * module_to_name = module_to->is_named() ? module_to->name()->as_C_string() : UNNAMED_MODULE;
   588     const char * new_class_name = new_class->external_name();
   580     const char * new_class_name = new_class->external_name();
   589 
   581 
   590     if (result == MODULE_NOT_READABLE) {
   582     if (result == MODULE_NOT_READABLE) {
   591       assert(module_from->is_named(), "Unnamed modules can read all modules");
   583       assert(module_from->is_named(), "Unnamed modules can read all modules");
   609           current_class_name, module_from_name, new_class_name, uintx(identity_hash),
   601           current_class_name, module_from_name, new_class_name, uintx(identity_hash),
   610           module_from_name, uintx(identity_hash));
   602           module_from_name, uintx(identity_hash));
   611       }
   603       }
   612 
   604 
   613     } else if (result == TYPE_NOT_EXPORTED) {
   605     } else if (result == TYPE_NOT_EXPORTED) {
   614       assert(InstanceKlass::cast(new_class)->package() != NULL,
   606       assert(new_class->package() != NULL,
   615              "Unnamed packages are always exported");
   607              "Unnamed packages are always exported");
   616       const char * package_name =
   608       const char * package_name =
   617         InstanceKlass::cast(new_class)->package()->name()->as_klass_external_name();
   609         new_class->package()->name()->as_klass_external_name();
   618       assert(module_to->is_named(), "Unnamed modules export all packages");
   610       assert(module_to->is_named(), "Unnamed modules export all packages");
   619       if (module_from->is_named()) {
   611       if (module_from->is_named()) {
   620         size_t len = 118 + strlen(current_class_name) + 2*strlen(module_from_name) +
   612         size_t len = 118 + strlen(current_class_name) + 2*strlen(module_from_name) +
   621           strlen(new_class_name) + 2*strlen(module_to_name) + strlen(package_name);
   613           strlen(new_class_name) + 2*strlen(module_to_name) + strlen(package_name);
   622         msg = NEW_RESOURCE_ARRAY(char, len);
   614         msg = NEW_RESOURCE_ARRAY(char, len);