# HG changeset patch # User Doug Simon # Date 1363703890 -3600 # Node ID 86a9e3ea8fe9e691fcbe7fb25a94df98ea9a649c # Parent 2ee5508896f1b6d667aee98b76f1b7fa18e8d02e support substitutions for classes that made not be part of the runtime (GRAAL-123) diff -r 2ee5508896f1 -r 86a9e3ea8fe9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/AESCryptSubstitutions.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/AESCryptSubstitutions.java Tue Mar 19 14:50:27 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/AESCryptSubstitutions.java Tue Mar 19 15:38:10 2013 +0100 @@ -41,7 +41,7 @@ /** * Substitutions for {@code com.sun.crypto.provider.AESCrypt} methods. */ -@ClassSubstitution(className = "com.sun.crypto.provider.AESCrypt") +@ClassSubstitution(className = "com.sun.crypto.provider.AESCrypt", optional = true) public class AESCryptSubstitutions { static final long kOffset; diff -r 2ee5508896f1 -r 86a9e3ea8fe9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/CipherBlockChainingSubstitutions.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/CipherBlockChainingSubstitutions.java Tue Mar 19 14:50:27 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/CipherBlockChainingSubstitutions.java Tue Mar 19 15:38:10 2013 +0100 @@ -42,7 +42,7 @@ /** * Substitutions for {@code com.sun.crypto.provider.CipherBlockChaining} methods. */ -@ClassSubstitution(className = "com.sun.crypto.provider.CipherBlockChaining") +@ClassSubstitution(className = "com.sun.crypto.provider.CipherBlockChaining", optional = true) public class CipherBlockChainingSubstitutions { private static final long embeddedCipherOffset; diff -r 2ee5508896f1 -r 86a9e3ea8fe9 graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/ClassSubstitution.java --- a/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/ClassSubstitution.java Tue Mar 19 14:50:27 2013 +0100 +++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/ClassSubstitution.java Tue Mar 19 15:38:10 2013 +0100 @@ -56,6 +56,12 @@ String className() default ""; /** + * Determines if the substitutions are for classes that may not be part of the runtime. + * Substitutions for such classes are omitted if the original classes cannot be found. + */ + boolean optional() default false; + + /** * Denotes a substitute method. A substitute method can call the original/substituted method by * making a recursive call to itself. */ diff -r 2ee5508896f1 -r 86a9e3ea8fe9 graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetInstaller.java --- a/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetInstaller.java Tue Mar 19 14:50:27 2013 +0100 +++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetInstaller.java Tue Mar 19 15:38:10 2013 +0100 @@ -126,13 +126,17 @@ String originalName = originalName(substituteMethod, methodSubstitution.value()); Class[] originalParameters = originalParameters(substituteMethod, methodSubstitution.signature(), methodSubstitution.isStatic()); Member originalMethod = originalMethod(classSubstitution, originalName, originalParameters); - installMethodSubstitution(originalMethod, substituteMethod); + if (originalMethod != null) { + installMethodSubstitution(originalMethod, substituteMethod); + } } if (macroSubstitution != null) { String originalName = originalName(substituteMethod, macroSubstitution.value()); Class[] originalParameters = originalParameters(substituteMethod, macroSubstitution.signature(), macroSubstitution.isStatic()); Member originalMethod = originalMethod(classSubstitution, originalName, originalParameters); - installMacroSubstitution(originalMethod, macroSubstitution.macro()); + if (originalMethod != null) { + installMacroSubstitution(originalMethod, macroSubstitution.macro()); + } } } } @@ -333,13 +337,23 @@ } } - private static Class resolveType(String className) { + /** + * Resolves a name to a class. + * + * @param className the name of the class to resolve + * @param optional if true, resolution failure returns null + * @return the resolved class or null if resolution fails and {@code optional} is true + */ + private static Class resolveType(String className, boolean optional) { try { // Need to use launcher class path to handle classes // that are not on the boot class path ClassLoader cl = Launcher.getLauncher().getClassLoader(); return Class.forName(className, false, cl); } catch (ClassNotFoundException e) { + if (optional) { + return null; + } throw new GraalInternalError("Could not resolve type " + className); } } @@ -352,7 +366,7 @@ dimensions++; } - Class baseClass = base.getKind() != Kind.Object ? base.getKind().toJavaClass() : resolveType(toJavaName(base)); + Class baseClass = base.getKind() != Kind.Object ? base.getKind().toJavaClass() : resolveType(toJavaName(base), false); return dimensions == 0 ? baseClass : Array.newInstance(baseClass, new int[dimensions]).getClass(); } @@ -377,7 +391,11 @@ private static Member originalMethod(ClassSubstitution classSubstitution, String name, Class[] parameters) { Class originalClass = classSubstitution.value(); if (originalClass == ClassSubstitution.class) { - originalClass = resolveType(classSubstitution.className()); + originalClass = resolveType(classSubstitution.className(), classSubstitution.optional()); + if (originalClass == null) { + // optional class was not found + return null; + } } try { if (name.equals("")) {