private static LinkedHashMap<String, Node> findNamedNodeChildren(Node node) { LinkedHashMap<String, Node> nodes = new LinkedHashMap<>(); NodeClass nodeClass = NodeClass.get(node); for (Object field : nodeClass.getNodeFields()) { if (nodeClass.isChildField(field)) { Object value = nodeClass.getFieldObject(field, node); if (value != null) { nodes.put(nodeClass.getFieldName(field), (Node) value); } } else if (nodeClass.isChildrenField(field)) { Object value = nodeClass.getFieldObject(field, node); if (value != null) { Object[] children = (Object[]) value; for (int i = 0; i < children.length; i++) { if (children[i] != null) { nodes.put(nodeClass.getFieldName(field) + "[" + i + "]", (Node) children[i]); } } } } } return nodes; }
@SuppressWarnings("deprecation") private static Iterable<com.oracle.truffle.api.nodes.NodeFieldAccessor> findNodeFields(NodeClass nodeClass) { return Arrays.asList(nodeClass.getFields()); }
public Iterator<Node> iterator() { return getNodeClass().makeIterator(Node.this); } };
private static boolean isDataField(NodeClass nodeClass, Object field) { return !nodeClass.isChildField(field) && !nodeClass.isChildrenField(field); }
private static String getNodeFieldName(Node parent, Node node, String defaultName) { NodeClass nodeClass = parent.getNodeClass(); for (Object field : nodeClass.getNodeFields()) { if (nodeClass.isChildField(field)) { if (nodeClass.getFieldObject(field, parent) == node) { return nodeClass.getFieldName(field); } } else if (nodeClass.isChildrenField(field)) { int index = 0; for (Object arrayNode : (Object[]) nodeClass.getFieldObject(field, parent)) { if (arrayNode == node) { return nodeClass.getFieldName(field) + "[" + index + "]"; } index++; } } else if (nodeClass.nodeFieldsOrderedByKind()) { break; } } return defaultName; }
private static void updateRootImpl(SpecializationNode start, Node node) { NodeFieldAccessor[] fields = NodeClass.get(start).getFields(); for (int i = fields.length - 1; i >= 0; i--) { NodeFieldAccessor f = fields[i]; if (f.getName().equals("root")) { f.putObject(start, node); break; } } if (start.next != null) { updateRootImpl(start.next, node); } }
String sep = ""; p.print("("); NodeClass nodeClass = NodeClass.get(node); for (Object field : nodeClass.getNodeFields()) { if (nodeClass.isChildField(field) || nodeClass.isChildrenField(field)) { childFields.add(field); } else { sep = ", "; p.print(nodeClass.getFieldName(field)); p.print(" = "); p.print(nodeClass.getFieldValue(field, node)); for (Object field : nodeClass.getNodeFields()) { printNewLine(p, level); p.print(nodeClass.getFieldName(field)); Object value = nodeClass.getFieldValue(field, node); if (value == null) { p.print(" = null "); } else if (nodeClass.isChildField(field)) { p.print(" = "); printTree(p, (Node) value, level + 1); } else if (nodeClass.isChildrenField(field)) { printChildren(p, level, value);
private void readNodeProperties(Node node) { NodeClass nodeClass = NodeClass.get(node); for (Object field : nodeClass.getNodeFields()) { if (isDataField(nodeClass, field)) { String key = nodeClass.getFieldName(field); if (!getElementByObject(node).getProperties().containsKey(key)) { Object value = nodeClass.getFieldValue(field, node); setNodeProperty(node, key, value); } } } }
NodeClass getNodeClass() { return NodeClass.get(getClass()); }
private static Node updateParent(Node parent, Node child) { if (child != null) { NodeClass nodeClass = NodeClass.get(child.getClass()); nodeClass.getNodeClassField().putObject(child, nodeClass); nodeClass.getParentField().putObject(child, parent); } return child; }
/** @since 0.8 or earlier */ public Iterator<Node> makeIterator(Node node) { List<Object> arr = new ArrayList<>(); for (Object field : getNodeFields()) { arr.add(field); } return new NodeIterator(this, node, arr.toArray()); }
private static String getNodeFieldName(Node parent, Node node, String defaultName) { NodeClass nodeClass = parent.getNodeClass(); for (Object field : nodeClass.getNodeFields()) { if (nodeClass.isChildField(field)) { if (nodeClass.getFieldObject(field, parent) == node) { return nodeClass.getFieldName(field); } } else if (nodeClass.isChildrenField(field)) { int index = 0; for (Object arrayNode : (Object[]) nodeClass.getFieldObject(field, parent)) { if (arrayNode == node) { return nodeClass.getFieldName(field) + "[" + index + "]"; } index++; } } else if (nodeClass.nodeFieldsOrderedByKind()) { break; } } return defaultName; }
@SuppressWarnings("deprecation") private String getFieldName(Node parent, Node node) { for (com.oracle.truffle.api.nodes.NodeFieldAccessor field : NodeClass.get(parent).getFields()) { Object value = field.loadValue(parent); if (value == node) { return field.getName(); } else if (value instanceof Node[]) { int index = 0; for (Node arrayNode : (Node[]) value) { if (arrayNode == node) { return field.getName() + "[" + index + "]"; } index++; } } } return "unknownField"; }
String sep = ""; p.print("("); NodeClass nodeClass = NodeClass.get(node); for (Object field : nodeClass.getNodeFields()) { if (nodeClass.isChildField(field) || nodeClass.isChildrenField(field)) { childFields.add(field); } else { sep = ", "; p.print(nodeClass.getFieldName(field)); p.print(" = "); p.print(nodeClass.getFieldValue(field, node)); for (Object field : nodeClass.getNodeFields()) { printNewLine(p, level); p.print(nodeClass.getFieldName(field)); Object value = nodeClass.getFieldValue(field, node); if (value == null) { p.print(" = null "); } else if (nodeClass.isChildField(field)) { p.print(" = "); printTree(p, (Node) value, level + 1); } else if (nodeClass.isChildrenField(field)) { printChildren(p, level, value);
private void readNodeProperties(Node node) { NodeClass nodeClass = NodeClass.get(node); for (Object field : nodeClass.getNodeFields()) { if (isDataField(nodeClass, field)) { String key = nodeClass.getFieldName(field); if (!getElementByObject(node).getProperties().containsKey(key)) { Object value = nodeClass.getFieldValue(field, node); setNodeProperty(node, key, value); } } } }
NodeClass getNodeClass() { return NodeClass.get(getClass()); }
private static boolean isDataField(NodeClass nodeClass, Object field) { return !nodeClass.isChildField(field) && !nodeClass.isChildrenField(field); }
/** @since 0.8 or earlier */ public Iterator<Node> makeIterator(Node node) { List<Object> arr = new ArrayList<>(); for (Object field : getNodeFields()) { arr.add(field); } return new NodeIterator(this, node, arr.toArray()); }
private void advance() { if (advanceChildren()) { return; } while (fieldsIndex < fields.length) { Object field = fields[fieldsIndex++]; if (nodeClass.isChildField(field)) { next = (Node) nodeClass.getFieldObject(field, node); if (next != null) { return; } } else if (nodeClass.isChildrenField(field)) { children = (Object[]) nodeClass.getFieldObject(field, node); childrenIndex = 0; if (advanceChildren()) { return; } } else if (nodeClass.nodeFieldsOrderedByKind()) { break; } } next = null; }
private Node invokeDeserialize(VariableLengthIntBuffer buffer, Class<? extends Node> nodeClass) throws UnsupportedConstantPoolTypeException { if (nodeClass == null) { return null; } Object object; try { object = unsafe.allocateInstance(nodeClass); } catch (InstantiationException e) { throw new RuntimeException("Unable to allocate truffle node " + nodeClass, e); } if (!(object instanceof Node)) { throw new RuntimeException("Class is not a truffle node " + nodeClass); } Node node = (Node) object; NodeFieldAccessor[] nodeFields = NodeClass.get(nodeClass).getFields(); deserializeChildrenFields(node, nodeFields); deserializeChildFields(node, nodeFields); deserializeDataFields(buffer, node, nodeFields); return node; }