# HG changeset patch # User Andreas Woess # Date 1379729453 -7200 # Node ID 0ba840567fba2c6151bfd95d5a1237d99d7e10cf # Parent ed54ddfa393d4e03d986aa72ae02ff0ac7e9c1bd# Parent c287d13cb8b0d1c914e39d26a4532db449bd4d02 Merge diff -r ed54ddfa393d -r 0ba840567fba graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/TruffleTypes.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/TruffleTypes.java Fri Sep 20 23:04:47 2013 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/TruffleTypes.java Sat Sep 21 04:10:53 2013 +0200 @@ -56,6 +56,7 @@ private final TypeMirror compilerDirectives; private final TypeMirror compilerAsserts; private final DeclaredType slowPath; + private final DeclaredType sourceSection; private final DeclaredType truffleOptions; private final TypeElement expectError; @@ -75,6 +76,7 @@ nodeInfoAnnotation = getRequired(context, NodeInfo.class); nodeInfoKind = getRequired(context, NodeInfo.Kind.class); slowPath = getRequired(context, SlowPath.class); + sourceSection = getRequired(context, SourceSection.class); truffleOptions = getRequired(context, TruffleOptions.class); expectError = (TypeElement) getRequired(context, ExpectError.class).asElement(); } @@ -158,4 +160,8 @@ public DeclaredType getSlowPath() { return slowPath; } + + public Object getSourceSection() { + return sourceSection; + } } diff -r ed54ddfa393d -r 0ba840567fba graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java Fri Sep 20 23:04:47 2013 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java Sat Sep 21 04:10:53 2013 +0200 @@ -1102,15 +1102,19 @@ private void createConstructors(NodeData node, CodeTypeElement clazz) { List constructors = findUserConstructors(node.getNodeType()); + ExecutableElement sourceSectionConstructor = null; if (constructors.isEmpty()) { clazz.add(createUserConstructor(clazz, null)); } else { for (ExecutableElement constructor : constructors) { clazz.add(createUserConstructor(clazz, constructor)); + if (NodeParser.isSourceSectionConstructor(context, constructor)) { + sourceSectionConstructor = constructor; + } } } if (node.needsRewrites(getContext())) { - clazz.add(createCopyConstructor(clazz, findCopyConstructor(node.getNodeType()))); + clazz.add(createCopyConstructor(clazz, findCopyConstructor(node.getNodeType()), sourceSectionConstructor)); } } @@ -1181,31 +1185,15 @@ return builder.getRoot(); } - private CodeTree createCopyArray(CodeTreeBuilder parent, NodeChildData child, TypeMirror arrayType, CodeBlock accessElement) { - CodeTreeBuilder builder = parent.create(); - NodeData node = getModel().getNode(); - builder.string("new ").type(arrayType).string(" {"); - builder.startCommaGroup(); - for (ActualParameter parameter : getModel().getParameters()) { - NodeChildData foundChild = node.findChild(parameter.getSpecification().getName()); - if (foundChild == child) { - builder.startGroup(); - builder.tree(accessElement.create(builder, String.valueOf(parameter.getIndex()))); - builder.end(); - } - } - builder.end(); - builder.end().string("}"); - return builder.getRoot(); - } - - private CodeExecutableElement createCopyConstructor(CodeTypeElement type, ExecutableElement superConstructor) { + private CodeExecutableElement createCopyConstructor(CodeTypeElement type, ExecutableElement superConstructor, ExecutableElement sourceSectionConstructor) { CodeExecutableElement method = new CodeExecutableElement(null, type.getSimpleName().toString()); CodeTreeBuilder builder = method.createBuilder(); method.getParameters().add(new CodeVariableElement(type.asType(), "copy")); if (superConstructor != null) { builder.startStatement().startSuperCall().string("copy").end().end(); + } else if (sourceSectionConstructor != null) { + builder.startStatement().startSuperCall().string("copy.getSourceSection()").end().end(); } for (VariableElement var : type.getFields()) { @@ -1213,18 +1201,11 @@ final String varName = var.getSimpleName().toString(); final TypeMirror varType = var.asType(); - final String copyAccess = "copy." + varName; - CodeTree init = CodeTreeBuilder.singleString(copyAccess); - if (Utils.isAssignable(getContext(), var.asType(), getContext().getTruffleTypes().getNodeArray())) { - NodeChildData child = getModel().getNode().findChild(varName); - init = createCopyArray(builder, child, varType, new CodeBlock() { - - public CodeTree create(CodeTreeBuilder parent, String index) { - return CodeTreeBuilder.singleString(copyAccess + "[" + index + "]"); - } - }); + String copyAccess = "copy." + varName; + if (Utils.isAssignable(getContext(), varType, getContext().getTruffleTypes().getNodeArray())) { + copyAccess += ".clone()"; } - init = createAdoptChild(builder, varType, init); + CodeTree init = createAdoptChild(builder, varType, CodeTreeBuilder.singleString(copyAccess)); builder.startStatement().string("this.").string(varName).string(" = ").tree(init).end(); } if (getModel().getNode().isPolymorphic()) { diff -r ed54ddfa393d -r 0ba840567fba graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java Fri Sep 20 23:04:47 2013 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java Sat Sep 21 04:10:53 2013 +0200 @@ -1052,7 +1052,7 @@ boolean parametersFound = false; for (ExecutableElement constructor : constructors) { - if (!constructor.getParameters().isEmpty()) { + if (!constructor.getParameters().isEmpty() && !isSourceSectionConstructor(context, constructor)) { parametersFound = true; } } @@ -1077,6 +1077,10 @@ nodeData.addError("Specialization constructor '%s(%s previousNode) { this(...); }' is required.", Utils.getSimpleName(type), Utils.getSimpleName(type)); } + static boolean isSourceSectionConstructor(ProcessorContext context, ExecutableElement constructor) { + return constructor.getParameters().size() == 1 && constructor.getParameters().get(0).asType().equals(context.getTruffleTypes().getSourceSection()); + } + private static boolean verifySpecializationParameters(NodeData nodeData) { boolean valid = true; int args = -1;