# HG changeset patch # User Doug Simon # Date 1363699426 -3600 # Node ID b8666670daf5fc24c48d09081a1a92ef8db62dbc # Parent c2e39aa097c5c9e0880766e96f958632e8c397db# Parent 5981ea5996e8d86304800efddfb904c85b8e0f3f Merge. diff -r c2e39aa097c5 -r b8666670daf5 graal/com.oracle.graal.hotspot.amd64.test/src/com/oracle/graal/hotspot/amd64/test/AMD64HotSpotFrameOmissionTest.java diff -r c2e39aa097c5 -r b8666670daf5 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 14:08:54 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotSnippetInstaller.java Tue Mar 19 14:23:46 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 c2e39aa097c5 -r b8666670daf5 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:08:54 2013 +0100 +++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetInstaller.java Tue Mar 19 14:23:46 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); } diff -r c2e39aa097c5 -r b8666670daf5 graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java --- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java Tue Mar 19 14:08:54 2013 +0100 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java Tue Mar 19 14:23:46 2013 +0100 @@ -1193,11 +1193,11 @@ builder.tree(createExecuteChildren(builder, specialization)); + CodeTree executeNode; if (specialization.isUninitialized()) { builder.tree(createSpecializeCall(builder, specialization)); } - - CodeTree executeNode = createExecute(builder, specialization); + executeNode = createExecute(builder, specialization); SpecializationData next = specialization.findNextSpecialization(); CodeTree returnSpecialized = null; @@ -1243,9 +1243,15 @@ builder.startTryBlock(); } - if (specialization.getMethod() == null && !node.needsRewrites(context)) { + if (specialization.isUninitialized()) { + String genericMethodName = generatedGenericMethodName(null); + builder.startReturn().startCall(factoryClassName(node), genericMethodName); + builder.string("this"); + addInternalValueParameterNames(builder, specialization, null, true, true); + builder.end().end(); + } else if (specialization.getMethod() == null && !node.needsRewrites(context)) { emitEncounteredSynthetic(builder); - } else if (specialization.isUninitialized() || specialization.isGeneric()) { + } else if (specialization.isGeneric()) { String genericMethodName; if (!specialization.isUseSpecializationsForGeneric()) { genericMethodName = generatedGenericMethodName(specialization);