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); |