# HG changeset patch # User Doug Simon # Date 1357923013 -3600 # Node ID 867ec7c2a9ca7ea37e84a21d10d38b66e5b5b941 # Parent 8f7be0c45a82f71798ecdc5cb9ddff43ca132ba1 added support for writing substitutions for methods in package private classes diff -r 8f7be0c45a82 -r 867ec7c2a9ca 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 Fri Jan 11 15:05:31 2013 +0100 +++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/ClassSubstitution.java Fri Jan 11 17:50:13 2013 +0100 @@ -31,7 +31,24 @@ @Target(ElementType.TYPE) public @interface ClassSubstitution { - Class value(); + /** + * Specifies the substituted class. + *

+ * If the default value is specified for this element, then a non-default + * value must be given for the {@link #className()} element. + */ + Class value() default ClassSubstitution.class; + + /** + * Specifies the substituted class. + *

+ * This method is provided for cases where the substituted class + * is not accessible (according to Java language access control rules). + *

+ * If the default value is specified for this element, then a non-default + * value must be given for the {@link #value()} element. + */ + String className() default ""; /** * Used to map a substitute method to an original method where the default mapping diff -r 8f7be0c45a82 -r 867ec7c2a9ca 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 Fri Jan 11 15:05:31 2013 +0100 +++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetInstaller.java Fri Jan 11 17:50:13 2013 +0100 @@ -79,13 +79,30 @@ * annotated with {@link Snippet}. */ public void install(Class snippetsHolder) { - if (snippetsHolder.isAnnotationPresent(ClassSubstitution.class)) { - installSubstitutions(snippetsHolder, snippetsHolder.getAnnotation(ClassSubstitution.class).value()); + ClassSubstitution classSubs = snippetsHolder.getAnnotation(ClassSubstitution.class); + if (classSubs != null) { + Class< ? > originalClass = getOriginalClass(classSubs); + installSubstitutions(snippetsHolder, originalClass); } else { installSnippets(snippetsHolder); } } + private static Class< ? > getOriginalClass(ClassSubstitution classSubs) throws GraalInternalError { + Class originalClass = classSubs.value(); + if (originalClass == ClassSubstitution.class) { + assert !classSubs.className().isEmpty(); + try { + originalClass = Class.forName(classSubs.className()); + } catch (ClassNotFoundException e) { + throw new GraalInternalError("Could not resolve substituted class " + classSubs.className(), e); + } + } else { + assert classSubs.className().isEmpty(); + } + return originalClass; + } + private void installSnippets(Class< ? extends SnippetsInterface> clazz) { for (Method method : clazz.getDeclaredMethods()) { if (method.getAnnotation(Snippet.class) != null) {