# HG changeset patch # User Andreas Woess # Date 1425045447 -3600 # Node ID 73811d1b4cd0d89423462f10c05afa8b384dd88f # Parent d344d76b7b6dbadf0ddba964c6c09d136add76c1 Truffle: add NodeUtil.forEachChild diff -r d344d76b7b6d -r 73811d1b4cd0 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java Fri Feb 27 14:55:42 2015 +0100 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java Fri Feb 27 14:57:27 2015 +0100 @@ -696,6 +696,42 @@ return false; } + /** + * Executes a closure for every non-null child of the parent node. + * + * @return {@code true} if all children were visited, {@code false} otherwise + */ + public static boolean forEachChild(Node parent, NodeVisitor visitor) { + Objects.requireNonNull(visitor); + NodeClass parentNodeClass = NodeClass.get(parent.getClass()); + + for (NodeField field : parentNodeClass.getChildFields()) { + Object child = field.getObject(parent); + if (child != null) { + if (!visitor.visit((Node) child)) { + return false; + } + } + } + + for (NodeField field : parentNodeClass.getChildrenFields()) { + Object arrayObject = field.getObject(parent); + if (arrayObject != null) { + Object[] array = (Object[]) arrayObject; + for (int i = 0; i < array.length; i++) { + Object child = array[i]; + if (child != null) { + if (!visitor.visit((Node) child)) { + return false; + } + } + } + } + } + + return true; + } + /** Returns all declared fields in the class hierarchy. */ private static Field[] getAllFields(Class clazz) { Field[] declaredFields = clazz.getDeclaredFields();