changeset 8371:b8666670daf5

Merge.
author Doug Simon <doug.simon@oracle.com>
date Tue, 19 Mar 2013 14:23:46 +0100
parents c2e39aa097c5 (current diff) 5981ea5996e8 (diff)
children 2ee5508896f1
files graal/com.oracle.graal.hotspot.amd64.test/src/com/oracle/graal/hotspot/amd64/test/AMD64HotSpotFrameOmissionTest.java
diffstat 3 files changed, 40 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- 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) {
--- 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<? 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);
         }
--- 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);