changeset 22368:0d4b0e4263ee

Convert NodeClass and NodeFieldAccessor to interfaces
author Christian Wimmer <christian.wimmer@oracle.com>
date Fri, 13 Nov 2015 10:29:52 -0800
parents 1b48778cee21
children 05f812bce8cc
files truffle/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/impl/DefaultASTPrinter.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/GraphPrintVisitor.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeClass.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeFieldAccessor.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderDeserializer.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderSerializer.java truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLASTPrinter.java
diffstat 10 files changed, 264 insertions(+), 220 deletions(-) [+]
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java	Fri Nov 13 16:25:04 2015 +0100
+++ b/truffle/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java	Fri Nov 13 10:29:52 2015 -0800
@@ -87,7 +87,7 @@
     }
 
     private static void updateRootImpl(SpecializationNode start, Node node) {
-        NodeFieldAccessor[] fields = NodeClass.get(start).getFields();
+        NodeFieldAccessor[] fields = NodeClass.Lookup.get(start).getFields();
         for (int i = fields.length - 1; i >= 0; i--) {
             NodeFieldAccessor f = fields[i];
             if (f.getName().equals("root")) {
@@ -508,6 +508,8 @@
         throw new UnsupportedSpecializationException(findRoot(), getSuppliedChildren(), args);
     }
 
+    /* Suppress FindBugs false positive. */
+    @SuppressFBWarnings(value = "NP")
     static SpecializationNode insertSorted(SpecializationNode start, final SpecializationNode generated, final CharSequence message, final SpecializationNode merged) {
         if (merged == generated) {
             // new node
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/impl/DefaultASTPrinter.java	Fri Nov 13 16:25:04 2015 +0100
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/impl/DefaultASTPrinter.java	Fri Nov 13 10:29:52 2015 -0800
@@ -103,7 +103,7 @@
 
         ArrayList<NodeFieldAccessor> childFields = new ArrayList<>();
 
-        for (NodeFieldAccessor field : NodeClass.get(node).getFields()) {
+        for (NodeFieldAccessor field : NodeClass.Lookup.get(node).getFields()) {
             if (field.getKind() == NodeFieldKind.CHILD || field.getKind() == NodeFieldKind.CHILDREN) {
                 childFields.add(field);
             } else if (field.getKind() == NodeFieldKind.DATA) {
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/GraphPrintVisitor.java	Fri Nov 13 16:25:04 2015 +0100
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/GraphPrintVisitor.java	Fri Nov 13 10:29:52 2015 -0800
@@ -475,7 +475,7 @@
     }
 
     private void readNodeProperties(Node node) {
-        NodeFieldAccessor[] fields = NodeClass.get(node).getFields();
+        NodeFieldAccessor[] fields = NodeClass.Lookup.get(node).getFields();
         for (NodeFieldAccessor field : fields) {
             if (field.getKind() == NodeFieldKind.DATA) {
                 String key = field.getName();
@@ -547,7 +547,7 @@
 
     private static LinkedHashMap<String, Node> findNamedNodeChildren(Node node) {
         LinkedHashMap<String, Node> nodes = new LinkedHashMap<>();
-        NodeClass nodeClass = NodeClass.get(node);
+        NodeClass nodeClass = NodeClass.Lookup.get(node);
 
         for (NodeFieldAccessor field : nodeClass.getFields()) {
             NodeFieldKind kind = field.getKind();
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java	Fri Nov 13 16:25:04 2015 +0100
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java	Fri Nov 13 10:29:52 2015 -0800
@@ -75,7 +75,7 @@
     protected Node(SourceSection sourceSection) {
         CompilerAsserts.neverPartOfCompilation();
         this.sourceSection = sourceSection;
-        this.nodeClass = NodeClass.get(getClass());
+        this.nodeClass = NodeClass.Lookup.get(getClass());
         if (TruffleOptions.TraceASTJSON) {
             JSONHelper.dumpNewNode(this);
         }
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeClass.java	Fri Nov 13 16:25:04 2015 +0100
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeClass.java	Fri Nov 13 10:29:52 2015 -0800
@@ -24,9 +24,6 @@
  */
 package com.oracle.truffle.api.nodes;
 
-import com.oracle.truffle.api.nodes.Node.Child;
-import com.oracle.truffle.api.nodes.Node.Children;
-import com.oracle.truffle.api.nodes.NodeFieldAccessor.NodeFieldKind;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.security.AccessController;
@@ -35,170 +32,206 @@
 import java.util.Iterator;
 import java.util.List;
 
-/**
- * Information about a {@link Node} class. A single instance of this class is allocated for every
- * subclass of {@link Node} that is used.
- */
-public final class NodeClass {
-    private static final ClassValue<NodeClass> nodeClasses = new ClassValue<NodeClass>() {
-        @SuppressWarnings("unchecked")
-        @Override
-        protected NodeClass computeValue(final Class<?> clazz) {
-            assert Node.class.isAssignableFrom(clazz);
-            return AccessController.doPrivileged(new PrivilegedAction<NodeClass>() {
-                public NodeClass run() {
-                    return new NodeClass((Class<? extends Node>) clazz);
-                }
-            });
-        }
-    };
-
-    private static final NodeFieldAccessor[] EMPTY_NODE_FIELD_ARRAY = new NodeFieldAccessor[0];
-
-    // The comprehensive list of all fields.
-    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;
-
-    private final Class<? extends Node> clazz;
-
-    public static NodeClass get(Class<? extends Node> clazz) {
-        return nodeClasses.get(clazz);
-    }
+import com.oracle.truffle.api.nodes.Node.Child;
+import com.oracle.truffle.api.nodes.Node.Children;
+import com.oracle.truffle.api.nodes.NodeFieldAccessor.NodeFieldAccessorImpl;
+import com.oracle.truffle.api.nodes.NodeFieldAccessor.NodeFieldKind;
 
-    public static NodeClass get(Node node) {
-        return node.getNodeClass();
-    }
-
-    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<>();
-
-        for (Field field : NodeUtil.getAllFields(clazz)) {
-            if (Modifier.isStatic(field.getModifiers()) || field.isSynthetic()) {
-                continue;
-            }
+public interface NodeClass {
 
-            NodeFieldAccessor nodeField;
-            if (field.getDeclaringClass() == Node.class && field.getName().equals("parent")) {
-                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);
-                childFieldList.add(nodeField);
-            } else if (field.getAnnotation(Children.class) != null) {
-                checkChildrenField(field);
-                nodeField = NodeFieldAccessor.create(NodeFieldKind.CHILDREN, field);
-                childrenFieldList.add(nodeField);
-            } else {
-                nodeField = NodeFieldAccessor.create(NodeFieldKind.DATA, field);
-                if (NodeCloneable.class.isAssignableFrom(field.getType())) {
-                    cloneableFieldList.add(nodeField);
-                }
-            }
-            fieldsList.add(nodeField);
+    public static class Lookup {
+        public static NodeClass get(Class<? extends Node> clazz) {
+            return NodeClassImpl.nodeClasses.get(clazz);
         }
 
-        if (parentFieldTmp == null) {
-            throw new AssertionError("parent field not found");
-        }
-
-        this.fields = fieldsList.toArray(EMPTY_NODE_FIELD_ARRAY);
-        this.nodeClassField = nodeClassFieldTmp;
-        this.parentField = parentFieldTmp;
-        this.childFields = childFieldList.toArray(EMPTY_NODE_FIELD_ARRAY);
-        this.childrenFields = childrenFieldList.toArray(EMPTY_NODE_FIELD_ARRAY);
-        this.cloneableFields = cloneableFieldList.toArray(EMPTY_NODE_FIELD_ARRAY);
-        this.clazz = clazz;
-    }
-
-    public NodeFieldAccessor getNodeClassField() {
-        return nodeClassField;
-    }
-
-    public NodeFieldAccessor[] getCloneableFields() {
-        return cloneableFields;
-    }
-
-    private static boolean isNodeType(Class<?> clazz) {
-        return Node.class.isAssignableFrom(clazz) || (clazz.isInterface() && NodeInterface.class.isAssignableFrom(clazz));
-    }
-
-    private static void checkChildField(Field field) {
-        if (!isNodeType(field.getType())) {
-            throw new AssertionError("@Child field type must be a subclass of Node or an interface extending NodeInterface (" + field + ")");
-        }
-        if (Modifier.isFinal(field.getModifiers())) {
-            throw new AssertionError("@Child field must not be final (" + field + ")");
+        public static NodeClass get(Node node) {
+            return node.getNodeClass();
         }
     }
 
-    private static void checkChildrenField(Field field) {
-        if (!(field.getType().isArray() && isNodeType(field.getType().getComponentType()))) {
-            throw new AssertionError("@Children field type must be an array of a subclass of Node or an interface extending NodeInterface (" + field + ")");
+    NodeFieldAccessor getNodeClassField();
+
+    NodeFieldAccessor[] getCloneableFields();
+
+    NodeFieldAccessor[] getFields();
+
+    NodeFieldAccessor getParentField();
+
+    NodeFieldAccessor[] getChildFields();
+
+    NodeFieldAccessor[] getChildrenFields();
+
+    Iterator<Node> makeIterator(Node node);
+
+    /**
+     * Information about a {@link Node} class. A single instance of this class is allocated for
+     * every subclass of {@link Node} that is used.
+     */
+    public final class NodeClassImpl implements NodeClass {
+        static final ClassValue<NodeClass> nodeClasses = new ClassValue<NodeClass>() {
+            @SuppressWarnings("unchecked")
+            @Override
+            protected NodeClass computeValue(final Class<?> clazz) {
+                assert Node.class.isAssignableFrom(clazz);
+                return AccessController.doPrivileged(new PrivilegedAction<NodeClass>() {
+                    public NodeClass run() {
+                        return new NodeClassImpl((Class<? extends Node>) clazz);
+                    }
+                });
+            }
+        };
+
+        private static final NodeFieldAccessor[] EMPTY_NODE_FIELD_ARRAY = new NodeFieldAccessor[0];
+
+        // The comprehensive list of all fields.
+        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;
+
+        private final Class<? extends Node> clazz;
+
+        public static NodeClass get(Class<? extends Node> clazz) {
+            return nodeClasses.get(clazz);
+        }
+
+        public static NodeClass get(Node node) {
+            return node.getNodeClass();
         }
-        if (!Modifier.isFinal(field.getModifiers())) {
-            throw new AssertionError("@Children field must be final (" + field + ")");
+
+        NodeClassImpl(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<>();
+
+            for (Field field : NodeUtil.getAllFields(clazz)) {
+                if (Modifier.isStatic(field.getModifiers()) || field.isSynthetic()) {
+                    continue;
+                }
+
+                NodeFieldAccessor nodeField;
+                if (field.getDeclaringClass() == Node.class && field.getName().equals("parent")) {
+                    assert Node.class.isAssignableFrom(field.getType());
+                    nodeField = NodeFieldAccessorImpl.create(NodeFieldKind.PARENT, field);
+                    parentFieldTmp = nodeField;
+                } else if (field.getDeclaringClass() == Node.class && field.getName().equals("nodeClass")) {
+                    assert NodeClass.class.isAssignableFrom(field.getType());
+                    nodeField = NodeFieldAccessorImpl.create(NodeFieldKind.NODE_CLASS, field);
+                    nodeClassFieldTmp = nodeField;
+                } else if (field.getAnnotation(Child.class) != null) {
+                    checkChildField(field);
+                    nodeField = NodeFieldAccessorImpl.create(NodeFieldKind.CHILD, field);
+                    childFieldList.add(nodeField);
+                } else if (field.getAnnotation(Children.class) != null) {
+                    checkChildrenField(field);
+                    nodeField = NodeFieldAccessorImpl.create(NodeFieldKind.CHILDREN, field);
+                    childrenFieldList.add(nodeField);
+                } else {
+                    nodeField = NodeFieldAccessorImpl.create(NodeFieldKind.DATA, field);
+                    if (NodeCloneable.class.isAssignableFrom(field.getType())) {
+                        cloneableFieldList.add(nodeField);
+                    }
+                }
+                fieldsList.add(nodeField);
+            }
+
+            if (parentFieldTmp == null) {
+                throw new AssertionError("parent field not found");
+            }
+
+            this.fields = fieldsList.toArray(EMPTY_NODE_FIELD_ARRAY);
+            this.nodeClassField = nodeClassFieldTmp;
+            this.parentField = parentFieldTmp;
+            this.childFields = childFieldList.toArray(EMPTY_NODE_FIELD_ARRAY);
+            this.childrenFields = childrenFieldList.toArray(EMPTY_NODE_FIELD_ARRAY);
+            this.cloneableFields = cloneableFieldList.toArray(EMPTY_NODE_FIELD_ARRAY);
+            this.clazz = clazz;
+        }
+
+        public Class<? extends Node> getNodeClass() {
+            return clazz;
+        }
+
+        public NodeFieldAccessor getNodeClassField() {
+            return nodeClassField;
+        }
+
+        public NodeFieldAccessor[] getCloneableFields() {
+            return cloneableFields;
+        }
+
+        private static boolean isNodeType(Class<?> clazz) {
+            return Node.class.isAssignableFrom(clazz) || (clazz.isInterface() && NodeInterface.class.isAssignableFrom(clazz));
+        }
+
+        private static void checkChildField(Field field) {
+            if (!isNodeType(field.getType())) {
+                throw new AssertionError("@Child field type must be a subclass of Node or an interface extending NodeInterface (" + field + ")");
+            }
+            if (Modifier.isFinal(field.getModifiers())) {
+                throw new AssertionError("@Child field must not be final (" + field + ")");
+            }
+        }
+
+        private static void checkChildrenField(Field field) {
+            if (!(field.getType().isArray() && isNodeType(field.getType().getComponentType()))) {
+                throw new AssertionError("@Children field type must be an array of a subclass of Node or an interface extending NodeInterface (" + field + ")");
+            }
+            if (!Modifier.isFinal(field.getModifiers())) {
+                throw new AssertionError("@Children field must be final (" + field + ")");
+            }
+        }
+
+        public NodeFieldAccessor[] getFields() {
+            return fields;
+        }
+
+        public NodeFieldAccessor getParentField() {
+            return parentField;
+        }
+
+        public NodeFieldAccessor[] getChildFields() {
+            return childFields;
+        }
+
+        public NodeFieldAccessor[] getChildrenFields() {
+            return childrenFields;
+        }
+
+        @Override
+        public int hashCode() {
+            return clazz.hashCode();
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (obj instanceof NodeClassImpl) {
+                NodeClassImpl other = (NodeClassImpl) obj;
+                return clazz.equals(other.clazz);
+            }
+            return false;
+        }
+
+        public Iterator<Node> makeIterator(Node node) {
+            assert clazz.isInstance(node);
+            return new NodeIterator(this, node);
         }
     }
 
-    public NodeFieldAccessor[] getFields() {
-        return fields;
-    }
-
-    public NodeFieldAccessor getParentField() {
-        return parentField;
-    }
-
-    public NodeFieldAccessor[] getChildFields() {
-        return childFields;
-    }
-
-    public NodeFieldAccessor[] getChildrenFields() {
-        return childrenFields;
-    }
-
-    @Override
-    public int hashCode() {
-        return clazz.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof NodeClass) {
-            NodeClass other = (NodeClass) obj;
-            return clazz.equals(other.clazz);
-        }
-        return false;
-    }
-
-    public Iterator<Node> makeIterator(Node node) {
-        assert clazz.isInstance(node);
-        return new NodeIterator(this, node);
-    }
-
-    private static final class NodeIterator implements Iterator<Node> {
+    public static final class NodeIterator implements Iterator<Node> {
         private final NodeFieldAccessor[] childFields;
         private final NodeFieldAccessor[] childrenFields;
         private final Node node;
         private final int childrenCount;
         private int index;
 
-        protected NodeIterator(NodeClass nodeClass, Node node) {
+        public NodeIterator(NodeClass nodeClass, Node node) {
             this.childFields = nodeClass.getChildFields();
             this.childrenFields = nodeClass.getChildrenFields();
             this.node = node;
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeFieldAccessor.java	Fri Nov 13 16:25:04 2015 +0100
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeFieldAccessor.java	Fri Nov 13 10:29:52 2015 -0800
@@ -31,10 +31,7 @@
 import com.oracle.truffle.api.nodes.Node.Child;
 import com.oracle.truffle.api.nodes.Node.Children;
 
-/**
- * Information about a field in a {@link Node} class.
- */
-public abstract class NodeFieldAccessor {
+public interface NodeFieldAccessor {
 
     public static enum NodeFieldKind {
         /** The reference to the {@link NodeClass}. */
@@ -49,51 +46,64 @@
         DATA
     }
 
-    private static final boolean USE_UNSAFE = Boolean.getBoolean("truffle.unsafe");
+    NodeFieldKind getKind();
+
+    Class<?> getFieldType();
+
+    Class<?> getFieldDeclaringClass();
+
+    String getName();
+
+    void putObject(Node receiver, Object value);
+
+    Object getObject(Node receiver);
 
-    private final NodeFieldKind kind;
-    private final Class<?> declaringClass;
-    private final String name;
-    protected final Class<?> type;
+    Object loadValue(Node node);
+
+    /**
+     * Information about a field in a {@link Node} class.
+     */
+    public abstract static class NodeFieldAccessorImpl implements NodeFieldAccessor {
+        private static final boolean USE_UNSAFE = Boolean.getBoolean("truffle.unsafe");
+
+        private final NodeFieldKind kind;
+        private final Class<?> declaringClass;
+        private final String name;
+        protected final Class<?> type;
 
-    protected NodeFieldAccessor(NodeFieldKind kind, Class<?> declaringClass, String name, Class<?> type) {
-        this.kind = kind;
-        this.declaringClass = declaringClass;
-        this.name = name;
-        this.type = type;
-    }
+        protected NodeFieldAccessorImpl(NodeFieldKind kind, Class<?> declaringClass, String name, Class<?> type) {
+            this.kind = kind;
+            this.declaringClass = declaringClass;
+            this.name = name;
+            this.type = type;
+        }
+
+        protected static NodeFieldAccessor create(NodeFieldKind kind, Field field) {
+            if (USE_UNSAFE) {
+                return new UnsafeNodeField(kind, field);
+            } else {
+                return new ReflectionNodeField(kind, field);
+            }
+        }
 
-    protected static NodeFieldAccessor create(NodeFieldKind kind, Field field) {
-        if (USE_UNSAFE) {
-            return new UnsafeNodeField(kind, field);
-        } else {
-            return new ReflectionNodeField(kind, field);
+        public NodeFieldKind getKind() {
+            return kind;
+        }
+
+        public Class<?> getFieldType() {
+            return type;
+        }
+
+        public Class<?> getFieldDeclaringClass() {
+            return declaringClass;
+        }
+
+        public String getName() {
+            return name;
         }
     }
 
-    public NodeFieldKind getKind() {
-        return kind;
-    }
-
-    public Class<?> getType() {
-        return type;
-    }
-
-    public Class<?> getDeclaringClass() {
-        return declaringClass;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public abstract void putObject(Node receiver, Object value);
-
-    public abstract Object getObject(Node receiver);
-
-    public abstract Object loadValue(Node node);
-
-    public abstract static class AbstractUnsafeNodeFieldAccessor extends NodeFieldAccessor {
+    public abstract static class AbstractUnsafeNodeFieldAccessor extends NodeFieldAccessorImpl {
 
         protected AbstractUnsafeNodeFieldAccessor(NodeFieldKind kind, Class<?> declaringClass, String name, Class<?> type) {
             super(kind, declaringClass, name, type);
@@ -159,7 +169,7 @@
         }
     }
 
-    private static final class UnsafeNodeField extends AbstractUnsafeNodeFieldAccessor {
+    public static final class UnsafeNodeField extends AbstractUnsafeNodeFieldAccessor {
         private final long offset;
 
         protected UnsafeNodeField(NodeFieldKind kind, Field field) {
@@ -173,7 +183,7 @@
         }
     }
 
-    private static final class ReflectionNodeField extends NodeFieldAccessor {
+    public static final class ReflectionNodeField extends NodeFieldAccessorImpl {
         private final Field field;
 
         protected ReflectionNodeField(NodeFieldKind kind, Field field) {
@@ -229,5 +239,4 @@
             }
         }
     }
-
 }
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java	Fri Nov 13 16:25:04 2015 +0100
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java	Fri Nov 13 10:29:52 2015 -0800
@@ -241,17 +241,17 @@
             return true;
         }
         if (field.getKind() == NodeFieldKind.CHILD) {
-            if (field.getType().isAssignableFrom(newValue.getClass())) {
+            if (field.getFieldType().isAssignableFrom(newValue.getClass())) {
                 return true;
             } else {
-                assert false : "Child class " + newValue.getClass().getName() + " is not assignable to field \"" + field.getName() + "\" of type " + field.getType().getName();
+                assert false : "Child class " + newValue.getClass().getName() + " is not assignable to field \"" + field.getName() + "\" of type " + field.getFieldType().getName();
                 return false;
             }
         } else if (field.getKind() == NodeFieldKind.CHILDREN) {
-            if (field.getType().getComponentType().isAssignableFrom(newValue.getClass())) {
+            if (field.getFieldType().getComponentType().isAssignableFrom(newValue.getClass())) {
                 return true;
             } else {
-                assert false : "Child class " + newValue.getClass().getName() + " is not assignable to field \"" + field.getName() + "\" of type " + field.getType().getName();
+                assert false : "Child class " + newValue.getClass().getName() + " is not assignable to field \"" + field.getName() + "\" of type " + field.getFieldType().getName();
                 return false;
             }
         }
@@ -297,9 +297,9 @@
             if (field != null) {
                 switch (field.getKind()) {
                     case CHILD:
-                        return field.getType().isAssignableFrom(newChild.getClass());
+                        return field.getFieldType().isAssignableFrom(newChild.getClass());
                     case CHILDREN:
-                        return field.getType().getComponentType().isAssignableFrom(newChild.getClass());
+                        return field.getFieldType().getComponentType().isAssignableFrom(newChild.getClass());
                     default:
                         throw new IllegalStateException();
                 }
@@ -679,7 +679,7 @@
         ArrayList<NodeFieldAccessor> childFields = new ArrayList<>();
         String sep = "";
         p.print("(");
-        for (NodeFieldAccessor field : NodeClass.get(node).getFields()) {
+        for (NodeFieldAccessor field : NodeClass.Lookup.get(node).getFields()) {
             if (field.getKind() == NodeFieldKind.CHILD || field.getKind() == NodeFieldKind.CHILDREN) {
                 childFields.add(field);
             } else if (field.getKind() == NodeFieldKind.DATA) {
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderDeserializer.java	Fri Nov 13 16:25:04 2015 +0100
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderDeserializer.java	Fri Nov 13 10:29:52 2015 -0800
@@ -148,7 +148,7 @@
 
         Node node = (Node) object;
 
-        NodeFieldAccessor[] nodeFields = NodeClass.get(nodeClass).getFields();
+        NodeFieldAccessor[] nodeFields = NodeClass.Lookup.get(nodeClass).getFields();
         deserializeChildrenFields(node, nodeFields);
         deserializeChildFields(node, nodeFields);
         deserializeDataFields(buffer, node, nodeFields);
@@ -160,12 +160,12 @@
         for (int i = 0; i < nodeFields.length; i++) {
             NodeFieldAccessor field = nodeFields[i];
             if (field.getKind() == NodeFieldKind.DATA) {
-                Class<?> fieldClass = field.getType();
+                Class<?> fieldClass = field.getFieldType();
                 long offset = getFieldOffset(field);
 
                 // source sections are not serialized
                 // TODO add support for source sections
-                if (field.getType().isAssignableFrom(SourceSection.class)) {
+                if (field.getFieldType().isAssignableFrom(SourceSection.class)) {
                     continue;
                 }
 
@@ -243,7 +243,7 @@
         for (int i = nodeFields.length - 1; i >= 0; i--) {
             NodeFieldAccessor field = nodeFields[i];
             if (field.getKind() == NodeFieldKind.CHILD) {
-                unsafe.putObject(parent, getFieldOffset(field), popNode(parent, field.getType()));
+                unsafe.putObject(parent, getFieldOffset(field), popNode(parent, field.getFieldType()));
             }
         }
     }
@@ -252,14 +252,14 @@
         for (int i = nodeFields.length - 1; i >= 0; i--) {
             NodeFieldAccessor field = nodeFields[i];
             if (field.getKind() == NodeFieldKind.CHILDREN) {
-                unsafe.putObject(parent, getFieldOffset(field), popArray(parent, field.getType()));
+                unsafe.putObject(parent, getFieldOffset(field), popArray(parent, field.getFieldType()));
             }
         }
     }
 
     private static Node updateParent(Node parent, Node child) {
         if (child != null) {
-            NodeClass nodeClass = NodeClass.get(child.getClass());
+            NodeClass nodeClass = NodeClass.Lookup.get(child.getClass());
             nodeClass.getNodeClassField().putObject(child, nodeClass);
             nodeClass.getParentField().putObject(child, parent);
         }
@@ -271,7 +271,7 @@
             return ((NodeFieldAccessor.AbstractUnsafeNodeFieldAccessor) field).getOffset();
         } else {
             try {
-                Field reflectionField = field.getDeclaringClass().getDeclaredField(field.getName());
+                Field reflectionField = field.getFieldDeclaringClass().getDeclaredField(field.getName());
                 return unsafe.objectFieldOffset(reflectionField);
             } catch (NoSuchFieldException | SecurityException e) {
                 throw new RuntimeException(e);
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderSerializer.java	Fri Nov 13 16:25:04 2015 +0100
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderSerializer.java	Fri Nov 13 10:29:52 2015 -0800
@@ -78,7 +78,7 @@
         }
         Class<? extends Node> nodeClass = node.getClass();
 
-        NodeFieldAccessor[] nodeFields = NodeClass.get(nodeClass).getFields();
+        NodeFieldAccessor[] nodeFields = NodeClass.Lookup.get(nodeClass).getFields();
         serializeChildFields(buffer, node, nodeFields);
         serializeChildrenFields(buffer, node, nodeFields);
         buffer.put(cp.putClass(node.getClass()));
@@ -89,11 +89,11 @@
         for (int i = 0; i < nodeFields.length; i++) {
             NodeFieldAccessor field = nodeFields[i];
             if (field.getKind() == NodeFieldKind.DATA) {
-                Class<?> fieldClass = field.getType();
+                Class<?> fieldClass = field.getFieldType();
                 long offset = getFieldOffset(field);
                 int cpi;
 
-                if (field.getType().isAssignableFrom(SourceSection.class)) {
+                if (field.getFieldType().isAssignableFrom(SourceSection.class)) {
                     continue;
                 }
 
@@ -156,7 +156,7 @@
                     throw new AssertionError("Node children must be instanceof Node[]");
                 }
 
-                buffer.put(cp.putClass(field.getType()));
+                buffer.put(cp.putClass(field.getFieldType()));
 
                 Node[] childArray = (Node[]) childArrayObject;
                 if (childArray == null) {
--- a/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLASTPrinter.java	Fri Nov 13 16:25:04 2015 +0100
+++ b/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLASTPrinter.java	Fri Nov 13 10:29:52 2015 -0800
@@ -80,7 +80,7 @@
 
         ArrayList<NodeFieldAccessor> childFields = new ArrayList<>();
 
-        for (NodeFieldAccessor field : NodeClass.get(node.getClass()).getFields()) {
+        for (NodeFieldAccessor field : NodeClass.Lookup.get(node.getClass()).getFields()) {
             if (field.getKind() == NodeFieldKind.CHILD || field.getKind() == NodeFieldKind.CHILDREN) {
                 childFields.add(field);
             } else if (field.getKind() == NodeFieldKind.DATA) {