Mercurial > hg > truffle
changeset 22380:b4e89154a774
Supporting efficient cross-language eval
author | Jaroslav Tulach <jaroslav.tulach@oracle.com> |
---|---|
date | Wed, 18 Nov 2015 12:33:52 +0100 |
parents | 299c279c87b3 (diff) fdf6ad720cdc (current diff) |
children | d3facd428d1d |
files | truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java |
diffstat | 9 files changed, 215 insertions(+), 285 deletions(-) [+] |
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java Wed Nov 18 12:32:47 2015 +0100 +++ b/truffle/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java Wed Nov 18 12:33:52 2015 +0100 @@ -87,7 +87,7 @@ } private static void updateRootImpl(SpecializationNode start, Node node) { - NodeFieldAccessor[] fields = NodeClass.Lookup.get(start).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")) { @@ -508,8 +508,6 @@ 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 Wed Nov 18 12:32:47 2015 +0100 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/impl/DefaultASTPrinter.java Wed Nov 18 12:33:52 2015 +0100 @@ -103,7 +103,7 @@ ArrayList<NodeFieldAccessor> childFields = new ArrayList<>(); - for (NodeFieldAccessor field : NodeClass.Lookup.get(node).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) {
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/GraphPrintVisitor.java Wed Nov 18 12:32:47 2015 +0100 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/GraphPrintVisitor.java Wed Nov 18 12:33:52 2015 +0100 @@ -59,7 +59,6 @@ public static final String GraphVisualizerAddress = "127.0.0.1"; public static final int GraphVisualizerPort = 4444; - private static final boolean ENABLED = !System.getProperty("truffle.graphprint", "").equalsIgnoreCase("false"); private static final String DEFAULT_GRAPH_NAME = "truffle tree"; private Map<Object, NodeElement> nodeMap; @@ -228,7 +227,7 @@ } private static Impl createImpl(OutputStream outputStream) { - return ENABLED ? new XMLImpl(outputStream) : new DummyImpl(); + return new XMLImpl(outputStream); } private void ensureOpen() { @@ -369,7 +368,7 @@ @Override public String toString() { - if (outputStream instanceof ByteArrayOutputStream && ENABLED) { + if (outputStream instanceof ByteArrayOutputStream) { return new String(((ByteArrayOutputStream) outputStream).toByteArray(), Charset.forName("UTF-8")); } return super.toString(); @@ -377,7 +376,7 @@ public void printToFile(File f) { close(); - if (outputStream instanceof ByteArrayOutputStream && ENABLED) { + if (outputStream instanceof ByteArrayOutputStream) { try (OutputStream os = new FileOutputStream(f)) { os.write(((ByteArrayOutputStream) outputStream).toByteArray()); } catch (IOException e) { @@ -388,7 +387,7 @@ public void printToSysout() { close(); - if (outputStream instanceof ByteArrayOutputStream && ENABLED) { + if (outputStream instanceof ByteArrayOutputStream) { PrintStream out = System.out; out.println(toString()); } @@ -396,7 +395,7 @@ public void printToNetwork(boolean ignoreErrors) { close(); - if (outputStream instanceof ByteArrayOutputStream && ENABLED) { + if (outputStream instanceof ByteArrayOutputStream) { try (Socket socket = new Socket(GraphVisualizerAddress, GraphVisualizerPort); BufferedOutputStream os = new BufferedOutputStream(socket.getOutputStream(), 0x4000)) { os.write(((ByteArrayOutputStream) outputStream).toByteArray()); } catch (IOException e) { @@ -475,7 +474,7 @@ } private void readNodeProperties(Node node) { - NodeFieldAccessor[] fields = NodeClass.Lookup.get(node).getFields(); + NodeFieldAccessor[] fields = NodeClass.get(node).getFields(); for (NodeFieldAccessor field : fields) { if (field.getKind() == NodeFieldKind.DATA) { String key = field.getName(); @@ -547,7 +546,7 @@ private static LinkedHashMap<String, Node> findNamedNodeChildren(Node node) { LinkedHashMap<String, Node> nodes = new LinkedHashMap<>(); - NodeClass nodeClass = NodeClass.Lookup.get(node); + NodeClass nodeClass = NodeClass.get(node); for (NodeFieldAccessor field : nodeClass.getFields()) { NodeFieldKind kind = field.getKind(); @@ -628,32 +627,6 @@ } } - private static class DummyImpl implements Impl { - public void writeStartDocument() { - } - - public void writeEndDocument() { - } - - public void writeStartElement(String name) { - } - - public void writeEndElement() { - } - - public void writeAttribute(String name, String value) { - } - - public void writeCharacters(String text) { - } - - public void flush() { - } - - public void close() { - } - } - @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface CustomGraphPrintHandler {
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java Wed Nov 18 12:32:47 2015 +0100 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java Wed Nov 18 12:33:52 2015 +0100 @@ -75,7 +75,7 @@ protected Node(SourceSection sourceSection) { CompilerAsserts.neverPartOfCompilation(); this.sourceSection = sourceSection; - this.nodeClass = NodeClass.Lookup.get(getClass()); + this.nodeClass = NodeClass.get(getClass()); if (TruffleOptions.TraceASTJSON) { JSONHelper.dumpNewNode(this); }
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeClass.java Wed Nov 18 12:32:47 2015 +0100 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeClass.java Wed Nov 18 12:33:52 2015 +0100 @@ -24,6 +24,9 @@ */ 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; @@ -32,206 +35,170 @@ import java.util.Iterator; import java.util.List; -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; +/** + * 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); + } -public interface NodeClass { + 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 static class Lookup { - public static NodeClass get(Class<? extends Node> clazz) { - return NodeClassImpl.nodeClasses.get(clazz); + 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 NodeClass get(Node node) { - return node.getNodeClass(); + 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 + ")"); } } - 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(); + 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 + ")"); } - - 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); + if (!Modifier.isFinal(field.getModifiers())) { + throw new AssertionError("@Children field must be final (" + field + ")"); } } - public static final class NodeIterator implements Iterator<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> { private final NodeFieldAccessor[] childFields; private final NodeFieldAccessor[] childrenFields; private final Node node; private final int childrenCount; private int index; - public NodeIterator(NodeClass nodeClass, Node node) { + protected 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 Wed Nov 18 12:32:47 2015 +0100 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeFieldAccessor.java Wed Nov 18 12:33:52 2015 +0100 @@ -31,7 +31,10 @@ import com.oracle.truffle.api.nodes.Node.Child; import com.oracle.truffle.api.nodes.Node.Children; -public interface NodeFieldAccessor { +/** + * Information about a field in a {@link Node} class. + */ +public abstract class NodeFieldAccessor { public static enum NodeFieldKind { /** The reference to the {@link NodeClass}. */ @@ -46,64 +49,51 @@ DATA } - NodeFieldKind getKind(); - - Class<?> getFieldType(); - - Class<?> getFieldDeclaringClass(); - - String getName(); - - void putObject(Node receiver, Object value); - - Object getObject(Node receiver); + private static final boolean USE_UNSAFE = Boolean.getBoolean("truffle.unsafe"); - 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; + private final NodeFieldKind kind; + private final Class<?> declaringClass; + private final String name; + protected final Class<?> 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 NodeFieldAccessor(NodeFieldKind kind, Class<?> declaringClass, String name, Class<?> type) { + this.kind = kind; + this.declaringClass = declaringClass; + this.name = name; + this.type = type; + } - public NodeFieldKind getKind() { - return kind; - } - - public Class<?> getFieldType() { - return type; - } - - public Class<?> getFieldDeclaringClass() { - return declaringClass; - } - - public String getName() { - return name; + protected static NodeFieldAccessor create(NodeFieldKind kind, Field field) { + if (USE_UNSAFE) { + return new UnsafeNodeField(kind, field); + } else { + return new ReflectionNodeField(kind, field); } } - public abstract static class AbstractUnsafeNodeFieldAccessor extends NodeFieldAccessorImpl { + 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 { protected AbstractUnsafeNodeFieldAccessor(NodeFieldKind kind, Class<?> declaringClass, String name, Class<?> type) { super(kind, declaringClass, name, type); @@ -169,7 +159,7 @@ } } - public static final class UnsafeNodeField extends AbstractUnsafeNodeFieldAccessor { + private static final class UnsafeNodeField extends AbstractUnsafeNodeFieldAccessor { private final long offset; protected UnsafeNodeField(NodeFieldKind kind, Field field) { @@ -183,7 +173,7 @@ } } - public static final class ReflectionNodeField extends NodeFieldAccessorImpl { + private static final class ReflectionNodeField extends NodeFieldAccessor { private final Field field; protected ReflectionNodeField(NodeFieldKind kind, Field field) { @@ -239,4 +229,5 @@ } } } + }
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java Wed Nov 18 12:32:47 2015 +0100 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java Wed Nov 18 12:33:52 2015 +0100 @@ -241,17 +241,17 @@ return true; } if (field.getKind() == NodeFieldKind.CHILD) { - if (field.getFieldType().isAssignableFrom(newValue.getClass())) { + if (field.getType().isAssignableFrom(newValue.getClass())) { return true; } else { - assert false : "Child class " + newValue.getClass().getName() + " is not assignable to field \"" + field.getName() + "\" of type " + field.getFieldType().getName(); + assert false : "Child class " + newValue.getClass().getName() + " is not assignable to field \"" + field.getName() + "\" of type " + field.getType().getName(); return false; } } else if (field.getKind() == NodeFieldKind.CHILDREN) { - if (field.getFieldType().getComponentType().isAssignableFrom(newValue.getClass())) { + if (field.getType().getComponentType().isAssignableFrom(newValue.getClass())) { return true; } else { - assert false : "Child class " + newValue.getClass().getName() + " is not assignable to field \"" + field.getName() + "\" of type " + field.getFieldType().getName(); + assert false : "Child class " + newValue.getClass().getName() + " is not assignable to field \"" + field.getName() + "\" of type " + field.getType().getName(); return false; } } @@ -297,9 +297,9 @@ if (field != null) { switch (field.getKind()) { case CHILD: - return field.getFieldType().isAssignableFrom(newChild.getClass()); + return field.getType().isAssignableFrom(newChild.getClass()); case CHILDREN: - return field.getFieldType().getComponentType().isAssignableFrom(newChild.getClass()); + return field.getType().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.Lookup.get(node).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) {
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/source/Source.java Wed Nov 18 12:32:47 2015 +0100 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/source/Source.java Wed Nov 18 12:33:52 2015 +0100 @@ -543,6 +543,7 @@ * @return newly created object representing the specified region */ public final SourceSection createSection(String identifier, int startLine, int startColumn, int charIndex, int length) { + checkRange(charIndex, length); return new SourceSection(null, this, identifier, startLine, startColumn, charIndex, length); }
--- a/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLASTPrinter.java Wed Nov 18 12:32:47 2015 +0100 +++ b/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLASTPrinter.java Wed Nov 18 12:33:52 2015 +0100 @@ -80,7 +80,7 @@ ArrayList<NodeFieldAccessor> childFields = new ArrayList<>(); - for (NodeFieldAccessor field : NodeClass.Lookup.get(node.getClass()).getFields()) { + for (NodeFieldAccessor field : NodeClass.get(node.getClass()).getFields()) { if (field.getKind() == NodeFieldKind.CHILD || field.getKind() == NodeFieldKind.CHILDREN) { childFields.add(field); } else if (field.getKind() == NodeFieldKind.DATA) {