[prev in list] [next in list] [prev in thread] [next in thread]
List: openjdk-mlvm-dev
Subject: Request for reviews (M): 6939196: method handle signatures off the boot class path get linkage error
From: John.Rose () Sun ! COM (John Rose)
Date: 2010-03-30 11:06:31
Message-ID: C3CB1EDC-A1A5-431F-8737-0A3CF890E707 () sun ! com
[Download RAW message or body]
6939196: method handle signatures off the boot class path get linkage errors
http://cr.openjdk.java.net/~jrose/6939196/hs-webrev.00/
http://cr.openjdk.java.net/~jrose/6939196/jdk-webrev.00/
The bugtraq description is copied below.
- Adjust MethodType lookup logic to search off the BCP, but not to cache those \
results.
- Pass accessing class where it needs to be seen.
- A SignatureStream idiom "as_klass" for class lookup has been refactored.
Please review the JDK changes along with the JVM changes. They are very simple:
- Remove workaround from MethodHandleImpl lookup code
- Add JUnit regression test to MethodHandlesTest
-- John
P.S. Here is the description from bugtraq.
The following test program throws an error on the marked line. The problem is a \
weakness in the current JSR 292 Reference Implementation logic for resolving \
MethodTypes that mention types not on the boot class path.
The workaround, therefore, is to load your entire JSR 292 application using \
-Xbootclasspath/a:myapp.jar.
import java.dyn.*;
import static java.dyn.MethodHandles.*;
import static java.dyn.MethodType.*;
public class BCPBug {
// Local class which appears in method signature;
static class Example { }
static void bcpTypesOnly(Object x) { System.out.println("bcpTypesOnly"); }
static void hasUserType(Example x) { System.out.println("hasUserType"); }
public static void main(String... av) throws Throwable {
Lookup lookup = lookup();
MethodHandle bcpTypesOnly = lookup.findStatic(lookup.lookupClass(), \
"bcpTypesOnly", methodType(void.class, Object.class));
MethodHandle hasUserType = lookup.findStatic(lookup.lookupClass(), \
"hasUserType", methodType(void.class, Example.class));
bcpTypesOnly.<void>invokeExact((Object)null);
hasUserType.<void>invokeExact((Example)null); // throws NoClassDefFoundError \
on BCPBug$Example }
}
/* Run:
$ $JAVA7X_HOME/bin/javac -d . BCPBug.java
$ $JAVA7X_HOME/bin/java -XX:+UnlockExperimentalVMOptions -XX:+EnableMethodHandles -cp \
. BCPBug bcpTypesOnly
Exception in thread "main" java.lang.NoClassDefFoundError: BCPBug$Example
at BCPBug.main(BCPBug.java:17)
*/
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic