Mercurial > hg > truffle
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); |