# HG changeset patch # User Christian Humer # Date 1361798538 -3600 # Node ID 4958cbdbf3605c8b31e46e1fb4c96a07f9ad22ea # Parent c8e1c5abf6ed2e785ae270ffd99f59bffc42d14a Fixed minor bugs in NodeFactory generation. diff -r c8e1c5abf6ed -r 4958cbdbf360 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 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 children = node.getNodeChildren(); - List 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 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 children = node.getNodeChildren(); + if (node.needsFactory()) { + children.add(node); + } + + List 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 children = node.getNodeChildren(); - if (node.needsFactory()) { - children.add(node); - } for (NodeData child : children) { builder.startGroup();