# HG changeset patch # User Doug Simon # Date 1363687800 -3600 # Node ID fa5a670a1682eb898b421296bbf47ad3af33f4b3 # Parent 6084a9e51fc2aade29dc5d0b221b11d22bd58029 added support for substituting constructors diff -r 6084a9e51fc2 -r fa5a670a1682 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotSnippetInstaller.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotSnippetInstaller.java Tue Mar 19 09:42:38 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotSnippetInstaller.java Tue Mar 19 11:10:00 2013 +0100 @@ -42,7 +42,7 @@ } @Override - protected void installMethodSubstitution(Method originalMethod, Method substituteMethod) { + protected void installMethodSubstitution(Member originalMethod, Method substituteMethod) { if (substituteMethod.getDeclaringClass() == IntegerSubstitutions.class || substituteMethod.getDeclaringClass() == LongSubstitutions.class) { if (substituteMethod.getName().equals("bitCount")) { if (!config.usePopCountInstruction) { diff -r 6084a9e51fc2 -r fa5a670a1682 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 09:42:38 2013 +0100 +++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetInstaller.java Tue Mar 19 11:10:00 2013 +0100 @@ -125,13 +125,13 @@ } String originalName = originalName(substituteMethod, methodSubstitution.value()); Class[] originalParameters = originalParameters(substituteMethod, methodSubstitution.signature(), methodSubstitution.isStatic()); - Method originalMethod = originalMethod(classSubstitution, originalName, originalParameters); + Member originalMethod = originalMethod(classSubstitution, originalName, originalParameters); installMethodSubstitution(originalMethod, substituteMethod); } if (macroSubstitution != null) { String originalName = originalName(substituteMethod, macroSubstitution.value()); Class[] originalParameters = originalParameters(substituteMethod, macroSubstitution.signature(), macroSubstitution.isStatic()); - Method originalMethod = originalMethod(classSubstitution, originalName, originalParameters); + Member originalMethod = originalMethod(classSubstitution, originalName, originalParameters); installMacroSubstitution(originalMethod, macroSubstitution.macro()); } } @@ -145,17 +145,26 @@ /** * Installs a method substitution. * - * @param originalMethod a method being substituted + * @param originalMethod a method or constructor being substituted * @param substituteMethod the substitute method */ - protected void installMethodSubstitution(Method originalMethod, Method substituteMethod) { + protected void installMethodSubstitution(Member originalMethod, Method substituteMethod) { substitute = runtime.lookupJavaMethod(substituteMethod); - original = runtime.lookupJavaMethod(originalMethod); + if (originalMethod instanceof Method) { + original = runtime.lookupJavaMethod((Method) originalMethod); + } else { + original = runtime.lookupJavaConstructor((Constructor) originalMethod); + } try { - Debug.log("substitution: " + MetaUtil.format("%H.%n(%p)", original) + " --> " + MetaUtil.format("%H.%n(%p)", substitute)); + Debug.log("inlinable substitution: " + MetaUtil.format("%H.%n(%p)", original) + " --> " + MetaUtil.format("%H.%n(%p)", substitute)); StructuredGraph graph = makeGraph(substitute, inliningPolicy(substitute)); Object oldValue = original.getCompilerStorage().put(Graph.class, graph); assert oldValue == null; + + Debug.log("compilable substitution: " + MetaUtil.format("%H.%n(%p)", original) + " --> " + MetaUtil.format("%H.%n(%p)", substitute)); + graph = makeGraph(substitute, inliningPolicy(substitute)); + oldValue = original.getCompilerStorage().put(MethodSubstitution.class, graph); + assert oldValue == null; } finally { substitute = null; original = null; @@ -166,11 +175,16 @@ /** * Installs a macro substitution. * - * @param originalMethod a method being substituted + * @param originalMethod a method or constructor being substituted * @param macro the substitute macro node class */ - protected void installMacroSubstitution(Method originalMethod, Class macro) { - ResolvedJavaMethod originalJavaMethod = runtime.lookupJavaMethod(originalMethod); + protected void installMacroSubstitution(Member originalMethod, Class macro) { + ResolvedJavaMethod originalJavaMethod; + if (originalMethod instanceof Method) { + originalJavaMethod = runtime.lookupJavaMethod((Method) originalMethod); + } else { + originalJavaMethod = runtime.lookupJavaConstructor((Constructor) originalMethod); + } Object oldValue = originalJavaMethod.getCompilerStorage().put(Node.class, macro); assert oldValue == null; } @@ -360,13 +374,17 @@ return parameters; } - private static Method originalMethod(ClassSubstitution classSubstitution, String name, Class[] parameters) { + private static Member originalMethod(ClassSubstitution classSubstitution, String name, Class[] parameters) { Class originalClass = classSubstitution.value(); if (originalClass == ClassSubstitution.class) { originalClass = resolveType(classSubstitution.className()); } try { - return originalClass.getDeclaredMethod(name, parameters); + if (name.equals("")) { + return originalClass.getDeclaredConstructor(parameters); + } else { + return originalClass.getDeclaredMethod(name, parameters); + } } catch (NoSuchMethodException | SecurityException e) { throw new GraalInternalError(e); }