Skip to content

Commit 1e3d58f

Browse files
committed
Merge pull request #26 in G/truffle from ~ANDREAS.WOESS_ORACLE.COM/truffle:nodeclass_cleanup to master
* commit 'ce0dc4c77915817754f92f9625f28ccdfe04741c': Update sigtest snapshot Remove NodeField interface and add equivalent methods to NodeClass instead Sort node fields by kind, so that iteration can be stopped early Replace assertAssignable with more descriptive IllegalArgumentException Deprecate NodeFieldAccessor Introduce NodeClass.NodeField as replacement for NodeFieldAccessor Remove child and children field arrays and rewrite NodeIterator to not need them NodeClass cleanup SL: avoid use of Node.getChildren()
2 parents cb6dc7b + ce0dc4c commit 1e3d58f

File tree

12 files changed

+531
-303
lines changed

12 files changed

+531
-303
lines changed

truffle/com.oracle.truffle.api/snapshot.sigtest

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -695,12 +695,27 @@ intf java.lang.annotation.Annotation
695695

696696
CLSS public abstract com.oracle.truffle.api.nodes.NodeClass
697697
cons public init(java.lang.Class<? extends com.oracle.truffle.api.nodes.Node>)
698+
meth protected abstract boolean isChildField(java.lang.Object)
699+
meth protected abstract boolean isChildrenField(java.lang.Object)
700+
meth protected abstract boolean isCloneableField(java.lang.Object)
701+
meth protected abstract java.lang.Class<?> getFieldType(java.lang.Object)
702+
meth protected abstract java.lang.Iterable<?> getNodeFields()
703+
meth protected abstract java.lang.Object getFieldObject(java.lang.Object,com.oracle.truffle.api.nodes.Node)
704+
meth protected abstract java.lang.Object getFieldValue(java.lang.Object,com.oracle.truffle.api.nodes.Node)
705+
meth protected abstract java.lang.String getFieldName(java.lang.Object)
706+
meth protected abstract void putFieldObject(java.lang.Object,com.oracle.truffle.api.nodes.Node,java.lang.Object)
698707
meth public abstract com.oracle.truffle.api.nodes.NodeFieldAccessor getNodeClassField()
708+
anno 0 java.lang.Deprecated()
699709
meth public abstract com.oracle.truffle.api.nodes.NodeFieldAccessor getParentField()
710+
anno 0 java.lang.Deprecated()
700711
meth public abstract com.oracle.truffle.api.nodes.NodeFieldAccessor[] getChildFields()
712+
anno 0 java.lang.Deprecated()
701713
meth public abstract com.oracle.truffle.api.nodes.NodeFieldAccessor[] getChildrenFields()
714+
anno 0 java.lang.Deprecated()
702715
meth public abstract com.oracle.truffle.api.nodes.NodeFieldAccessor[] getCloneableFields()
716+
anno 0 java.lang.Deprecated()
703717
meth public abstract com.oracle.truffle.api.nodes.NodeFieldAccessor[] getFields()
718+
anno 0 java.lang.Deprecated()
704719
meth public abstract java.lang.Class<? extends com.oracle.truffle.api.nodes.Node> getType()
705720
meth public abstract java.util.Iterator<com.oracle.truffle.api.nodes.Node> makeIterator(com.oracle.truffle.api.nodes.Node)
706721
meth public static com.oracle.truffle.api.nodes.NodeClass get(com.oracle.truffle.api.nodes.Node)
@@ -726,19 +741,22 @@ meth public static com.oracle.truffle.api.nodes.NodeCost[] values()
726741
supr java.lang.Enum<com.oracle.truffle.api.nodes.NodeCost>
727742

728743
CLSS public abstract com.oracle.truffle.api.nodes.NodeFieldAccessor
744+
anno 0 java.lang.Deprecated()
729745
cons protected init(com.oracle.truffle.api.nodes.NodeFieldAccessor$NodeFieldKind,java.lang.Class<?>,java.lang.String,java.lang.Class<?>)
730746
fld protected final java.lang.Class<?> type
731747
innr public abstract static AbstractUnsafeNodeFieldAccessor
732748
innr public final static !enum NodeFieldKind
733749
meth protected static com.oracle.truffle.api.nodes.NodeFieldAccessor create(com.oracle.truffle.api.nodes.NodeFieldAccessor$NodeFieldKind,java.lang.reflect.Field)
734750
meth public abstract java.lang.Object getObject(com.oracle.truffle.api.nodes.Node)
751+
anno 0 java.lang.Deprecated()
735752
meth public abstract java.lang.Object loadValue(com.oracle.truffle.api.nodes.Node)
736753
meth public abstract void putObject(com.oracle.truffle.api.nodes.Node,java.lang.Object)
737754
anno 0 java.lang.Deprecated()
738755
meth public com.oracle.truffle.api.nodes.NodeFieldAccessor$NodeFieldKind getKind()
739756
meth public java.lang.Class<?> getDeclaringClass()
740757
meth public java.lang.Class<?> getType()
741758
meth public java.lang.String getName()
759+
meth public java.lang.String toString()
742760
supr java.lang.Object
743761
hfds USE_UNSAFE,declaringClass,kind,name
744762
hcls ReflectionNodeField,UnsafeNodeField
@@ -793,6 +811,7 @@ meth public static boolean replaceChild(com.oracle.truffle.api.nodes.Node,com.or
793811
meth public static boolean verify(com.oracle.truffle.api.nodes.Node)
794812
meth public static com.oracle.truffle.api.nodes.Node getNthParent(com.oracle.truffle.api.nodes.Node,int)
795813
meth public static com.oracle.truffle.api.nodes.NodeFieldAccessor findChildField(com.oracle.truffle.api.nodes.Node,com.oracle.truffle.api.nodes.Node)
814+
anno 0 java.lang.Deprecated()
796815
meth public static int countNodes(com.oracle.truffle.api.nodes.Node)
797816
meth public static int countNodes(com.oracle.truffle.api.nodes.Node,com.oracle.truffle.api.nodes.NodeUtil$NodeCountFilter)
798817
meth public static java.lang.String printCompactTreeToString(com.oracle.truffle.api.nodes.Node)

truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/ProbeFailure.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
package com.oracle.truffle.api.instrument;
2626

2727
import com.oracle.truffle.api.nodes.Node;
28-
import com.oracle.truffle.api.nodes.NodeFieldAccessor;
2928
import com.oracle.truffle.api.nodes.NodeUtil;
3029

3130
/**
@@ -139,13 +138,14 @@ public Object getWrapper() {
139138
}
140139

141140
/** @since 0.8 or earlier */
141+
@SuppressWarnings("deprecation")
142142
public String getMessage() {
143143
final StringBuilder sb = new StringBuilder(reason.message + ": ");
144144
if (parent != null) {
145145
sb.append("parent=" + parent.getClass().getSimpleName() + " ");
146146
if (child != null) {
147147
sb.append("child=" + child.getClass().getSimpleName() + " ");
148-
final NodeFieldAccessor field = NodeUtil.findChildField(parent, child);
148+
final com.oracle.truffle.api.nodes.NodeFieldAccessor field = NodeUtil.findChildField(parent, child);
149149
if (field != null) {
150150
sb.append("field=" + field.getName() + " ");
151151
}

truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/impl/DefaultASTPrinter.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@
3030

3131
import com.oracle.truffle.api.nodes.Node;
3232
import com.oracle.truffle.api.nodes.NodeClass;
33-
import com.oracle.truffle.api.nodes.NodeFieldAccessor;
34-
import com.oracle.truffle.api.nodes.NodeFieldAccessor.NodeFieldKind;
3533
import com.oracle.truffle.api.nodes.NodeUtil;
3634
import com.oracle.truffle.api.source.SourceSection;
3735

@@ -105,12 +103,12 @@ protected void printTree(PrintWriter p, Node node, int maxDepth, Node markNode,
105103

106104
p.print(NodeUtil.printSyntaxTags(node));
107105

108-
ArrayList<NodeFieldAccessor> childFields = new ArrayList<>();
106+
ArrayList<com.oracle.truffle.api.nodes.NodeFieldAccessor> childFields = new ArrayList<>();
109107

110-
for (NodeFieldAccessor field : NodeClass.get(node).getFields()) {
111-
if (field.getKind() == NodeFieldKind.CHILD || field.getKind() == NodeFieldKind.CHILDREN) {
108+
for (com.oracle.truffle.api.nodes.NodeFieldAccessor field : NodeClass.get(node).getFields()) {
109+
if (field.getKind() == com.oracle.truffle.api.nodes.NodeFieldAccessor.NodeFieldKind.CHILD || field.getKind() == com.oracle.truffle.api.nodes.NodeFieldAccessor.NodeFieldKind.CHILDREN) {
112110
childFields.add(field);
113-
} else if (field.getKind() == NodeFieldKind.DATA) {
111+
} else if (field.getKind() == com.oracle.truffle.api.nodes.NodeFieldAccessor.NodeFieldKind.DATA) {
114112
// p.print(sep);
115113
// sep = ", ";
116114
//
@@ -129,16 +127,16 @@ protected void printTree(PrintWriter p, Node node, int maxDepth, Node markNode,
129127

130128
if (childFields.size() != 0) {
131129
p.print(" {");
132-
for (NodeFieldAccessor field : childFields) {
130+
for (com.oracle.truffle.api.nodes.NodeFieldAccessor field : childFields) {
133131

134132
Object value = field.loadValue(node);
135133
if (value == null) {
136134
printNewLine(p, level);
137135
p.print(field.getName());
138136
p.print(" = null ");
139-
} else if (field.getKind() == NodeFieldKind.CHILD) {
137+
} else if (field.getKind() == com.oracle.truffle.api.nodes.NodeFieldAccessor.NodeFieldKind.CHILD) {
140138
printChild(p, maxDepth, markNode, level, field, value);
141-
} else if (field.getKind() == NodeFieldKind.CHILDREN) {
139+
} else if (field.getKind() == com.oracle.truffle.api.nodes.NodeFieldAccessor.NodeFieldKind.CHILDREN) {
142140
printChildren(p, maxDepth, markNode, level, field, value);
143141
} else {
144142
printNewLine(p, level);
@@ -151,7 +149,7 @@ protected void printTree(PrintWriter p, Node node, int maxDepth, Node markNode,
151149
}
152150
}
153151

154-
protected void printChildren(PrintWriter p, int maxDepth, Node markNode, int level, NodeFieldAccessor field, Object value) {
152+
protected void printChildren(PrintWriter p, int maxDepth, Node markNode, int level, com.oracle.truffle.api.nodes.NodeFieldAccessor field, Object value) {
155153
printNewLine(p, level);
156154
p.print(field.getName());
157155
Node[] children = (Node[]) value;
@@ -165,7 +163,7 @@ protected void printChildren(PrintWriter p, int maxDepth, Node markNode, int lev
165163
p.print("]");
166164
}
167165

168-
protected void printChild(PrintWriter p, int maxDepth, Node markNode, int level, NodeFieldAccessor field, Object value) {
166+
protected void printChild(PrintWriter p, int maxDepth, Node markNode, int level, com.oracle.truffle.api.nodes.NodeFieldAccessor field, Object value) {
169167
final Node valueNode = (Node) value;
170168
printNewLine(p, level, valueNode == markNode);
171169
p.print(field.getName());

truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/GraphPrintVisitor.java

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,10 @@
5050
import javax.xml.stream.XMLStreamWriter;
5151

5252
import com.oracle.truffle.api.TruffleOptions;
53-
import com.oracle.truffle.api.nodes.NodeFieldAccessor.NodeFieldKind;
5453

5554
/**
5655
* Utility class for creating output for the ideal graph visualizer.
57-
*
56+
*
5857
* @since 0.8 or earlier
5958
*/
6059
public class GraphPrintVisitor implements Closeable {
@@ -488,18 +487,22 @@ private void copyDebugProperties(Node node) {
488487
}
489488

490489
private void readNodeProperties(Node node) {
491-
NodeFieldAccessor[] fields = NodeClass.get(node).getFields();
492-
for (NodeFieldAccessor field : fields) {
493-
if (field.getKind() == NodeFieldKind.DATA) {
494-
String key = field.getName();
490+
NodeClass nodeClass = NodeClass.get(node);
491+
for (Object field : nodeClass.getNodeFields()) {
492+
if (isDataField(nodeClass, field)) {
493+
String key = nodeClass.getFieldName(field);
495494
if (!getElementByObject(node).getProperties().containsKey(key)) {
496-
Object value = field.loadValue(node);
495+
Object value = nodeClass.getFieldValue(field, node);
497496
setNodeProperty(node, key, value);
498497
}
499498
}
500499
}
501500
}
502501

502+
private static boolean isDataField(NodeClass nodeClass, Object field) {
503+
return !nodeClass.isChildField(field) && !nodeClass.isChildrenField(field);
504+
}
505+
503506
final void connectNodes(Object a, Object b, String label) {
504507
NodeElement fromNode = getElementByObject(a);
505508
NodeElement toNode = getElementByObject(b);
@@ -564,19 +567,19 @@ private static LinkedHashMap<String, Node> findNamedNodeChildren(Node node) {
564567
LinkedHashMap<String, Node> nodes = new LinkedHashMap<>();
565568
NodeClass nodeClass = NodeClass.get(node);
566569

567-
for (NodeFieldAccessor field : nodeClass.getFields()) {
568-
NodeFieldKind kind = field.getKind();
569-
if (kind == NodeFieldKind.CHILD || kind == NodeFieldKind.CHILDREN) {
570-
Object value = field.loadValue(node);
570+
for (Object field : nodeClass.getNodeFields()) {
571+
if (nodeClass.isChildField(field)) {
572+
Object value = nodeClass.getFieldObject(field, node);
573+
if (value != null) {
574+
nodes.put(nodeClass.getFieldName(field), (Node) value);
575+
}
576+
} else if (nodeClass.isChildrenField(field)) {
577+
Object value = nodeClass.getFieldObject(field, node);
571578
if (value != null) {
572-
if (kind == NodeFieldKind.CHILD) {
573-
nodes.put(field.getName(), (Node) value);
574-
} else if (kind == NodeFieldKind.CHILDREN) {
575-
Object[] children = (Object[]) value;
576-
for (int i = 0; i < children.length; i++) {
577-
if (children[i] != null) {
578-
nodes.put(field.getName() + "[" + i + "]", (Node) children[i]);
579-
}
579+
Object[] children = (Object[]) value;
580+
for (int i = 0; i < children.length; i++) {
581+
if (children[i] != null) {
582+
nodes.put(nodeClass.getFieldName(field) + "[" + i + "]", (Node) children[i]);
580583
}
581584
}
582585
}
@@ -598,7 +601,7 @@ private static String safeToString(Object value) {
598601
public class GraphPrintAdapter {
599602
/**
600603
* Default constructor.
601-
*
604+
*
602605
* @since 0.8 or earlier
603606
*/
604607
public GraphPrintAdapter() {

truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ NodeClass getNodeClass() {
8787
return nodeClass;
8888
}
8989

90+
void setParent(Node parent) {
91+
this.parent = parent;
92+
}
93+
9094
/**
9195
* Returns a rough estimate for the cost of this {@link Node}. This estimate can be used by
9296
* runtime systems or guest languages to implement heuristics based on Truffle ASTs. This method

truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeClass.java

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
/**
3232
* Information about a {@link Node} class. A single instance of this class is allocated for every
3333
* subclass of {@link Node} that is used.
34-
*
34+
*
3535
* @since 0.8 or earlier
3636
*/
3737
public abstract class NodeClass {
@@ -59,26 +59,37 @@ public static NodeClass get(Node node) {
5959
}
6060

6161
/** @since 0.8 or earlier */
62-
@SuppressWarnings("unused")
63-
public NodeClass(Class<? extends Node> clazz) {
62+
public NodeClass(@SuppressWarnings("unused") Class<? extends Node> clazz) {
6463
}
6564

6665
/** @since 0.8 or earlier */
66+
@SuppressWarnings("deprecation")
67+
@Deprecated
6768
public abstract NodeFieldAccessor getNodeClassField();
6869

6970
/** @since 0.8 or earlier */
71+
@SuppressWarnings("deprecation")
72+
@Deprecated
7073
public abstract NodeFieldAccessor[] getCloneableFields();
7174

7275
/** @since 0.8 or earlier */
76+
@SuppressWarnings("deprecation")
77+
@Deprecated
7378
public abstract NodeFieldAccessor[] getFields();
7479

7580
/** @since 0.8 or earlier */
81+
@SuppressWarnings("deprecation")
82+
@Deprecated
7683
public abstract NodeFieldAccessor getParentField();
7784

7885
/** @since 0.8 or earlier */
86+
@SuppressWarnings("deprecation")
87+
@Deprecated
7988
public abstract NodeFieldAccessor[] getChildFields();
8089

8190
/** @since 0.8 or earlier */
91+
@SuppressWarnings("deprecation")
92+
@Deprecated
8293
public abstract NodeFieldAccessor[] getChildrenFields();
8394

8495
/** @since 0.8 or earlier */
@@ -87,9 +98,50 @@ public NodeClass(Class<? extends Node> clazz) {
8798
/**
8899
* The {@link Class} this <code>NodeClass</code> has been {@link #NodeClass(java.lang.Class)
89100
* created for}.
90-
*
101+
*
91102
* @return the clazz of node this <code>NodeClass</code> describes
92103
* @since 0.8 or earlier
93104
*/
94105
public abstract Class<? extends Node> getType();
106+
107+
/** @since 0.14 */
108+
protected abstract Iterable<? extends Object> getNodeFields();
109+
110+
/** @since 0.14 */
111+
protected abstract void putFieldObject(Object field, Node receiver, Object value);
112+
113+
/** @since 0.14 */
114+
protected abstract Object getFieldObject(Object field, Node receiver);
115+
116+
/** @since 0.14 */
117+
protected abstract Object getFieldValue(Object field, Node receiver);
118+
119+
/** @since 0.14 */
120+
protected abstract Class<?> getFieldType(Object field);
121+
122+
/** @since 0.14 */
123+
protected abstract String getFieldName(Object field);
124+
125+
/** @since 0.14 */
126+
protected abstract boolean isChildField(Object field);
127+
128+
/** @since 0.14 */
129+
protected abstract boolean isChildrenField(Object field);
130+
131+
/** @since 0.14 */
132+
protected abstract boolean isCloneableField(Object field);
133+
134+
/**
135+
* If and only if this method returns {@code true}, {@link #getNodeFields()} adheres to the
136+
* following iteration order.
137+
* <ul>
138+
* <li>{@link Node.Child @Child} fields
139+
* <li>{@link Node.Children @Children} fields
140+
* <li>{@link NodeCloneable} fields
141+
* <li>Other fields
142+
* </ul>
143+
*/
144+
boolean nodeFieldsOrderedByKind() {
145+
return false;
146+
}
95147
}

0 commit comments

Comments
 (0)