Mercurial > hg > graal-jvmci-8
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 = ", "; |