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;
     }