# HG changeset patch # User Christian Humer # Date 1427930791 -7200 # Node ID 8dc73c226c6357947f31140d32da005c189f9e38 # Parent 5b7db8941fd768001e353d5d8b91d0a138f0ebe9 Truffle: cache NodeClass lookup in Node. diff -r 5b7db8941fd7 -r 8dc73c226c63 graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLDisableSplittingBuiltin.java --- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLDisableSplittingBuiltin.java Thu Apr 02 01:22:41 2015 +0200 +++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLDisableSplittingBuiltin.java Thu Apr 02 01:26:31 2015 +0200 @@ -23,8 +23,8 @@ package com.oracle.graal.truffle.test.builtins; import com.oracle.graal.truffle.*; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.*; -import com.oracle.truffle.api.CompilerDirectives.*; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.nodes.*; import com.oracle.truffle.sl.nodes.*; diff -r 5b7db8941fd7 -r 8dc73c226c63 graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLGetOptionBuiltin.java --- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLGetOptionBuiltin.java Thu Apr 02 01:22:41 2015 +0200 +++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLGetOptionBuiltin.java Thu Apr 02 01:26:31 2015 +0200 @@ -24,7 +24,7 @@ import com.oracle.graal.options.*; import com.oracle.graal.truffle.*; -import com.oracle.truffle.api.CompilerDirectives.*; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.nodes.*; diff -r 5b7db8941fd7 -r 8dc73c226c63 graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLGraalRuntimeBuiltin.java --- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLGraalRuntimeBuiltin.java Thu Apr 02 01:22:41 2015 +0200 +++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLGraalRuntimeBuiltin.java Thu Apr 02 01:26:31 2015 +0200 @@ -26,7 +26,7 @@ import com.oracle.graal.truffle.*; import com.oracle.truffle.api.*; -import com.oracle.truffle.api.CompilerDirectives.*; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.nodes.*; import com.oracle.truffle.api.source.*; diff -r 5b7db8941fd7 -r 8dc73c226c63 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/debug/TraceCompilationASTListener.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/debug/TraceCompilationASTListener.java Thu Apr 02 01:22:41 2015 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/debug/TraceCompilationASTListener.java Thu Apr 02 01:26:31 2015 +0200 @@ -64,7 +64,7 @@ p.println(node.getClass().getSimpleName()); } else { String fieldName = "unknownField"; - NodeFieldAccessor[] fields = NodeClass.get(parent.getClass()).getFields(); + NodeFieldAccessor[] fields = NodeClass.get(parent).getFields(); for (NodeFieldAccessor field : fields) { Object value = field.loadValue(parent); if (value == node) { diff -r 5b7db8941fd7 -r 8dc73c226c63 graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java --- a/graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java Thu Apr 02 01:22:41 2015 +0200 +++ b/graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java Thu Apr 02 01:26:31 2015 +0200 @@ -79,7 +79,7 @@ } private static void updateRootImpl(SpecializationNode start, Node node) { - NodeFieldAccessor[] fields = NodeClass.get(start.getClass()).getFields(); + NodeFieldAccessor[] fields = NodeClass.get(start).getFields(); for (int i = fields.length - 1; i >= 0; i--) { NodeFieldAccessor f = fields[i]; if (f.getName().equals("root")) { diff -r 5b7db8941fd7 -r 8dc73c226c63 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/impl/DefaultASTPrinter.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/impl/DefaultASTPrinter.java Thu Apr 02 01:22:41 2015 +0200 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/impl/DefaultASTPrinter.java Thu Apr 02 01:26:31 2015 +0200 @@ -76,7 +76,7 @@ ArrayList childFields = new ArrayList<>(); - for (NodeFieldAccessor field : NodeClass.get(node.getClass()).getFields()) { + for (NodeFieldAccessor field : NodeClass.get(node).getFields()) { if (field.getKind() == NodeFieldKind.CHILD || field.getKind() == NodeFieldKind.CHILDREN) { childFields.add(field); } else if (field.getKind() == NodeFieldKind.DATA) { diff -r 5b7db8941fd7 -r 8dc73c226c63 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/GraphPrintVisitor.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/GraphPrintVisitor.java Thu Apr 02 01:22:41 2015 +0200 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/GraphPrintVisitor.java Thu Apr 02 01:26:31 2015 +0200 @@ -262,7 +262,7 @@ } private void readNodeProperties(Node node) { - NodeFieldAccessor[] fields = NodeClass.get(node.getClass()).getFields(); + NodeFieldAccessor[] fields = node.getNodeClass().getFields(); for (NodeFieldAccessor field : fields) { if (field.getKind() == NodeFieldKind.DATA) { String key = field.getName(); @@ -339,7 +339,7 @@ private static LinkedHashMap findNamedNodeChildren(Node node) { LinkedHashMap nodes = new LinkedHashMap<>(); - NodeClass nodeClass = NodeClass.get(node.getClass()); + NodeClass nodeClass = node.getNodeClass(); for (NodeFieldAccessor field : nodeClass.getFields()) { NodeFieldKind kind = field.getKind(); diff -r 5b7db8941fd7 -r 8dc73c226c63 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java Thu Apr 02 01:22:41 2015 +0200 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java Thu Apr 02 01:26:31 2015 +0200 @@ -40,6 +40,7 @@ */ public abstract class Node implements NodeInterface, Cloneable { + private final NodeClass nodeClass; @CompilationFinal private Node parent; @CompilationFinal private SourceSection sourceSection; @@ -66,6 +67,7 @@ protected Node(SourceSection sourceSection) { CompilerAsserts.neverPartOfCompilation(); this.sourceSection = sourceSection; + this.nodeClass = NodeClass.get(getClass()); if (TruffleOptions.TraceASTJSON) { JSONHelper.dumpNewNode(this); } @@ -88,6 +90,10 @@ this.sourceSection = section; } + NodeClass getNodeClass() { + return nodeClass; + } + /** * Returns a rough estimate for the cost of this {@link Node}. This estimate can be used by * runtime systems or guest languages to implement heuristics based on Truffle ASTs. This method @@ -344,7 +350,7 @@ public final Iterable getChildren() { return new Iterable() { public Iterator iterator() { - return NodeUtil.makeIterator(Node.this); + return nodeClass.makeIterator(Node.this); } }; } diff -r 5b7db8941fd7 -r 8dc73c226c63 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeClass.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeClass.java Thu Apr 02 01:22:41 2015 +0200 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeClass.java Thu Apr 02 01:26:31 2015 +0200 @@ -54,6 +54,7 @@ private final NodeFieldAccessor[] fields; // Separate arrays for the frequently accessed fields. private final NodeFieldAccessor parentField; + private final NodeFieldAccessor nodeClassField; private final NodeFieldAccessor[] childFields; private final NodeFieldAccessor[] childrenFields; private final NodeFieldAccessor[] cloneableFields; @@ -64,9 +65,14 @@ return nodeClasses.get(clazz); } + public static NodeClass get(Node clazz) { + return clazz.getNodeClass(); + } + public NodeClass(Class clazz) { List fieldsList = new ArrayList<>(); NodeFieldAccessor parentFieldTmp = null; + NodeFieldAccessor nodeClassFieldTmp = null; List childFieldList = new ArrayList<>(); List childrenFieldList = new ArrayList<>(); List cloneableFieldList = new ArrayList<>(); @@ -81,6 +87,10 @@ assert Node.class.isAssignableFrom(field.getType()); nodeField = NodeFieldAccessor.create(NodeFieldKind.PARENT, field); parentFieldTmp = nodeField; + } else if (field.getDeclaringClass() == Node.class && field.getName().equals("nodeClass")) { + assert NodeClass.class.isAssignableFrom(field.getType()); + nodeField = NodeFieldAccessor.create(NodeFieldKind.NODE_CLASS, field); + nodeClassFieldTmp = nodeField; } else if (field.getAnnotation(Child.class) != null) { checkChildField(field); nodeField = NodeFieldAccessor.create(NodeFieldKind.CHILD, field); @@ -103,6 +113,7 @@ } this.fields = fieldsList.toArray(new NodeFieldAccessor[fieldsList.size()]); + this.nodeClassField = nodeClassFieldTmp; this.parentField = parentFieldTmp; this.childFields = childFieldList.toArray(new NodeFieldAccessor[childFieldList.size()]); this.childrenFields = childrenFieldList.toArray(new NodeFieldAccessor[childrenFieldList.size()]); @@ -110,6 +121,10 @@ this.clazz = clazz; } + public NodeFieldAccessor getNodeClassField() { + return nodeClassField; + } + public NodeFieldAccessor[] getCloneableFields() { return cloneableFields; } diff -r 5b7db8941fd7 -r 8dc73c226c63 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeFieldAccessor.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeFieldAccessor.java Thu Apr 02 01:22:41 2015 +0200 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeFieldAccessor.java Thu Apr 02 01:26:31 2015 +0200 @@ -38,6 +38,8 @@ public abstract class NodeFieldAccessor { public static enum NodeFieldKind { + /** The reference to the {@link NodeClass}. */ + NODE_CLASS, /** The single {@link Node#getParent() parent} field. */ PARENT, /** A field annotated with {@link Child}. */ diff -r 5b7db8941fd7 -r 8dc73c226c63 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java Thu Apr 02 01:22:41 2015 +0200 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java Thu Apr 02 01:26:31 2015 +0200 @@ -54,7 +54,7 @@ } static Iterator makeIterator(Node node) { - return NodeClass.get(node.getClass()).makeIterator(node); + return node.getNodeClass().makeIterator(node); } public static Iterator makeRecursiveIterator(Node node) { @@ -132,7 +132,7 @@ static Node deepCopyImpl(Node orig) { final Node clone = orig.copy(); - NodeClass nodeClass = NodeClass.get(clone.getClass()); + NodeClass nodeClass = clone.getNodeClass(); nodeClass.getParentField().putObject(clone, null); @@ -169,7 +169,7 @@ public static List findNodeChildren(Node node) { List nodes = new ArrayList<>(); - NodeClass nodeClass = NodeClass.get(node.getClass()); + NodeClass nodeClass = node.getNodeClass(); for (NodeFieldAccessor nodeField : nodeClass.getChildFields()) { Object child = nodeField.getObject(node); @@ -197,7 +197,7 @@ } public static boolean replaceChild(Node parent, Node oldChild, Node newChild) { - NodeClass nodeClass = NodeClass.get(parent.getClass()); + NodeClass nodeClass = parent.getNodeClass(); for (NodeFieldAccessor nodeField : nodeClass.getChildFields()) { if (nodeField.getObject(parent) == oldChild) { @@ -252,7 +252,7 @@ */ public static NodeFieldAccessor findChildField(Node parent, Node child) { assert child != null; - NodeClass parentNodeClass = NodeClass.get(parent.getClass()); + NodeClass parentNodeClass = parent.getNodeClass(); for (NodeFieldAccessor field : parentNodeClass.getChildFields()) { if (field.getObject(parent) == child) { @@ -302,7 +302,7 @@ */ public static boolean forEachChild(Node parent, NodeVisitor visitor) { Objects.requireNonNull(visitor); - NodeClass parentNodeClass = NodeClass.get(parent.getClass()); + NodeClass parentNodeClass = parent.getNodeClass(); for (NodeFieldAccessor field : parentNodeClass.getChildFields()) { Object child = field.getObject(parent); @@ -564,7 +564,7 @@ } private static String getNodeFieldName(Node parent, Node node, String defaultName) { - NodeFieldAccessor[] fields = NodeClass.get(parent.getClass()).getFields(); + NodeFieldAccessor[] fields = parent.getNodeClass().getFields(); for (NodeFieldAccessor field : fields) { Object value = field.loadValue(parent); if (field.getKind() == NodeFieldKind.CHILD && value == node) { @@ -644,7 +644,7 @@ ArrayList childFields = new ArrayList<>(); String sep = ""; p.print("("); - for (NodeFieldAccessor field : NodeClass.get(node.getClass()).getFields()) { + for (NodeFieldAccessor field : NodeClass.get(node).getFields()) { if (field.getKind() == NodeFieldKind.CHILD || field.getKind() == NodeFieldKind.CHILDREN) { childFields.add(field); } else if (field.getKind() == NodeFieldKind.DATA) { diff -r 5b7db8941fd7 -r 8dc73c226c63 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderDeserializer.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderDeserializer.java Thu Apr 02 01:22:41 2015 +0200 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderDeserializer.java Thu Apr 02 01:26:31 2015 +0200 @@ -257,7 +257,9 @@ private static Node updateParent(Node parent, Node child) { if (child != null) { - NodeClass.get(child.getClass()).getParentField().putObject(child, parent); + NodeClass nodeClass = NodeClass.get(child.getClass()); + nodeClass.getNodeClassField().putObject(child, nodeClass); + nodeClass.getParentField().putObject(child, parent); } return child; } diff -r 5b7db8941fd7 -r 8dc73c226c63 graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java Thu Apr 02 01:22:41 2015 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java Thu Apr 02 01:26:31 2015 +0200 @@ -32,6 +32,7 @@ import com.oracle.truffle.api.*; import com.oracle.truffle.api.dsl.*; +import com.oracle.truffle.api.dsl.NodeField; import com.oracle.truffle.api.nodes.*; import com.oracle.truffle.dsl.processor.*; import com.oracle.truffle.dsl.processor.expression.*; diff -r 5b7db8941fd7 -r 8dc73c226c63 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLASTPrinter.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLASTPrinter.java Thu Apr 02 01:22:41 2015 +0200 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLASTPrinter.java Thu Apr 02 01:26:31 2015 +0200 @@ -28,7 +28,7 @@ import com.oracle.truffle.api.instrument.*; import com.oracle.truffle.api.instrument.impl.*; import com.oracle.truffle.api.nodes.*; -import com.oracle.truffle.api.nodes.NodeUtil.NodeFieldKind; +import com.oracle.truffle.api.nodes.NodeFieldAccessor.NodeFieldKind; /** * SLASTPrinter is used to print for SL's internal Truffle AST. This is used by