# HG changeset patch # User Andreas Woess # Date 1450365370 -3600 # Node ID a619835e6709a03c33983cced81aa2887079c58c # Parent 23bdb1a46d0cc1a2a08fb3af88e5a8d65b256bd4 SpecializationNode refactoring: update root field through generated setter diff -r 23bdb1a46d0c -r a619835e6709 truffle/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java --- a/truffle/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java Thu Dec 17 15:11:32 2015 +0100 +++ b/truffle/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java Thu Dec 17 16:16:10 2015 +0100 @@ -24,6 +24,11 @@ */ package com.oracle.truffle.api.dsl.internal; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.Arrays; +import java.util.concurrent.Callable; + import com.oracle.truffle.api.Assumption; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives; @@ -39,15 +44,9 @@ import com.oracle.truffle.api.nodes.ExplodeLoop; import com.oracle.truffle.api.nodes.InvalidAssumptionException; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.nodes.NodeClass; import com.oracle.truffle.api.nodes.NodeCost; -import com.oracle.truffle.api.nodes.NodeFieldAccessor; import com.oracle.truffle.api.nodes.NodeInfo; import com.oracle.truffle.api.nodes.NodeUtil; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.Arrays; -import java.util.concurrent.Callable; /** * Internal implementation dependent base class for generated specialized nodes. @@ -83,14 +82,7 @@ } private static void updateRootImpl(SpecializationNode start, Node node) { - NodeFieldAccessor[] fields = NodeClass.get(start).getFields(); - for (int i = fields.length - 1; i >= 0; i--) { - NodeFieldAccessor f = fields[i]; - if (f.getName().equals("root")) { - f.putObject(start, node); - break; - } - } + start.setRoot(node); if (start.next != null) { updateRootImpl(start.next, node); } @@ -115,6 +107,8 @@ } } + protected abstract void setRoot(Node root); + protected abstract Node[] getSuppliedChildren(); protected SpecializationNode merge(SpecializationNode newNode, Frame frame) { diff -r 23bdb1a46d0c -r a619835e6709 truffle/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java --- a/truffle/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java Thu Dec 17 15:11:32 2015 +0100 +++ b/truffle/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java Thu Dec 17 16:16:10 2015 +0100 @@ -22,6 +22,50 @@ */ package com.oracle.truffle.dsl.processor.generator; +import static com.oracle.truffle.dsl.processor.generator.GeneratorUtils.createClass; +import static com.oracle.truffle.dsl.processor.generator.GeneratorUtils.createTransferToInterpreterAndInvalidate; +import static com.oracle.truffle.dsl.processor.generator.GeneratorUtils.isTypeBoxingOptimized; +import static com.oracle.truffle.dsl.processor.java.ElementUtils.compareType; +import static com.oracle.truffle.dsl.processor.java.ElementUtils.fromTypeMirror; +import static com.oracle.truffle.dsl.processor.java.ElementUtils.getTypeId; +import static com.oracle.truffle.dsl.processor.java.ElementUtils.isObject; +import static com.oracle.truffle.dsl.processor.java.ElementUtils.isSubtypeBoxed; +import static com.oracle.truffle.dsl.processor.java.ElementUtils.isVoid; +import static com.oracle.truffle.dsl.processor.java.ElementUtils.modifiers; +import static com.oracle.truffle.dsl.processor.java.ElementUtils.needsCastTo; +import static com.oracle.truffle.dsl.processor.java.ElementUtils.setVisibility; +import static com.oracle.truffle.dsl.processor.java.ElementUtils.typeEquals; +import static javax.lang.model.element.Modifier.ABSTRACT; +import static javax.lang.model.element.Modifier.FINAL; +import static javax.lang.model.element.Modifier.PRIVATE; +import static javax.lang.model.element.Modifier.PROTECTED; +import static javax.lang.model.element.Modifier.PUBLIC; +import static javax.lang.model.element.Modifier.STATIC; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.ArrayType; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.ElementFilter; + import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; @@ -43,20 +87,7 @@ import com.oracle.truffle.dsl.processor.ProcessorContext; import com.oracle.truffle.dsl.processor.expression.DSLExpression; import com.oracle.truffle.dsl.processor.expression.DSLExpression.Variable; -import static com.oracle.truffle.dsl.processor.generator.GeneratorUtils.createClass; -import static com.oracle.truffle.dsl.processor.generator.GeneratorUtils.createTransferToInterpreterAndInvalidate; -import static com.oracle.truffle.dsl.processor.generator.GeneratorUtils.isTypeBoxingOptimized; import com.oracle.truffle.dsl.processor.java.ElementUtils; -import static com.oracle.truffle.dsl.processor.java.ElementUtils.compareType; -import static com.oracle.truffle.dsl.processor.java.ElementUtils.fromTypeMirror; -import static com.oracle.truffle.dsl.processor.java.ElementUtils.getTypeId; -import static com.oracle.truffle.dsl.processor.java.ElementUtils.isObject; -import static com.oracle.truffle.dsl.processor.java.ElementUtils.isSubtypeBoxed; -import static com.oracle.truffle.dsl.processor.java.ElementUtils.isVoid; -import static com.oracle.truffle.dsl.processor.java.ElementUtils.modifiers; -import static com.oracle.truffle.dsl.processor.java.ElementUtils.needsCastTo; -import static com.oracle.truffle.dsl.processor.java.ElementUtils.setVisibility; -import static com.oracle.truffle.dsl.processor.java.ElementUtils.typeEquals; import com.oracle.truffle.dsl.processor.java.model.CodeAnnotationMirror; import com.oracle.truffle.dsl.processor.java.model.CodeAnnotationValue; import com.oracle.truffle.dsl.processor.java.model.CodeExecutableElement; @@ -84,34 +115,6 @@ import com.oracle.truffle.dsl.processor.model.TypeSystemData; import com.oracle.truffle.dsl.processor.parser.SpecializationGroup; import com.oracle.truffle.dsl.processor.parser.SpecializationGroup.TypeGuard; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.Modifier; -import static javax.lang.model.element.Modifier.ABSTRACT; -import static javax.lang.model.element.Modifier.FINAL; -import static javax.lang.model.element.Modifier.PRIVATE; -import static javax.lang.model.element.Modifier.PROTECTED; -import static javax.lang.model.element.Modifier.PUBLIC; -import static javax.lang.model.element.Modifier.STATIC; -import javax.lang.model.element.TypeElement; -import javax.lang.model.element.VariableElement; -import javax.lang.model.type.ArrayType; -import javax.lang.model.type.DeclaredType; -import javax.lang.model.type.TypeMirror; -import javax.lang.model.util.ElementFilter; public class NodeGenFactory { @@ -521,9 +524,12 @@ CodeTypeElement clazz = createClass(node, null, modifiers(PRIVATE, ABSTRACT, STATIC), specializationTypeName(null), typeSystem.getContext().getType(SpecializationNode.class)); clazz.addOptional(createSpecializationConstructor(clazz, null, null)); - clazz.add(new CodeVariableElement(modifiers(PROTECTED, FINAL), nodeType(node), "root")); + CodeVariableElement rootField = new CodeVariableElement(modifiers(PROTECTED), nodeType(node), "root"); + rootField.addAnnotationMirror(new CodeAnnotationMirror(context.getDeclaredType(CompilationFinal.class))); + clazz.add(rootField); clazz.addOptional(createUnsupported()); + clazz.add(createSetRootMethod()); clazz.add(createGetSuppliedChildrenMethod()); clazz.add(createAcceptAndExecute()); @@ -534,6 +540,16 @@ return clazz; } + private Element createSetRootMethod() { + CodeExecutableElement method = new CodeExecutableElement(modifiers(PROTECTED, FINAL), context.getType(void.class), "setRoot", new CodeVariableElement(getType(Node.class), "root")); + method.getAnnotationMirrors().add(new CodeAnnotationMirror(context.getDeclaredType(Override.class))); + + CodeTreeBuilder builder = method.createBuilder(); + builder.startStatement().string("this.root = ").cast(ElementUtils.fillInGenericWildcards(nodeType(node))).string("root").end(); + + return method; + } + private Element createAcceptAndExecute() { ExecutableTypeData executableElement = createSpecializationNodeSignature(node.getSignatureSize()); LocalContext currentLocals = LocalContext.load(this, executableElement, varArgsThreshold);