Mercurial > hg > truffle
diff graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeClass.java @ 20130:8dc73c226c63
Truffle: cache NodeClass lookup in Node.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Thu, 02 Apr 2015 01:26:31 +0200 |
parents | 5b7db8941fd7 |
children |
line wrap: on
line diff
--- 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<? extends Node> clazz) { List<NodeFieldAccessor> fieldsList = new ArrayList<>(); NodeFieldAccessor parentFieldTmp = null; + NodeFieldAccessor nodeClassFieldTmp = null; List<NodeFieldAccessor> childFieldList = new ArrayList<>(); List<NodeFieldAccessor> childrenFieldList = new ArrayList<>(); List<NodeFieldAccessor> 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; }