Mercurial > hg > truffle
diff graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java @ 13528:5a0c694ef735
Truffle-DSL: Removed API classes NodeId, NodeContainer and SpecializationListener.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Tue, 07 Jan 2014 18:52:32 +0100 |
parents | 25ecb47a6d0e |
children | 0576e9a0358e |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java Tue Jan 07 12:22:47 2014 +0100 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java Tue Jan 07 18:52:32 2014 +0100 @@ -47,6 +47,7 @@ private static final String EXECUTE_GENERIC_NAME = "executeGeneric0"; private static final String EXECUTE_SPECIALIZE_NAME = "executeAndSpecialize0"; + private static final String EXECUTE_POLYMORPHIC_NAME = "executePolymorphic0"; private static final String UPDATE_TYPES_NAME = "updateTypes"; @@ -70,16 +71,8 @@ return name; } - private static String nodePolymorphicClassName(NodeData node, SpecializationData specialization) { - String nodeid = resolveNodeId(node); - - String name = Utils.firstLetterUpperCase(nodeid); - if (specialization == node.getGenericPolymorphicSpecialization()) { - name += "PolymorphicNode"; - } else { - name += "Polymorphic" + polymorphicIndex(node, specialization) + "Node"; - } - return name; + private static String nodePolymorphicClassName(NodeData node) { + return Utils.firstLetterUpperCase(resolveNodeId(node)) + "PolymorphicNode"; } private static String resolveNodeId(NodeData node) { @@ -110,30 +103,6 @@ return valueName(parameter) + "Cast"; } - private static String executeCachedName(SpecializationData polymorphic) { - NodeData node = polymorphic.getNode(); - boolean generic = polymorphic == node.getGenericPolymorphicSpecialization(); - - if (generic) { - return "executeCachedGeneric0"; - } else { - return "executeCached" + polymorphicIndex(node, polymorphic); - } - } - - private static int polymorphicIndex(NodeData node, SpecializationData polymorphic) { - int index = 0; - for (SpecializationData specialization : node.getPolymorphicSpecializations()) { - if (specialization == polymorphic) { - break; - } - if (specialization != node.getGenericPolymorphicSpecialization()) { - index++; - } - } - return index; - } - private void addInternalValueParameters(CodeExecutableElement method, TemplateMethod specialization, boolean forceFrame, boolean evaluated) { if (forceFrame && specialization.getSpecification().findParameterSpec("frame") != null) { method.addParameter(new CodeVariableElement(getContext().getTruffleTypes().getFrame(), "frameValue")); @@ -439,11 +408,9 @@ getElement().getEnclosedElements().clear(); Map<NodeData, List<TypeElement>> childTypes = new LinkedHashMap<>(); - if (node.getDeclaredNodes() != null && !node.getDeclaredNodes().isEmpty()) { - for (NodeData nodeChild : node.getDeclaredNodes()) { - NodeCodeGenerator generator = new NodeCodeGenerator(getContext()); - childTypes.put(nodeChild, generator.process(null, nodeChild).getEnclosedElements()); - } + for (NodeData nodeChild : node.getEnclosingNodes()) { + NodeCodeGenerator generator = new NodeCodeGenerator(getContext()); + childTypes.put(nodeChild, generator.process(null, nodeChild).getEnclosedElements()); } if (node.needsFactory() || node.getNodeDeclaringChildren().size() > 0) { @@ -525,15 +492,18 @@ createFactoryMethods(node, clazz, createVisibility); - if (node.isPolymorphic()) { - PolymorphicNodeFactory generic = new PolymorphicNodeFactory(getContext(), generatedNode); - add(generic, node.getGenericPolymorphicSpecialization()); - polymorphicNode = generic.getElement(); - } for (SpecializationData specialization : node.getSpecializations()) { if (!specialization.isReachable()) { continue; } + + if (specialization.isPolymorphic() && node.isPolymorphic()) { + PolymorphicNodeFactory polymorphicFactory = new PolymorphicNodeFactory(getContext(), generatedNode); + add(polymorphicFactory, specialization); + polymorphicNode = polymorphicFactory.getElement(); + continue; + } + add(new SpecializedNodeFactory(context, generatedNode), specialization); } @@ -572,7 +542,7 @@ } List<NodeData> children = node.getNodeDeclaringChildren(); - if (node.getParent() == null && children.size() > 0) { + if (node.getDeclaringNode() == null && children.size() > 0) { clazz.add(createGetFactories(node)); } @@ -755,7 +725,7 @@ } private String instanceVarName(NodeData node) { - if (node.getParent() != null) { + if (node.getDeclaringNode() != null) { return Utils.firstLetterLowerCase(factoryClassName(node)) + "Instance"; } else { return "instance"; @@ -808,9 +778,9 @@ builder.startGroup(); NodeData childNode = child; List<NodeData> factories = new ArrayList<>(); - while (childNode.getParent() != null) { + while (childNode.getDeclaringNode() != null) { factories.add(childNode); - childNode = childNode.getParent(); + childNode = childNode.getDeclaringNode(); } Collections.reverse(factories); for (NodeData nodeData : factories) { @@ -950,7 +920,7 @@ builder.statement("this.next0 = adoptChild(next0)"); clazz.add(setter); - CodeExecutableElement genericCachedExecute = createCachedExecute(node, node.getGenericPolymorphicSpecialization()); + CodeExecutableElement genericCachedExecute = createCachedExecute(node, node.getPolymorphicSpecialization()); clazz.add(genericCachedExecute); getElement().add(createUpdateTypes(clazz.asType())); @@ -1144,8 +1114,7 @@ } private CodeExecutableElement createCachedExecute(NodeData node, SpecializationData polymorph) { - String name = executeCachedName(polymorph); - CodeExecutableElement cachedExecute = new CodeExecutableElement(modifiers(PROTECTED, ABSTRACT), polymorph.getReturnType().getType(), name); + CodeExecutableElement cachedExecute = new CodeExecutableElement(modifiers(PROTECTED, ABSTRACT), polymorph.getReturnType().getType(), EXECUTE_POLYMORPHIC_NAME); addInternalValueParameters(cachedExecute, polymorph, true, true); ExecutableTypeData sourceExecutableType = node.findExecutableType(polymorph.getReturnType().getTypeSystemType(), 0); @@ -1305,8 +1274,6 @@ builder.startStaticCall(getContext().getTruffleTypes().getCompilerAsserts(), "neverPartOfCompilation").end(); builder.end(); - emitSpecializationListeners(builder, node); - String currentNode = "this"; for (SpecializationData specialization : node.getSpecializations()) { if (!specialization.getExceptions().isEmpty()) { @@ -1330,7 +1297,7 @@ boolean firstUnreachable = true; for (SpecializationData current : node.getSpecializations()) { - if (current.isUninitialized() || current.isReachable()) { + if (current.isReachable()) { continue; } if (firstUnreachable) { @@ -1347,7 +1314,7 @@ List<SpecializationData> specializations = node.getSpecializations(); List<SpecializationData> filteredSpecializations = new ArrayList<>(); for (SpecializationData current : specializations) { - if (current.isUninitialized() || !current.isReachable()) { + if (current.isUninitialized() || current.isPolymorphic() || !current.isReachable()) { continue; } filteredSpecializations.add(current); @@ -1380,7 +1347,7 @@ private void emitUnreachableSpecializations(final CodeTreeBuilder builder, NodeData node) { for (SpecializationData current : node.getSpecializations()) { - if (current.isUninitialized() || current.isReachable()) { + if (current.isReachable()) { continue; } builder.string("// unreachable ").string(current.getId()).newLine(); @@ -1751,7 +1718,7 @@ } builder.end(); builder.startDoWhile(); - builder.string("!").startParantheses().instanceOf("root", nodePolymorphicClassName(node, node.getGenericPolymorphicSpecialization())).end(); + builder.string("!").startParantheses().instanceOf("root", nodePolymorphicClassName(node)).end(); builder.end(); return builder.getRoot(); } @@ -1829,7 +1796,7 @@ } private CodeTree createRewritePolymorphic(CodeTreeBuilder parent, NodeData node, String currentNode) { - String polyClassName = nodePolymorphicClassName(node, node.getGenericPolymorphicSpecialization()); + String polyClassName = nodePolymorphicClassName(node); String uninitializedName = nodeSpecializationClassName(node.getUninitializedSpecialization()); CodeTreeBuilder builder = parent.create(); @@ -1840,7 +1807,7 @@ builder.startStatement().startCall("currentCopy", "setNext0").startNew(uninitializedName).string(currentNode).end().end().end(); builder.startReturn(); - builder.startCall("currentCopy.next0", executeCachedName(node.getGenericPolymorphicSpecialization())); + builder.startCall("currentCopy.next0", EXECUTE_POLYMORPHIC_NAME); addInternalValueParameterNames(builder, node.getGenericSpecialization(), node.getGenericSpecialization(), null, true, true, null); builder.end(); builder.end(); @@ -1848,14 +1815,6 @@ return builder.getRoot(); } - private void emitSpecializationListeners(CodeTreeBuilder builder, NodeData node) { - for (TemplateMethod listener : node.getSpecializationListeners()) { - builder.startStatement(); - builder.tree(createTemplateMethodCall(builder, null, listener, listener, null)); - builder.end(); // statement - } - } - protected CodeTree createCastingExecute(CodeTreeBuilder parent, SpecializationData specialization, ExecutableTypeData executable, ExecutableTypeData castExecutable) { TypeData type = executable.getType(); CodeTreeBuilder builder = new CodeTreeBuilder(parent); @@ -2302,8 +2261,7 @@ private CodeTree createReturnOptimizeTypes(CodeTreeBuilder parent, ExecutableTypeData currentExecutable, SpecializationData specialization, ActualParameter param) { NodeData node = specialization.getNode(); - assert !node.getPolymorphicSpecializations().isEmpty(); - SpecializationData generic = node.getGenericPolymorphicSpecialization(); + SpecializationData polymorphic = node.getPolymorphicSpecialization(); CodeTreeBuilder builder = new CodeTreeBuilder(parent); builder.startStatement().string(polymorphicTypeName(param)).string(" = ").typeLiteral(getContext().getType(Object.class)).end(); @@ -2311,11 +2269,11 @@ builder.startReturn(); CodeTreeBuilder execute = new CodeTreeBuilder(builder); - execute.startCall("next0", executeCachedName(generic)); - addInternalValueParameterNames(execute, specialization, generic, param.getLocalName(), true, true, null); + execute.startCall("next0", EXECUTE_POLYMORPHIC_NAME); + addInternalValueParameterNames(execute, specialization, polymorphic, param.getLocalName(), true, true, null); execute.end(); - TypeData sourceType = generic.getReturnType().getTypeSystemType(); + TypeData sourceType = polymorphic.getReturnType().getTypeSystemType(); builder.tree(createExpectExecutableType(node, sourceType, currentExecutable, execute.getRoot())); @@ -2505,7 +2463,7 @@ if (nodeGen != null) { baseType = nodeGen.asType(); } - CodeTypeElement clazz = createClass(node, modifiers(PRIVATE, STATIC, FINAL), nodePolymorphicClassName(node, polymorph), baseType, false); + CodeTypeElement clazz = createClass(node, modifiers(PRIVATE, STATIC, FINAL), nodePolymorphicClassName(node), baseType, false); clazz.getAnnotationMirrors().add(createNodeInfo(node, Kind.POLYMORPHIC)); @@ -2602,8 +2560,12 @@ kind = Kind.GENERIC; } else if (specialization.isUninitialized()) { kind = Kind.UNINITIALIZED; + } else if (specialization.isPolymorphic()) { + kind = Kind.POLYMORPHIC; + } else if (specialization.isSpecialized()) { + kind = Kind.SPECIALIZED; } else { - kind = Kind.SPECIALIZED; + throw new AssertionError(); } clazz.getAnnotationMirrors().add(createNodeInfo(node, kind)); @@ -2709,9 +2671,9 @@ CodeTypeElement clazz = getElement(); - final SpecializationData polymorphic = node.getGenericPolymorphicSpecialization(); - - ExecutableElement executeCached = nodeGen.getMethod(executeCachedName(polymorphic)); + final SpecializationData polymorphic = node.getPolymorphicSpecialization(); + + ExecutableElement executeCached = nodeGen.getMethod(EXECUTE_POLYMORPHIC_NAME); // ExecutableTypeData execType = new ExecutableTypeData(polymorphic, executeCached, // node.getTypeSystem(), polymorphic.getReturnType().getTypeSystemType()); @@ -2729,7 +2691,7 @@ builder.tree(createAppendPolymorphic(builder, specialization)); } else { CodeTreeBuilder elseBuilder = new CodeTreeBuilder(builder); - elseBuilder.startReturn().startCall("this.next0", executeCachedName(polymorphic)); + elseBuilder.startReturn().startCall("this.next0", EXECUTE_POLYMORPHIC_NAME); addInternalValueParameterNames(elseBuilder, polymorphic, polymorphic, null, true, true, null); elseBuilder.end().end(); @@ -2759,7 +2721,7 @@ builder.startBlock(); String message = "Polymorphic limit reached (" + node.getPolymorphicDepth() + ")"; String castRoot = "(" + baseClassName(node) + ") root"; - builder.tree(createGenericInvoke(builder, node.getGenericPolymorphicSpecialization(), node.getGenericSpecialization(), + builder.tree(createGenericInvoke(builder, node.getPolymorphicSpecialization(), node.getGenericSpecialization(), createReplaceCall(builder, node.getGenericSpecialization(), "root", castRoot, message), null)); builder.end(); @@ -2777,7 +2739,7 @@ builder.declaration(node.getGenericSpecialization().getReturnType().getType(), "result", specializeCall.getRoot()); - CodeTree root = builder.create().cast(nodePolymorphicClassName(node, node.getGenericPolymorphicSpecialization())).string("root").getRoot(); + CodeTree root = builder.create().cast(nodePolymorphicClassName(node)).string("root").getRoot(); builder.startIf().string("this.next0 != null").end().startBlock(); builder.startStatement().string("(").tree(root).string(").").startCall(UPDATE_TYPES_NAME).tree(root).end().end(); builder.end(); @@ -2950,7 +2912,7 @@ CodeTreeBuilder returnBuilder = new CodeTreeBuilder(parent); if (specialization.isPolymorphic()) { - returnBuilder.startCall("next0", executeCachedName(specialization)); + returnBuilder.startCall("next0", EXECUTE_POLYMORPHIC_NAME); addInternalValueParameterNames(returnBuilder, specialization, specialization, null, true, true, null); returnBuilder.end(); } else if (specialization.isUninitialized()) {