Mercurial > hg > truffle
comparison graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java @ 11848:099af41815ea
Truffle: add NodeUtil.printSourceAttributionTree() for debugging
author | Michael Van De Vanter <michael.van.de.vanter@oracle.com> |
---|---|
date | Mon, 30 Sep 2013 20:47:41 -0700 |
parents | c7769440afd8 |
children | e68922869732 |
comparison
equal
deleted
inserted
replaced
11843:372bacc13022 | 11848:099af41815ea |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. Oracle designates this | 7 * published by the Free Software Foundation. Oracle designates this |
29 import java.lang.reflect.*; | 29 import java.lang.reflect.*; |
30 import java.util.*; | 30 import java.util.*; |
31 | 31 |
32 import sun.misc.*; | 32 import sun.misc.*; |
33 | 33 |
34 import com.oracle.truffle.api.*; | |
34 import com.oracle.truffle.api.nodes.Node.Child; | 35 import com.oracle.truffle.api.nodes.Node.Child; |
35 import com.oracle.truffle.api.nodes.Node.Children; | 36 import com.oracle.truffle.api.nodes.Node.Children; |
36 | 37 |
37 /** | 38 /** |
38 * Utility class that manages the special access methods for node instances. | 39 * Utility class that manages the special access methods for node instances. |
635 printCompactTree(p, node, child, level + 1); | 636 printCompactTree(p, node, child, level + 1); |
636 } | 637 } |
637 p.flush(); | 638 p.flush(); |
638 } | 639 } |
639 | 640 |
641 public static String printSourceAttributionTree(Node node) { | |
642 StringWriter out = new StringWriter(); | |
643 printSourceAttributionTree(new PrintWriter(out), null, node, 1); | |
644 return out.toString(); | |
645 } | |
646 | |
647 public static void printSourceAttributionTree(OutputStream out, Node node) { | |
648 printSourceAttributionTree(new PrintWriter(out), null, node, 1); | |
649 } | |
650 | |
651 private static void printSourceAttributionTree(PrintWriter p, Node parent, Node node, int level) { | |
652 if (node == null) { | |
653 return; | |
654 } | |
655 if (parent == null) { | |
656 // Add some preliminary information before starting with the root node | |
657 final SourceSection sourceSection = node.getSourceSection(); | |
658 if (sourceSection != null) { | |
659 final String txt = sourceSection.getSource().getCode(); | |
660 p.println("Full source len=(" + txt.length() + ") txt=___" + txt + "___"); | |
661 p.println("AST source attribution:"); | |
662 } | |
663 } | |
664 final StringBuilder sb = new StringBuilder(); | |
665 for (int i = 0; i < level; i++) { | |
666 sb.append(" "); | |
667 } | |
668 | |
669 if (parent != null) { | |
670 String childName = ""; | |
671 NodeField[] fields = NodeClass.get(parent.getClass()).fields; | |
672 for (NodeField field : fields) { | |
673 Object value = field.loadValue(parent); | |
674 if (value == node) { | |
675 childName = field.getName(); | |
676 break; | |
677 } else if (value instanceof Node[]) { | |
678 int index = 0; | |
679 for (Node arrayNode : (Node[]) value) { | |
680 if (arrayNode == node) { | |
681 childName = field.getName() + "[" + index + "]"; | |
682 break; | |
683 } | |
684 index++; | |
685 } | |
686 } | |
687 } | |
688 sb.append(childName); | |
689 } | |
690 | |
691 sb.append(" (" + node.getClass().getSimpleName() + ") "); | |
692 sb.append(displaySourceAttribution(node)); | |
693 p.println(sb.toString()); | |
694 | |
695 for (Node child : node.getChildren()) { | |
696 printSourceAttributionTree(p, node, child, level + 1); | |
697 } | |
698 p.flush(); | |
699 } | |
700 | |
640 /** | 701 /** |
641 * Prints a human readable form of a {@link Node} AST to the given {@link PrintStream}. This | 702 * Prints a human readable form of a {@link Node} AST to the given {@link PrintStream}. This |
642 * print method does not check for cycles in the node structure. | 703 * print method does not check for cycles in the node structure. |
643 * | 704 * |
644 * @param out the stream to print to. | 705 * @param out the stream to print to. |
722 } | 783 } |
723 | 784 |
724 private static String nodeName(Node node) { | 785 private static String nodeName(Node node) { |
725 return node.getClass().getSimpleName(); | 786 return node.getClass().getSimpleName(); |
726 } | 787 } |
788 | |
789 private static String displaySourceAttribution(Node node) { | |
790 final SourceSection section = node.getSourceSection(); | |
791 if (section != null) { | |
792 final String srcText = section.getCode(); | |
793 final StringBuilder sb = new StringBuilder(); | |
794 sb.append("source: len=" + srcText.length()); | |
795 sb.append(" (" + section.getCharIndex() + "," + (section.getCharEndIndex() - 1) + ")"); | |
796 sb.append(" txt=___" + srcText + "___"); | |
797 return sb.toString(); | |
798 } | |
799 return ""; | |
800 } | |
727 } | 801 } |