changeset 22302:0bd25f39d655

Truffle/SL: change default ASTProber policy to eliminate debugger halts on SLStatement nodes that aren't statements: function body, block, and the assignments from araguments to locals that begin each function body.
author Michael Van De Vanter <michael.van.de.vanter@oracle.com>
date Mon, 12 Oct 2015 12:51:38 -0400
parents 145f995cd2fe
children 1362f35d1f5e
files truffle/com.oracle.truffle.sl.test/src/com/oracle/truffle/sl/test/SLDebugTest.java truffle/com.oracle.truffle.sl.test/src/tests_instrumentation/Instrumentation_assnCount.output truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLStandardASTProber.java
diffstat 3 files changed, 25 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.sl.test/src/com/oracle/truffle/sl/test/SLDebugTest.java	Fri Oct 09 12:17:58 2015 -0400
+++ b/truffle/com.oracle.truffle.sl.test/src/com/oracle/truffle/sl/test/SLDebugTest.java	Mon Oct 12 12:51:38 2015 -0400
@@ -141,7 +141,7 @@
                 assertEquals("one var slot", 1, frame.getFrameDescriptor().getSlots().size());
                 Object resName = frame.getFrameDescriptor().getSlots().get(0).getFrameDescriptor().getIdentifiers().iterator().next();
                 assertEquals("res", resName);
-                suspendedEvent.prepareStepInto(2);
+                suspendedEvent.prepareStepInto(1);
                 suspendedEvent = null;
                 return null;
             }
@@ -150,7 +150,7 @@
         run(new Callable<Void>() {
             @Override
             public Void call() throws Exception {
-                assertLine(6);
+                assertLine(7);
 
                 final MaterializedFrame frame = suspendedEvent.getFrame();
                 assertEquals("One argument", 1, frame.getArguments().length);
@@ -165,10 +165,7 @@
             @Override
             public Void call() throws Exception {
                 assertNotNull(suspendedEvent);
-
-                // XXX wrong step over:
-                // assertLine(7);
-
+                assertLine(10);
                 suspendedEvent.prepareContinue();
                 suspendedEvent = null;
                 return null;
--- a/truffle/com.oracle.truffle.sl.test/src/tests_instrumentation/Instrumentation_assnCount.output	Fri Oct 09 12:17:58 2015 -0400
+++ b/truffle/com.oracle.truffle.sl.test/src/tests_instrumentation/Instrumentation_assnCount.output	Mon Oct 12 12:51:38 2015 -0400
@@ -1,4 +1,3 @@
-100
 0
 1
 2
--- a/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLStandardASTProber.java	Fri Oct 09 12:17:58 2015 -0400
+++ b/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLStandardASTProber.java	Mon Oct 12 12:51:38 2015 -0400
@@ -53,7 +53,10 @@
 import com.oracle.truffle.api.nodes.RootNode;
 import com.oracle.truffle.sl.nodes.SLExpressionNode;
 import com.oracle.truffle.sl.nodes.SLStatementNode;
+import com.oracle.truffle.sl.nodes.controlflow.SLBlockNode;
+import com.oracle.truffle.sl.nodes.controlflow.SLFunctionBodyNode;
 import com.oracle.truffle.sl.nodes.controlflow.SLWhileNode;
+import com.oracle.truffle.sl.nodes.local.SLReadArgumentNode;
 import com.oracle.truffle.sl.nodes.local.SLWriteLocalVariableNode;
 
 /**
@@ -65,16 +68,22 @@
     public void probeAST(final Instrumenter instrumenter, RootNode startNode) {
         startNode.accept(new NodeVisitor() {
 
-            /**
-             * Instruments and tags all relevant {@link SLStatementNode}s and
-             * {@link SLExpressionNode}s. Currently, only SLStatementNodes that are not
-             * SLExpressionNodes are tagged as statements.
-             */
             public boolean visit(Node node) {
 
                 if (!(node instanceof InstrumentationNode) && node instanceof SLStatementNode && node.getParent() != null && node.getSourceSection() != null) {
-                    // All SL nodes are instrumentable, but treat expressions specially
+
+                    // Skip nodes that don't really correspond to statements
+                    if (node instanceof SLFunctionBodyNode || node instanceof SLBlockNode || node instanceof SLReadArgumentNode) {
+                        return true;
+                    }
 
+                    // Skip synthetic statements at beginning of function body that assign locals
+                    if (node instanceof SLWriteLocalVariableNode) {
+                        final Node child = node.getChildren().iterator().next();
+                        if (child instanceof SLReadArgumentNode) {
+                            return true;
+                        }
+                    }
                     if (node instanceof SLExpressionNode) {
                         SLExpressionNode expressionNode = (SLExpressionNode) node;
                         final Probe probe = instrumenter.probe(expressionNode);
@@ -83,11 +92,13 @@
                             probe.tagAs(ASSIGNMENT, null);
                         }
                     } else {
-                        SLStatementNode statementNode = (SLStatementNode) node;
-                        final Probe probe = instrumenter.probe(statementNode);
-                        probe.tagAs(STATEMENT, null);
-                        if (node instanceof SLWhileNode) {
-                            probe.tagAs(START_LOOP, null);
+                        if (!(node.getParent() instanceof SLFunctionBodyNode)) {
+                            SLStatementNode statementNode = (SLStatementNode) node;
+                            final Probe probe = instrumenter.probe(statementNode);
+                            probe.tagAs(STATEMENT, null);
+                            if (node instanceof SLWhileNode) {
+                                probe.tagAs(START_LOOP, null);
+                            }
                         }
                     }
                 }