comparison graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java @ 19607:73811d1b4cd0

Truffle: add NodeUtil.forEachChild
author Andreas Woess <andreas.woess@oracle.com>
date Fri, 27 Feb 2015 14:57:27 +0100
parents 67d9e635102f
children f682b9e6ca07
comparison
equal deleted inserted replaced
19606:d344d76b7b6d 19607:73811d1b4cd0
694 } 694 }
695 } 695 }
696 return false; 696 return false;
697 } 697 }
698 698
699 /**
700 * Executes a closure for every non-null child of the parent node.
701 *
702 * @return {@code true} if all children were visited, {@code false} otherwise
703 */
704 public static boolean forEachChild(Node parent, NodeVisitor visitor) {
705 Objects.requireNonNull(visitor);
706 NodeClass parentNodeClass = NodeClass.get(parent.getClass());
707
708 for (NodeField field : parentNodeClass.getChildFields()) {
709 Object child = field.getObject(parent);
710 if (child != null) {
711 if (!visitor.visit((Node) child)) {
712 return false;
713 }
714 }
715 }
716
717 for (NodeField field : parentNodeClass.getChildrenFields()) {
718 Object arrayObject = field.getObject(parent);
719 if (arrayObject != null) {
720 Object[] array = (Object[]) arrayObject;
721 for (int i = 0; i < array.length; i++) {
722 Object child = array[i];
723 if (child != null) {
724 if (!visitor.visit((Node) child)) {
725 return false;
726 }
727 }
728 }
729 }
730 }
731
732 return true;
733 }
734
699 /** Returns all declared fields in the class hierarchy. */ 735 /** Returns all declared fields in the class hierarchy. */
700 private static Field[] getAllFields(Class<? extends Object> clazz) { 736 private static Field[] getAllFields(Class<? extends Object> clazz) {
701 Field[] declaredFields = clazz.getDeclaredFields(); 737 Field[] declaredFields = clazz.getDeclaredFields();
702 if (clazz.getSuperclass() != null) { 738 if (clazz.getSuperclass() != null) {
703 return concat(getAllFields(clazz.getSuperclass()), declaredFields); 739 return concat(getAllFields(clazz.getSuperclass()), declaredFields);