690 }
691 }
692
693 // Allow all accesses from jdk/internal/reflect/MagicAccessorImpl subclasses to
694 // succeed trivially.
695 if (current_class->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
696 return true;
697 }
698
699 // Check for special relaxations
700 return can_relax_access_check_for(current_class, member_class, classloader_only);
701 }
702
703 bool Reflection::is_same_class_package(const Klass* class1, const Klass* class2) {
704 return InstanceKlass::cast(class1)->is_same_class_package(class2);
705 }
706
707 // Checks that the 'outer' klass has declared 'inner' as being an inner klass. If not,
708 // throw an incompatible class change exception
709 // If inner_is_member, require the inner to be a member of the outer.
710 // If !inner_is_member, require the inner to be unsafe anonymous (a non-member).
711 // Caller is responsible for figuring out in advance which case must be true.
712 void Reflection::check_for_inner_class(const InstanceKlass* outer, const InstanceKlass* inner,
713 bool inner_is_member, TRAPS) {
714 InnerClassesIterator iter(outer);
715 constantPoolHandle cp (THREAD, outer->constants());
716 for (; !iter.done(); iter.next()) {
717 int ioff = iter.inner_class_info_index();
718 int ooff = iter.outer_class_info_index();
719
720 if (inner_is_member && ioff != 0 && ooff != 0) {
721 if (cp->klass_name_at_matches(outer, ooff) &&
722 cp->klass_name_at_matches(inner, ioff)) {
723 Klass* o = cp->klass_at(ooff, CHECK);
724 if (o == outer) {
725 Klass* i = cp->klass_at(ioff, CHECK);
726 if (i == inner) {
727 return;
728 }
729 }
730 }
|
690 }
691 }
692
693 // Allow all accesses from jdk/internal/reflect/MagicAccessorImpl subclasses to
694 // succeed trivially.
695 if (current_class->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
696 return true;
697 }
698
699 // Check for special relaxations
700 return can_relax_access_check_for(current_class, member_class, classloader_only);
701 }
702
703 bool Reflection::is_same_class_package(const Klass* class1, const Klass* class2) {
704 return InstanceKlass::cast(class1)->is_same_class_package(class2);
705 }
706
707 // Checks that the 'outer' klass has declared 'inner' as being an inner klass. If not,
708 // throw an incompatible class change exception
709 // If inner_is_member, require the inner to be a member of the outer.
710 // If !inner_is_member, require the inner to be hidden or unsafe anonymous (non-members).
711 // Caller is responsible for figuring out in advance which case must be true.
712 void Reflection::check_for_inner_class(const InstanceKlass* outer, const InstanceKlass* inner,
713 bool inner_is_member, TRAPS) {
714 InnerClassesIterator iter(outer);
715 constantPoolHandle cp (THREAD, outer->constants());
716 for (; !iter.done(); iter.next()) {
717 int ioff = iter.inner_class_info_index();
718 int ooff = iter.outer_class_info_index();
719
720 if (inner_is_member && ioff != 0 && ooff != 0) {
721 if (cp->klass_name_at_matches(outer, ooff) &&
722 cp->klass_name_at_matches(inner, ioff)) {
723 Klass* o = cp->klass_at(ooff, CHECK);
724 if (o == outer) {
725 Klass* i = cp->klass_at(ioff, CHECK);
726 if (i == inner) {
727 return;
728 }
729 }
730 }
|