private int childrenCount() { int nodeCount = childFields.length; for (NodeFieldAccessor childrenField : childrenFields) { Object[] children = ((Object[]) childrenField.getObject(node)); if (children != null) { nodeCount += children.length; } } return nodeCount; }
@Override protected Object getFieldObject(Object field, Node receiver) { return ((NodeFieldAccessor) field).getObject(receiver); }
@Override protected Object getFieldObject(Object field, Node receiver) { return ((NodeFieldAccessor) field).getObject(receiver); }
@SuppressWarnings({"deprecation", "unused"}) private static Object findFieldObject(NodeClass nodeClass, com.oracle.truffle.api.nodes.NodeFieldAccessor field, Node node) { return field.getObject(node); }
private Node nodeAt(int idx) { int nodeCount = childFields.length; if (idx < nodeCount) { return (Node) childFields[idx].getObject(node); } else { for (NodeFieldAccessor childrenField : childrenFields) { Object[] nodeArray = (Object[]) childrenField.getObject(node); if (idx < nodeCount + nodeArray.length) { return (Node) nodeArray[idx - nodeCount]; } nodeCount += nodeArray.length; } } return null; }
public static List<Node> findNodeChildren(Node node) { List<Node> nodes = new ArrayList<>(); NodeClass nodeClass = node.getNodeClass(); for (NodeFieldAccessor nodeField : nodeClass.getChildFields()) { Object child = nodeField.getObject(node); if (child != null) { nodes.add((Node) child); } } for (NodeFieldAccessor nodeField : nodeClass.getChildrenFields()) { Object[] children = (Object[]) nodeField.getObject(node); if (children != null) { for (Object child : children) { if (child != null) { nodes.add((Node) child); } } } } return nodes; }
/** * Finds the field in a parent node, if any, that holds a specified child node. * * @return the field (possibly an array) holding the child, {@code null} if not found. */ public static NodeFieldAccessor findChildField(Node parent, Node child) { assert child != null; NodeClass parentNodeClass = parent.getNodeClass(); for (NodeFieldAccessor field : parentNodeClass.getChildFields()) { if (field.getObject(parent) == child) { return field; } } for (NodeFieldAccessor field : parentNodeClass.getChildrenFields()) { Object arrayObject = field.getObject(parent); if (arrayObject != null) { Object[] array = (Object[]) arrayObject; for (int i = 0; i < array.length; i++) { if (array[i] == child) { return field; } } } } return null; }
/** * Finds the field in a parent node, if any, that holds a specified child node. * * @return the field (possibly an array) holding the child, {@code null} if not found. * @since 0.8 or earlier */ @SuppressWarnings("deprecation") @Deprecated public static NodeFieldAccessor findChildField(Node parent, Node child) { assert child != null; NodeClass parentNodeClass = parent.getNodeClass(); for (NodeFieldAccessor field : parentNodeClass.getFields()) { if (field.getKind() == NodeFieldAccessor.NodeFieldKind.CHILD) { if (field.getObject(parent) == child) { return field; } } else if (field.getKind() == NodeFieldAccessor.NodeFieldKind.CHILDREN) { Object arrayObject = field.getObject(parent); if (arrayObject != null) { Object[] array = (Object[]) arrayObject; for (int i = 0; i < array.length; i++) { if (array[i] == child) { return field; } } } } } return null; }
static boolean forEachChildRecursive(Node parent, NodeVisitor visitor) { NodeClass parentNodeClass = parent.getNodeClass(); for (NodeFieldAccessor field : parentNodeClass.getChildFields()) { if (!visitChild((Node) field.getObject(parent), visitor)) { return false; } } for (NodeFieldAccessor field : parentNodeClass.getChildrenFields()) { Object arrayObject = field.getObject(parent); if (arrayObject == null) { continue; } Object[] array = (Object[]) arrayObject; for (int i = 0; i < array.length; i++) { if (!visitChild((Node) array[i], visitor)) { return false; } } } return true; }
/** * Finds the field in a parent node, if any, that holds a specified child node. * * @return the field (possibly an array) holding the child, {@code null} if not found. * @since 0.8 or earlier */ @SuppressWarnings("deprecation") @Deprecated public static NodeFieldAccessor findChildField(Node parent, Node child) { assert child != null; NodeClass parentNodeClass = parent.getNodeClass(); for (NodeFieldAccessor field : parentNodeClass.getFields()) { if (field.getKind() == NodeFieldAccessor.NodeFieldKind.CHILD) { if (field.getObject(parent) == child) { return field; } } else if (field.getKind() == NodeFieldAccessor.NodeFieldKind.CHILDREN) { Object arrayObject = field.getObject(parent); if (arrayObject != null) { Object[] array = (Object[]) arrayObject; for (int i = 0; i < array.length; i++) { if (array[i] == child) { return field; } } } } } return null; }
public static boolean replaceChild(Node parent, Node oldChild, Node newChild) { NodeClass nodeClass = parent.getNodeClass(); for (NodeFieldAccessor nodeField : nodeClass.getChildFields()) { if (nodeField.getObject(parent) == oldChild) { assert assertAssignable(nodeField, newChild); nodeField.putObject(parent, newChild); return true; } } for (NodeFieldAccessor nodeField : nodeClass.getChildrenFields()) { Object arrayObject = nodeField.getObject(parent); if (arrayObject != null) { Object[] array = (Object[]) arrayObject; for (int i = 0; i < array.length; i++) { if (array[i] == oldChild) { assert assertAssignable(nodeField, newChild); array[i] = newChild; return true; } } } } return false; }
Node child = (Node) childField.getObject(orig); if (child != null) { Node clonedChild = child.deepCopy(); Object[] children = (Object[]) childrenField.getObject(orig); if (children != null) { Object[] clonedChildren = (Object[]) Array.newInstance(children.getClass().getComponentType(), children.length); Object cloneable = cloneableField.getObject(clone); if (cloneable != null && cloneable == cloneableField.getObject(orig)) { cloneableField.putObject(clone, ((NodeCloneable) cloneable).clone());