Mercurial > hg > graal-compiler
changeset 8360:fa5a670a1682
added support for substituting constructors
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Tue, 19 Mar 2013 11:10:00 +0100 |
parents | 6084a9e51fc2 |
children | 5981ea5996e8 |
files | graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotSnippetInstaller.java graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetInstaller.java |
diffstat | 2 files changed, 30 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- 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) {
--- 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<? extends FixedWithNextNode> macro) { - ResolvedJavaMethod originalJavaMethod = runtime.lookupJavaMethod(originalMethod); + protected void installMacroSubstitution(Member originalMethod, Class<? extends FixedWithNextNode> 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("<init>")) { + return originalClass.getDeclaredConstructor(parameters); + } else { + return originalClass.getDeclaredMethod(name, parameters); + } } catch (NoSuchMethodException | SecurityException e) { throw new GraalInternalError(e); }