# HG changeset patch # User Doug Simon # Date 1365442479 -7200 # Node ID 59e751e68bea8e4711495cb483033af273227c6b # Parent 8ddaac81cb21c41f771ada9be700d7ae3f3a9ed8 made method (and macro) substitution optional to support different JDK versions diff -r 8ddaac81cb21 -r 59e751e68bea graal/com.oracle.graal.api.replacements/src/com/oracle/graal/api/replacements/MethodSubstitution.java --- a/graal/com.oracle.graal.api.replacements/src/com/oracle/graal/api/replacements/MethodSubstitution.java Mon Apr 08 18:47:06 2013 +0200 +++ b/graal/com.oracle.graal.api.replacements/src/com/oracle/graal/api/replacements/MethodSubstitution.java Mon Apr 08 19:34:39 2013 +0200 @@ -54,4 +54,11 @@ * is the same as the substitute method. */ String signature() default ""; + + /** + * Determines if the substitution is for a method that may not be part of the runtime. For + * example, a method introduced in a later JDK version. Substitutions for such methods are + * omitted if the original method cannot be found. + */ + boolean optional() default false; } diff -r 8ddaac81cb21 -r 59e751e68bea graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/MacroSubstitution.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/MacroSubstitution.java Mon Apr 08 18:47:06 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/MacroSubstitution.java Mon Apr 08 19:34:39 2013 +0200 @@ -61,6 +61,13 @@ String signature() default ""; /** + * Determines if the substitution is for a method that may not be part of the runtime. For + * example, a method introduced in a later JDK version. Substitutions for such methods are + * omitted if the original method cannot be found. + */ + boolean optional() default false; + + /** * The node class with which the method invocation should be replaced. It needs to be a subclass * of {@link FixedWithNextNode}, and it is expected to provide a public constructor that takes * an {@link InvokeNode} as a parameter. diff -r 8ddaac81cb21 -r 59e751e68bea graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Mon Apr 08 18:47:06 2013 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Mon Apr 08 19:34:39 2013 +0200 @@ -147,7 +147,7 @@ } String originalName = originalName(substituteMethod, methodSubstitution.value()); Class[] originalParameters = originalParameters(substituteMethod, methodSubstitution.signature(), methodSubstitution.isStatic()); - Member originalMethod = originalMethod(classSubstitution, originalName, originalParameters); + Member originalMethod = originalMethod(classSubstitution, methodSubstitution.optional(), originalName, originalParameters); if (originalMethod != null) { registerMethodSubstitution(originalMethod, substituteMethod); } @@ -155,7 +155,7 @@ if (macroSubstitution != null) { String originalName = originalName(substituteMethod, macroSubstitution.value()); Class[] originalParameters = originalParameters(substituteMethod, macroSubstitution.signature(), macroSubstitution.isStatic()); - Member originalMethod = originalMethod(classSubstitution, originalName, originalParameters); + Member originalMethod = originalMethod(classSubstitution, macroSubstitution.optional(), originalName, originalParameters); if (originalMethod != null) { registerMacroSubstitution(originalMethod, macroSubstitution.macro()); } @@ -448,7 +448,7 @@ return parameters; } - private static Member originalMethod(ClassSubstitution classSubstitution, String name, Class[] parameters) { + private static Member originalMethod(ClassSubstitution classSubstitution, boolean optional, String name, Class[] parameters) { Class originalClass = classSubstitution.value(); if (originalClass == ClassSubstitution.class) { originalClass = resolveType(classSubstitution.className(), classSubstitution.optional()); @@ -464,6 +464,9 @@ return originalClass.getDeclaredMethod(name, parameters); } } catch (NoSuchMethodException | SecurityException e) { + if (optional) { + return null; + } throw new GraalInternalError(e); } }