changeset 9215:bd067a48a9c2

Changed execute method generation strategy. Limited it for primitive execute methods.
author Christian Humer <christian.humer@gmail.com>
date Mon, 08 Apr 2013 18:17:53 +0200
parents 9f3bade42fd2
children 8b9ea2f5c36e
files graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/Utils.java graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/ExecutableTypeData.java graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java
diffstat 3 files changed, 52 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/Utils.java	Mon Apr 08 18:16:19 2013 +0200
+++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/Utils.java	Mon Apr 08 18:17:53 2013 +0200
@@ -332,6 +332,10 @@
         return mirror.getKind().isPrimitive();
     }
 
+    public static boolean isPrimitiveOrVoid(TypeMirror mirror) {
+        return isPrimitive(mirror) || isVoid(mirror);
+    }
+
     public static List<String> getQualifiedSuperTypeNames(TypeElement element) {
         List<TypeElement> types = getSuperTypes(element);
         List<String> qualifiedNames = new ArrayList<>();
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/ExecutableTypeData.java	Mon Apr 08 18:16:19 2013 +0200
+++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/ExecutableTypeData.java	Mon Apr 08 18:17:53 2013 +0200
@@ -59,6 +59,10 @@
         return getMethod().getModifiers().contains(Modifier.FINAL);
     }
 
+    public boolean isAbstract() {
+        return getMethod().getModifiers().contains(Modifier.ABSTRACT);
+    }
+
     @Override
     public int hashCode() {
         return type.hashCode();
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java	Mon Apr 08 18:16:19 2013 +0200
+++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java	Mon Apr 08 18:17:53 2013 +0200
@@ -1104,25 +1104,23 @@
                 }
             }
 
+            TypeData primaryType = specialization.getReturnType().getActualTypeData(node.getTypeSystem());
+
             for (ExecutableTypeData execType : node.getExecutableTypes()) {
                 if (execType.isFinal()) {
                     continue;
                 }
-                CodeExecutableElement method = CodeExecutableElement.clone(getContext().getEnvironment(), execType.getMethod());
-                if (method.getParameters().size() == 1) {
-                    CodeVariableElement var = CodeVariableElement.clone(method.getParameters().get(0));
-                    var.setName("frameValue");
-                    method.getParameters().set(0, var);
+
+                if (primaryType == execType.getType()) {
+                    CodeExecutableElement executeMethod = createExecutableTypeOverride(execType);
+                    clazz.add(executeMethod);
+                    executeMethod.setBodyTree(createFunctionalExecute(executeMethod.createBuilder(), specialization));
+                } else if (needsCastingExecuteMethod(execType, primaryType)) {
+                    CodeExecutableElement executeMethod = createExecutableTypeOverride(execType);
+                    clazz.add(executeMethod);
+                    executeMethod.setBodyTree(createCastingExecute(executeMethod.createBuilder(), specialization, execType.getType()));
                 }
-                method.getModifiers().remove(Modifier.ABSTRACT);
-                clazz.add(method);
 
-                TypeData primaryType = specialization.getReturnType().getActualTypeData(node.getTypeSystem());
-                if (primaryType == execType.getType()) {
-                    buildFunctionalExecuteMethod(method.createBuilder(), specialization);
-                } else {
-                    buildCastingExecuteMethod(method.createBuilder(), specialization, execType.getType());
-                }
             }
 
             if (node.needsRewrites(getContext()) && !specialization.isGeneric() && !specialization.isUninitialized()) {
@@ -1130,7 +1128,32 @@
             }
         }
 
-        private void buildCastingExecuteMethod(CodeTreeBuilder builder, SpecializationData specialization, TypeData type) {
+        private CodeExecutableElement createExecutableTypeOverride(ExecutableTypeData execType) {
+            CodeExecutableElement method = CodeExecutableElement.clone(getContext().getEnvironment(), execType.getMethod());
+            if (method.getParameters().size() == 1) {
+                CodeVariableElement var = CodeVariableElement.clone(method.getParameters().get(0));
+                var.setName("frameValue");
+                method.getParameters().set(0, var);
+            }
+            method.getModifiers().remove(Modifier.ABSTRACT);
+            return method;
+        }
+
+        private boolean needsCastingExecuteMethod(ExecutableTypeData execType, TypeData primaryType) {
+            if (execType.isAbstract()) {
+                return true;
+            }
+            if (Utils.isPrimitiveOrVoid(primaryType.getPrimitiveType()) && Utils.isPrimitiveOrVoid(execType.getType().getPrimitiveType())) {
+                return true;
+            }
+            if (execType.getType().isGeneric()) {
+                return true;
+            }
+            return false;
+        }
+
+        private CodeTree createCastingExecute(CodeTreeBuilder parent, SpecializationData specialization, TypeData type) {
+            CodeTreeBuilder builder = new CodeTreeBuilder(parent);
             NodeData node = specialization.getNode();
             TypeSystemData typeSystem = node.getTypeSystem();
 
@@ -1143,7 +1166,7 @@
 
             CodeTree primaryExecuteCall = null;
 
-            CodeTreeBuilder executeBuilder = CodeTreeBuilder.createBuilder();
+            CodeTreeBuilder executeBuilder = new CodeTreeBuilder(builder);
             buildExecute(executeBuilder, null, null, execType);
             primaryExecuteCall = executeBuilder.getRoot();
 
@@ -1186,6 +1209,8 @@
                     builder.end();
                 }
             }
+
+            return builder.getRoot();
         }
 
         private CodeTree createExpectType(NodeData node, ExecutableTypeData castedType, CodeTree value) {
@@ -1211,7 +1236,8 @@
             return builder.getRoot();
         }
 
-        private void buildFunctionalExecuteMethod(CodeTreeBuilder builder, SpecializationData specialization) {
+        private CodeTree createFunctionalExecute(CodeTreeBuilder parent, SpecializationData specialization) {
+            CodeTreeBuilder builder = new CodeTreeBuilder(parent);
             if (specialization.isUninitialized()) {
                 builder.tree(createDeoptimize(builder));
             }
@@ -1230,6 +1256,8 @@
                 returnSpecialized = createReturnSpecializeAndExecute(builder, next, null);
             }
             builder.tree(createGuardAndCast(builder, null, specialization, specialization, true, executeNode, returnSpecialized));
+
+            return builder.getRoot();
         }
 
         private CodeTree createDeoptimize(CodeTreeBuilder parent) {