comparison 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
comparison
equal deleted inserted replaced
16592:8084d44c78d3 16595:618d92152d3c
30 import com.oracle.truffle.api.source.*; 30 import com.oracle.truffle.api.source.*;
31 import com.oracle.truffle.sl.nodes.*; 31 import com.oracle.truffle.sl.nodes.*;
32 import com.oracle.truffle.sl.nodes.call.*; 32 import com.oracle.truffle.sl.nodes.call.*;
33 import com.oracle.truffle.sl.nodes.controlflow.*; 33 import com.oracle.truffle.sl.nodes.controlflow.*;
34 import com.oracle.truffle.sl.nodes.expression.*; 34 import com.oracle.truffle.sl.nodes.expression.*;
35 import com.oracle.truffle.sl.nodes.instrument.*;
35 import com.oracle.truffle.sl.nodes.local.*; 36 import com.oracle.truffle.sl.nodes.local.*;
36 import com.oracle.truffle.sl.runtime.*; 37 import com.oracle.truffle.sl.runtime.*;
37 38
38 /** 39 /**
39 * Helper class used by the SL {@link Parser} to create nodes. The code is factored out of the 40 * Helper class used by the SL {@link Parser} to create nodes. The code is factored out of the
70 private List<SLStatementNode> methodNodes; 71 private List<SLStatementNode> methodNodes;
71 72
72 /* State while parsing a block. */ 73 /* State while parsing a block. */
73 private LexicalScope lexicalScope; 74 private LexicalScope lexicalScope;
74 75
75 public SLNodeFactory(SLContext context, Source source) { 76 private final SLNodeProber prober;
77
78 public SLNodeFactory(SLContext context, Source source, SLNodeProber prober) {
76 this.context = context; 79 this.context = context;
77 this.source = source; 80 this.source = source;
81 this.prober = prober;
78 } 82 }
79 83
80 public void startFunction(Token nameToken) { 84 public void startFunction(Token nameToken) {
81 assert functionName == null; 85 assert functionName == null;
82 assert parameterCount == 0; 86 assert parameterCount == 0;
177 } 181 }
178 182
179 public SLStatementNode createIf(Token t, SLExpressionNode conditionNode, SLStatementNode thenPartNode, SLStatementNode elsePartNode) { 183 public SLStatementNode createIf(Token t, SLExpressionNode conditionNode, SLStatementNode thenPartNode, SLStatementNode elsePartNode) {
180 final int start = t.charPos; 184 final int start = t.charPos;
181 final int end = elsePartNode == null ? thenPartNode.getSourceSection().getCharEndIndex() : elsePartNode.getSourceSection().getCharEndIndex(); 185 final int end = elsePartNode == null ? thenPartNode.getSourceSection().getCharEndIndex() : elsePartNode.getSourceSection().getCharEndIndex();
186
187 // if (prober != null) {
188 // SLStatementNode wrappedThenNode = prober.probeAsStatement(thenPartNode);
189 // // SLStatementNode wrappedElseNode = prober.probeAsStatement(elsePartNode);
190 // return new SLIfNode(source.createSection(t.val, start, end - start), conditionNode,
191 // wrappedThenNode, elsePartNode);
192 // }
193
182 return new SLIfNode(source.createSection(t.val, start, end - start), conditionNode, thenPartNode, elsePartNode); 194 return new SLIfNode(source.createSection(t.val, start, end - start), conditionNode, thenPartNode, elsePartNode);
183 } 195 }
184 196
185 public SLStatementNode createReturn(Token t, SLExpressionNode valueNode) { 197 public SLStatementNode createReturn(Token t, SLExpressionNode valueNode) {
186 final int start = t.charPos; 198 final int start = t.charPos;
225 public SLExpressionNode createCall(Token nameToken, List<SLExpressionNode> parameterNodes, Token finalToken) { 237 public SLExpressionNode createCall(Token nameToken, List<SLExpressionNode> parameterNodes, Token finalToken) {
226 final int startPos = nameToken.charPos; 238 final int startPos = nameToken.charPos;
227 final int endPos = finalToken.charPos + finalToken.val.length(); 239 final int endPos = finalToken.charPos + finalToken.val.length();
228 final SourceSection src = source.createSection(nameToken.val, startPos, endPos - startPos); 240 final SourceSection src = source.createSection(nameToken.val, startPos, endPos - startPos);
229 SLExpressionNode functionNode = createRead(nameToken); 241 SLExpressionNode functionNode = createRead(nameToken);
242 if (prober != null) {
243 SLExpressionNode wrappedNode = prober.probeAsCall(functionNode, nameToken.val);
244 return SLInvokeNode.create(src, wrappedNode, parameterNodes.toArray(new SLExpressionNode[parameterNodes.size()]));
245 }
230 return SLInvokeNode.create(src, functionNode, parameterNodes.toArray(new SLExpressionNode[parameterNodes.size()])); 246 return SLInvokeNode.create(src, functionNode, parameterNodes.toArray(new SLExpressionNode[parameterNodes.size()]));
231 } 247 }
232 248
233 public SLExpressionNode createAssignment(Token nameToken, SLExpressionNode valueNode) { 249 public SLExpressionNode createAssignment(Token nameToken, SLExpressionNode valueNode) {
234 FrameSlot frameSlot = frameDescriptor.findOrAddFrameSlot(nameToken.val); 250 FrameSlot frameSlot = frameDescriptor.findOrAddFrameSlot(nameToken.val);
235 lexicalScope.locals.put(nameToken.val, frameSlot); 251 lexicalScope.locals.put(nameToken.val, frameSlot);
236 final int start = nameToken.charPos; 252 final int start = nameToken.charPos;
237 final int length = valueNode.getSourceSection().getCharEndIndex() - start; 253 final int length = valueNode.getSourceSection().getCharEndIndex() - start;
254 if (prober != null) {
255 final SLExpressionNode wrappedNode = prober.probeAsLocalAssignment(valueNode, nameToken.val);
256 return SLWriteLocalVariableNodeFactory.create(source.createSection("=", start, length), wrappedNode, frameSlot);
257 }
238 return SLWriteLocalVariableNodeFactory.create(source.createSection("=", start, length), valueNode, frameSlot); 258 return SLWriteLocalVariableNodeFactory.create(source.createSection("=", start, length), valueNode, frameSlot);
239 } 259 }
240 260
241 public SLExpressionNode createRead(Token nameToken) { 261 public SLExpressionNode createRead(Token nameToken) {
242 final FrameSlot frameSlot = lexicalScope.locals.get(nameToken.val); 262 final FrameSlot frameSlot = lexicalScope.locals.get(nameToken.val);