changeset 7858:4958cbdbf360

Fixed minor bugs in NodeFactory generation.
author Christian Humer <christian.humer@gmail.com>
date Mon, 25 Feb 2013 14:22:18 +0100
parents c8e1c5abf6ed
children 3c68170fc9b0
files graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java
diffstat 1 files changed, 31 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java	Mon Feb 25 13:59:43 2013 +0100
+++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java	Mon Feb 25 14:22:18 2013 +0100
@@ -423,7 +423,7 @@
             add(factory, node);
         }
 
-        if (node.needsFactory() || childTypes.size() > 0) {
+        if (node.needsFactory() || node.getNodeChildren().size() > 0) {
             add(new NodeFactoryFactory(context, childTypes), node);
         }
     }
@@ -515,7 +515,7 @@
                 clazz.add(createCreateNodeSpecializedMethod(node, createVisibility));
                 clazz.add(createGetNodeClassMethod(node));
                 clazz.add(createGetNodeSignaturesMethod(node));
-                clazz.add(createGetInstanceMethod(node, clazz.asType(), createVisibility));
+                clazz.add(createGetInstanceMethod(node, createVisibility));
                 clazz.add(createInstanceConstant(node, clazz.asType()));
             }
 
@@ -538,17 +538,9 @@
                 }
             }
 
-            if (node.getParent() == null && node.getDeclaredChildren().size() > 0) {
-                List<NodeData> children = node.getNodeChildren();
-                List<TypeMirror> types = new ArrayList<>();
-                if (node.needsFactory()) {
-                    types.add(node.getNodeType());
-                }
-                for (NodeData child : children) {
-                    types.add(child.getTemplateType().asType());
-                }
-                TypeMirror commonSuperType = Utils.getCommonSuperType(getContext(), types.toArray(new TypeMirror[types.size()]));
-                clazz.add(createGetFactories(node, commonSuperType));
+            List<NodeData> children = node.getNodeChildren();
+            if (node.getParent() == null && children.size() > 0) {
+                clazz.add(createGetFactories(node));
             }
 
         }
@@ -680,8 +672,12 @@
             return method;
         }
 
-        private ExecutableElement createGetInstanceMethod(NodeData node, TypeMirror factoryType, Modifier visibility) {
-            CodeExecutableElement method = new CodeExecutableElement(modifiers(), factoryType, "getInstance");
+        private ExecutableElement createGetInstanceMethod(NodeData node, Modifier visibility) {
+            Types types = getContext().getEnvironment().getTypeUtils();
+            TypeElement nodeFactoryType = Utils.fromTypeMirror(getContext().getType(NodeFactory.class));
+            TypeMirror returnType = types.getDeclaredType(nodeFactoryType, node.getNodeType());
+
+            CodeExecutableElement method = new CodeExecutableElement(modifiers(), returnType, "getInstance");
             if (visibility != null) {
                 method.getModifiers().add(visibility);
             }
@@ -721,21 +717,33 @@
             return var;
         }
 
-        private ExecutableElement createGetFactories(NodeData node, TypeMirror commonSuperType) {
+        private ExecutableElement createGetFactories(NodeData node) {
+            List<NodeData> children = node.getNodeChildren();
+            if (node.needsFactory()) {
+                children.add(node);
+            }
+
+            List<TypeMirror> nodeTypesList = new ArrayList<>();
+            for (NodeData child : children) {
+                nodeTypesList.add(child.getTemplateType().asType());
+            }
+            TypeMirror commonNodeSuperType = Utils.getCommonSuperType(getContext(), nodeTypesList.toArray(new TypeMirror[nodeTypesList.size()]));
+
             Types types = getContext().getEnvironment().getTypeUtils();
-            TypeMirror classType = getContext().getType(NodeFactory.class);
-            TypeMirror classWithWildcards = types.getDeclaredType(Utils.fromTypeMirror(classType), types.getWildcardType(commonSuperType, null));
-            TypeMirror listType = types.getDeclaredType(Utils.fromTypeMirror(getContext().getType(List.class)), classWithWildcards);
+            TypeMirror factoryType = getContext().getType(NodeFactory.class);
+            TypeMirror baseType;
+            if (children.size() == 1) {
+                baseType = types.getDeclaredType(Utils.fromTypeMirror(factoryType), commonNodeSuperType);
+            } else {
+                baseType = types.getDeclaredType(Utils.fromTypeMirror(factoryType), types.getWildcardType(commonNodeSuperType, null));
+            }
+            TypeMirror listType = types.getDeclaredType(Utils.fromTypeMirror(getContext().getType(List.class)), baseType);
 
             CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC, STATIC), listType, "getFactories");
 
             CodeTreeBuilder builder = method.createBuilder();
             builder.startReturn();
             builder.startStaticCall(getContext().getType(Arrays.class), "asList");
-            List<NodeData> children = node.getNodeChildren();
-            if (node.needsFactory()) {
-                children.add(node);
-            }
 
             for (NodeData child : children) {
                 builder.startGroup();