# HG changeset patch # User Christian Wimmer # Date 1447439392 28800 # Node ID 0d4b0e4263ee95e3b0576409d7311489d4f5d463 # Parent 1b48778cee2164f287c8c90db756d18103326ef2 Convert NodeClass and NodeFieldAccessor to interfaces diff -r 1b48778cee21 -r 0d4b0e4263ee 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 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 diff -r 1b48778cee21 -r 0d4b0e4263ee truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/impl/DefaultASTPrinter.java --- 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 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) { diff -r 1b48778cee21 -r 0d4b0e4263ee truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/GraphPrintVisitor.java --- 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 findNamedNodeChildren(Node node) { LinkedHashMap nodes = new LinkedHashMap<>(); - NodeClass nodeClass = NodeClass.get(node); + NodeClass nodeClass = NodeClass.Lookup.get(node); for (NodeFieldAccessor field : nodeClass.getFields()) { NodeFieldKind kind = field.getKind(); diff -r 1b48778cee21 -r 0d4b0e4263ee truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java --- 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); } diff -r 1b48778cee21 -r 0d4b0e4263ee truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeClass.java --- 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 nodeClasses = new ClassValue() { - @SuppressWarnings("unchecked") - @Override - protected NodeClass computeValue(final Class clazz) { - assert Node.class.isAssignableFrom(clazz); - return AccessController.doPrivileged(new PrivilegedAction() { - public NodeClass run() { - return new NodeClass((Class) 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 clazz; - - public static NodeClass get(Class 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 clazz) { - List fieldsList = new ArrayList<>(); - NodeFieldAccessor parentFieldTmp = null; - NodeFieldAccessor nodeClassFieldTmp = null; - List childFieldList = new ArrayList<>(); - List childrenFieldList = new ArrayList<>(); - List 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 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 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 nodeClasses = new ClassValue() { + @SuppressWarnings("unchecked") + @Override + protected NodeClass computeValue(final Class clazz) { + assert Node.class.isAssignableFrom(clazz); + return AccessController.doPrivileged(new PrivilegedAction() { + public NodeClass run() { + return new NodeClassImpl((Class) 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 clazz; + + public static NodeClass get(Class 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 clazz) { + List fieldsList = new ArrayList<>(); + NodeFieldAccessor parentFieldTmp = null; + NodeFieldAccessor nodeClassFieldTmp = null; + List childFieldList = new ArrayList<>(); + List childrenFieldList = new ArrayList<>(); + List 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 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 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 makeIterator(Node node) { - assert clazz.isInstance(node); - return new NodeIterator(this, node); - } - - private static final class NodeIterator implements Iterator { + public static final class NodeIterator implements Iterator { 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; diff -r 1b48778cee21 -r 0d4b0e4263ee truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeFieldAccessor.java --- 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 @@ } } } - } diff -r 1b48778cee21 -r 0d4b0e4263ee truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java --- 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 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) { diff -r 1b48778cee21 -r 0d4b0e4263ee truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderDeserializer.java --- 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); diff -r 1b48778cee21 -r 0d4b0e4263ee truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderSerializer.java --- 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 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) { diff -r 1b48778cee21 -r 0d4b0e4263ee truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLASTPrinter.java --- 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 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) {