< prev index next >

src/hotspot/share/runtime/reflection.cpp

Print this page

        

*** 707,720 **** } // private access between different classes needs a nestmate check, but // not for anonymous classes - so check host_class if (access.is_private() && host_class == current_class) { if (current_class->is_instance_klass() && field_class->is_instance_klass() ) { InstanceKlass* cur_ik = const_cast<InstanceKlass*>(InstanceKlass::cast(current_class)); InstanceKlass* field_ik = const_cast<InstanceKlass*>(InstanceKlass::cast(field_class)); ! if (cur_ik->has_nestmate_access_to(field_ik, Thread::current())) { guarantee(resolved_class->is_subclass_of(field_class), "must be!"); return true; } } } --- 707,727 ---- } // private access between different classes needs a nestmate check, but // not for anonymous classes - so check host_class if (access.is_private() && host_class == current_class) { + // FIXME: can we actually get here with non-instance classes? if (current_class->is_instance_klass() && field_class->is_instance_klass() ) { InstanceKlass* cur_ik = const_cast<InstanceKlass*>(InstanceKlass::cast(current_class)); InstanceKlass* field_ik = const_cast<InstanceKlass*>(InstanceKlass::cast(field_class)); ! // Nestmate access checks may require resolution and validation of the nest-host ! Thread* THREAD = Thread::current(); ! bool access = cur_ik->has_nestmate_access_to(field_ik, THREAD); ! if (HAS_PENDING_EXCEPTION) { ! return false; ! } ! if (access) { guarantee(resolved_class->is_subclass_of(field_class), "must be!"); return true; } } }
< prev index next >