comparison graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java @ 20130:8dc73c226c63

Truffle: cache NodeClass lookup in Node.
author Christian Humer <christian.humer@gmail.com>
date Thu, 02 Apr 2015 01:26:31 +0200
parents 5b7db8941fd7
children 4b12d5355811
comparison
equal deleted inserted replaced
20129:5b7db8941fd7 20130:8dc73c226c63
52 52
53 int getTypeSize(Class<?> clazz); 53 int getTypeSize(Class<?> clazz);
54 } 54 }
55 55
56 static Iterator<Node> makeIterator(Node node) { 56 static Iterator<Node> makeIterator(Node node) {
57 return NodeClass.get(node.getClass()).makeIterator(node); 57 return node.getNodeClass().makeIterator(node);
58 } 58 }
59 59
60 public static Iterator<Node> makeRecursiveIterator(Node node) { 60 public static Iterator<Node> makeRecursiveIterator(Node node) {
61 return new RecursiveNodeIterator(node); 61 return new RecursiveNodeIterator(node);
62 } 62 }
130 return (T) orig.deepCopy(); 130 return (T) orig.deepCopy();
131 } 131 }
132 132
133 static Node deepCopyImpl(Node orig) { 133 static Node deepCopyImpl(Node orig) {
134 final Node clone = orig.copy(); 134 final Node clone = orig.copy();
135 NodeClass nodeClass = NodeClass.get(clone.getClass()); 135 NodeClass nodeClass = clone.getNodeClass();
136 136
137 nodeClass.getParentField().putObject(clone, null); 137 nodeClass.getParentField().putObject(clone, null);
138 138
139 for (NodeFieldAccessor childField : nodeClass.getChildFields()) { 139 for (NodeFieldAccessor childField : nodeClass.getChildFields()) {
140 Node child = (Node) childField.getObject(orig); 140 Node child = (Node) childField.getObject(orig);
167 return clone; 167 return clone;
168 } 168 }
169 169
170 public static List<Node> findNodeChildren(Node node) { 170 public static List<Node> findNodeChildren(Node node) {
171 List<Node> nodes = new ArrayList<>(); 171 List<Node> nodes = new ArrayList<>();
172 NodeClass nodeClass = NodeClass.get(node.getClass()); 172 NodeClass nodeClass = node.getNodeClass();
173 173
174 for (NodeFieldAccessor nodeField : nodeClass.getChildFields()) { 174 for (NodeFieldAccessor nodeField : nodeClass.getChildFields()) {
175 Object child = nodeField.getObject(node); 175 Object child = nodeField.getObject(node);
176 if (child != null) { 176 if (child != null) {
177 nodes.add((Node) child); 177 nodes.add((Node) child);
195 oldNode.replaceHelper(newNode, reason); 195 oldNode.replaceHelper(newNode, reason);
196 return newNode; 196 return newNode;
197 } 197 }
198 198
199 public static boolean replaceChild(Node parent, Node oldChild, Node newChild) { 199 public static boolean replaceChild(Node parent, Node oldChild, Node newChild) {
200 NodeClass nodeClass = NodeClass.get(parent.getClass()); 200 NodeClass nodeClass = parent.getNodeClass();
201 201
202 for (NodeFieldAccessor nodeField : nodeClass.getChildFields()) { 202 for (NodeFieldAccessor nodeField : nodeClass.getChildFields()) {
203 if (nodeField.getObject(parent) == oldChild) { 203 if (nodeField.getObject(parent) == oldChild) {
204 assert assertAssignable(nodeField, newChild); 204 assert assertAssignable(nodeField, newChild);
205 nodeField.putObject(parent, newChild); 205 nodeField.putObject(parent, newChild);
250 * 250 *
251 * @return the field (possibly an array) holding the child, {@code null} if not found. 251 * @return the field (possibly an array) holding the child, {@code null} if not found.
252 */ 252 */
253 public static NodeFieldAccessor findChildField(Node parent, Node child) { 253 public static NodeFieldAccessor findChildField(Node parent, Node child) {
254 assert child != null; 254 assert child != null;
255 NodeClass parentNodeClass = NodeClass.get(parent.getClass()); 255 NodeClass parentNodeClass = parent.getNodeClass();
256 256
257 for (NodeFieldAccessor field : parentNodeClass.getChildFields()) { 257 for (NodeFieldAccessor field : parentNodeClass.getChildFields()) {
258 if (field.getObject(parent) == child) { 258 if (field.getObject(parent) == child) {
259 return field; 259 return field;
260 } 260 }
300 * 300 *
301 * @return {@code true} if all children were visited, {@code false} otherwise 301 * @return {@code true} if all children were visited, {@code false} otherwise
302 */ 302 */
303 public static boolean forEachChild(Node parent, NodeVisitor visitor) { 303 public static boolean forEachChild(Node parent, NodeVisitor visitor) {
304 Objects.requireNonNull(visitor); 304 Objects.requireNonNull(visitor);
305 NodeClass parentNodeClass = NodeClass.get(parent.getClass()); 305 NodeClass parentNodeClass = parent.getNodeClass();
306 306
307 for (NodeFieldAccessor field : parentNodeClass.getChildFields()) { 307 for (NodeFieldAccessor field : parentNodeClass.getChildFields()) {
308 Object child = field.getObject(parent); 308 Object child = field.getObject(parent);
309 if (child != null) { 309 if (child != null) {
310 if (!visitor.visit((Node) child)) { 310 if (!visitor.visit((Node) child)) {
562 } 562 }
563 p.flush(); 563 p.flush();
564 } 564 }
565 565
566 private static String getNodeFieldName(Node parent, Node node, String defaultName) { 566 private static String getNodeFieldName(Node parent, Node node, String defaultName) {
567 NodeFieldAccessor[] fields = NodeClass.get(parent.getClass()).getFields(); 567 NodeFieldAccessor[] fields = parent.getNodeClass().getFields();
568 for (NodeFieldAccessor field : fields) { 568 for (NodeFieldAccessor field : fields) {
569 Object value = field.loadValue(parent); 569 Object value = field.loadValue(parent);
570 if (field.getKind() == NodeFieldKind.CHILD && value == node) { 570 if (field.getKind() == NodeFieldKind.CHILD && value == node) {
571 return field.getName(); 571 return field.getName();
572 } else if (field.getKind() == NodeFieldKind.CHILDREN) { 572 } else if (field.getKind() == NodeFieldKind.CHILDREN) {
642 p.print(nodeName(node)); 642 p.print(nodeName(node));
643 643
644 ArrayList<NodeFieldAccessor> childFields = new ArrayList<>(); 644 ArrayList<NodeFieldAccessor> childFields = new ArrayList<>();
645 String sep = ""; 645 String sep = "";
646 p.print("("); 646 p.print("(");
647 for (NodeFieldAccessor field : NodeClass.get(node.getClass()).getFields()) { 647 for (NodeFieldAccessor field : NodeClass.get(node).getFields()) {
648 if (field.getKind() == NodeFieldKind.CHILD || field.getKind() == NodeFieldKind.CHILDREN) { 648 if (field.getKind() == NodeFieldKind.CHILD || field.getKind() == NodeFieldKind.CHILDREN) {
649 childFields.add(field); 649 childFields.add(field);
650 } else if (field.getKind() == NodeFieldKind.DATA) { 650 } else if (field.getKind() == NodeFieldKind.DATA) {
651 p.print(sep); 651 p.print(sep);
652 sep = ", "; 652 sep = ", ";