RFR: 8009130 JCK lambda test fails with IllegalAccessException
Karen Kinnear
karen.kinnear at oracle.com
Wed Jul 24 14:33:49 PDT 2013
Please review fix for access checking and loader constraint checking for default methods:
http://cr.openjdk.java.net/~acorn/8009130/webrev/
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8009130
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8013085
Summary:
Now that javac is generating bridges for generic signatures in interfaces, and the JVM
does not need to handle generic signatures and covariant returns in handling default methods,
it is possible to simplify the handling of default methods.
Default methods are concrete methods in interfaces. Their inheritance rules simplified are:
1. class method or superclass method wins
2. if there is a unique nonshadowed default method in superinterfaces it is chosen
(this logic was not changed, and many thanks to Keith McGuigan for writing that code so well)
3. otherwise we get an AbstractMethodError on invocation
Before this change, we created overpass (VM created bridge methods) added them to
the methods array and updated the constant pool. This allowed us to add checkcasts for
input and return arguments. We don't need those anymore so we don't need overpass methods
for default handling. The overpass methods added invokespecial invocation instructions which
ran into issues with access checking, i.e. not being able to access the constantpool of the
invokespecial linktime resolved method, since they did not always have permission to access the
interface class.
With this change default methods are added as an array to instanceKlass and to the instanceKlass vtable.
Invocation method search order:
1. local methods
2. superclass methods
3. default methods
4. abstract interface methods
The default methods retain their superinterface method_holder, i.e. owning klass, so the
access checking and loader constraint checking all works as expected with no special logic
needed.
We continue to use overpasses for default exception handling, e.g. to create a custom
AbstractMethodError for the conflict case above.
Tests run - all on linux64:
jck vm
expect a new failure mode for resolveMethod00602m1 and resolveMethod00602m2 in fastdebug
- they will get an assertion. They will be in the jck exclude list next week due to an existing bug: 8011311, support for
private instance methods in interfaces not working.
jck lang
jtreg jdk (concurrency=1) : java.util, java.lang, jdk.lambda
nsk vm.quick.testlist, vm.mlvm, vm.quick-jvmti.testlist
8009130 package private example
specifically fixes:
lang/CLSS/clss475/clss47501m21 and clss47501m211
lang/INTF/intf024/intf02402m01 and intf02402m11
8013085 loader constraint example
nsk defmeth tests - with and without redefineclasses
- passes all tests that passed before this change, other existing bugs prevent complete passing
Reflect2 - reflection modeling
reflect.invoke - DefaultStaticTest.java
intfbug test
jcmd GC:class_stats
thanks,
Karen
More information about the hotspot-dev
mailing list