diff graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SLNodeFactory.java @ 16595:618d92152d3c

SL: Added support for instrumentation.
author David Piorkowski <david.piorkowski@oracle.com>
date Thu, 24 Jul 2014 16:14:44 -0700
parents abe7128ca473
children 0fc43b066eee
line wrap: on
line diff
--- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SLNodeFactory.java	Thu Jul 24 12:22:54 2014 -0700
+++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SLNodeFactory.java	Thu Jul 24 16:14:44 2014 -0700
@@ -32,6 +32,7 @@
 import com.oracle.truffle.sl.nodes.call.*;
 import com.oracle.truffle.sl.nodes.controlflow.*;
 import com.oracle.truffle.sl.nodes.expression.*;
+import com.oracle.truffle.sl.nodes.instrument.*;
 import com.oracle.truffle.sl.nodes.local.*;
 import com.oracle.truffle.sl.runtime.*;
 
@@ -72,9 +73,12 @@
     /* State while parsing a block. */
     private LexicalScope lexicalScope;
 
-    public SLNodeFactory(SLContext context, Source source) {
+    private final SLNodeProber prober;
+
+    public SLNodeFactory(SLContext context, Source source, SLNodeProber prober) {
         this.context = context;
         this.source = source;
+        this.prober = prober;
     }
 
     public void startFunction(Token nameToken) {
@@ -179,6 +183,14 @@
     public SLStatementNode createIf(Token t, SLExpressionNode conditionNode, SLStatementNode thenPartNode, SLStatementNode elsePartNode) {
         final int start = t.charPos;
         final int end = elsePartNode == null ? thenPartNode.getSourceSection().getCharEndIndex() : elsePartNode.getSourceSection().getCharEndIndex();
+
+        // if (prober != null) {
+        // SLStatementNode wrappedThenNode = prober.probeAsStatement(thenPartNode);
+        // // SLStatementNode wrappedElseNode = prober.probeAsStatement(elsePartNode);
+        // return new SLIfNode(source.createSection(t.val, start, end - start), conditionNode,
+        // wrappedThenNode, elsePartNode);
+        // }
+
         return new SLIfNode(source.createSection(t.val, start, end - start), conditionNode, thenPartNode, elsePartNode);
     }
 
@@ -227,6 +239,10 @@
         final int endPos = finalToken.charPos + finalToken.val.length();
         final SourceSection src = source.createSection(nameToken.val, startPos, endPos - startPos);
         SLExpressionNode functionNode = createRead(nameToken);
+        if (prober != null) {
+            SLExpressionNode wrappedNode = prober.probeAsCall(functionNode, nameToken.val);
+            return SLInvokeNode.create(src, wrappedNode, parameterNodes.toArray(new SLExpressionNode[parameterNodes.size()]));
+        }
         return SLInvokeNode.create(src, functionNode, parameterNodes.toArray(new SLExpressionNode[parameterNodes.size()]));
     }
 
@@ -235,6 +251,10 @@
         lexicalScope.locals.put(nameToken.val, frameSlot);
         final int start = nameToken.charPos;
         final int length = valueNode.getSourceSection().getCharEndIndex() - start;
+        if (prober != null) {
+            final SLExpressionNode wrappedNode = prober.probeAsLocalAssignment(valueNode, nameToken.val);
+            return SLWriteLocalVariableNodeFactory.create(source.createSection("=", start, length), wrappedNode, frameSlot);
+        }
         return SLWriteLocalVariableNodeFactory.create(source.createSection("=", start, length), valueNode, frameSlot);
     }