Mercurial > hg > graal-jvmci-8
diff graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java @ 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 | 6e4fb0ccebb1 |
children | 3c68170fc9b0 |
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();