# HG changeset patch # User Michael Van De Vanter # Date 1406941848 25200 # Node ID d654cd5ed05a480afb38c591cd3640bdee765ca9 # Parent 0fc43b066eee9093ac2306839ca3ca0818a0dc99 SL/SourceAttribution: further corrections for attributing function bodies diff -r 0fc43b066eee -r d654cd5ed05a graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLFunctionBodyNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLFunctionBodyNode.java Fri Aug 01 16:30:22 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLFunctionBodyNode.java Fri Aug 01 18:10:48 2014 -0700 @@ -24,6 +24,7 @@ import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.api.utilities.*; import com.oracle.truffle.sl.nodes.*; import com.oracle.truffle.sl.runtime.*; @@ -49,8 +50,8 @@ private final BranchProfile exceptionTaken = new BranchProfile(); private final BranchProfile nullTaken = new BranchProfile(); - public SLFunctionBodyNode(SLStatementNode bodyNode) { - super(null); + public SLFunctionBodyNode(SourceSection src, SLStatementNode bodyNode) { + super(src); this.bodyNode = bodyNode; } diff -r 0fc43b066eee -r d654cd5ed05a graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java Fri Aug 01 16:30:22 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java Fri Aug 01 18:10:48 2014 -0700 @@ -134,8 +134,10 @@ void Function() { Expect(4); Expect(1); - factory.startFunction(t); + Token identifierToken = t; Expect(5); + int bodyStartPos = t.charPos; + factory.startFunction(identifierToken, bodyStartPos); if (la.kind == 1) { Get(); factory.addFormalParameter(t); @@ -219,8 +221,8 @@ SLStatementNode IfStatement(boolean inLoop) { SLStatementNode result; Expect(14); + Token ifToken = t; Expect(5); - Token ifToken = t; SLExpressionNode condition = Expression(); Expect(7); SLStatementNode thenPart = Block(inLoop); diff -r 0fc43b066eee -r d654cd5ed05a graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SLNodeFactory.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SLNodeFactory.java Fri Aug 01 16:30:22 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SLNodeFactory.java Fri Aug 01 18:10:48 2014 -0700 @@ -65,7 +65,9 @@ private final Source source; /* State while parsing a function. */ + private int functionStartPos; private String functionName; + private int functionBodyStartPos; // includes parameter list private int parameterCount; private FrameDescriptor frameDescriptor; private List methodNodes; @@ -81,13 +83,17 @@ this.prober = prober; } - public void startFunction(Token nameToken) { + public void startFunction(Token nameToken, int bodyStartPos) { + assert functionStartPos == 0; assert functionName == null; + assert functionBodyStartPos == 0; assert parameterCount == 0; assert frameDescriptor == null; assert lexicalScope == null; + functionStartPos = nameToken.charPos; functionName = nameToken.val; + functionBodyStartPos = bodyStartPos; frameDescriptor = new FrameDescriptor(); methodNodes = new ArrayList<>(); startBlock(); @@ -100,23 +106,26 @@ * specialized. */ final SourceSection src = srcFromToken(nameToken); - SLReadArgumentNode readArg = new SLReadArgumentNode(src, parameterCount); + final SLReadArgumentNode readArg = new SLReadArgumentNode(src, parameterCount); methodNodes.add(createAssignment(nameToken, readArg)); parameterCount++; } public void finishFunction(SLStatementNode bodyNode) { methodNodes.add(bodyNode); - // TODO (mlvdv) testing - SLStatementNode methodBlock = finishBlock(methodNodes, -1, -1); + final int bodyEndPos = bodyNode.getSourceSection().getCharEndIndex(); + final SourceSection functionSrc = source.createSection(functionName, functionStartPos, bodyEndPos - functionStartPos); + final SLStatementNode methodBlock = finishBlock(methodNodes, functionBodyStartPos, bodyEndPos - functionBodyStartPos); assert lexicalScope == null : "Wrong scoping of blocks in parser"; - SLFunctionBodyNode functionBodyNode = new SLFunctionBodyNode(methodBlock); + SLFunctionBodyNode functionBodyNode = new SLFunctionBodyNode(functionSrc, methodBlock); SLRootNode rootNode = new SLRootNode(frameDescriptor, functionBodyNode, functionName); context.getFunctionRegistry().register(functionName, rootNode); + functionStartPos = 0; functionName = null; + functionBodyStartPos = 0; parameterCount = 0; frameDescriptor = null; lexicalScope = null; @@ -126,14 +135,14 @@ lexicalScope = new LexicalScope(lexicalScope); } - public SLStatementNode finishBlock(List bodyNodes, int lBracePos, int length) { + public SLStatementNode finishBlock(List bodyNodes, int startPos, int length) { lexicalScope = lexicalScope.outer; List flattenedNodes = new ArrayList<>(bodyNodes.size()); flattenBlocks(bodyNodes, flattenedNodes); - if (lBracePos >= 0) { - final SourceSection src = source.createSection("block", lBracePos, length); + if (startPos >= 0) { + final SourceSection src = source.createSection("block", startPos, length); return new SLBlockNode(src, flattenedNodes.toArray(new SLStatementNode[flattenedNodes.size()])); } if (flattenedNodes.size() == 0) { diff -r 0fc43b066eee -r d654cd5ed05a graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SimpleLanguage.atg --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SimpleLanguage.atg Fri Aug 01 16:30:22 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SimpleLanguage.atg Fri Aug 01 18:10:48 2014 -0700 @@ -66,8 +66,9 @@ Function = "function" -identifier (. factory.startFunction(t); .) -"(" +identifier (. Token identifierToken = t; .) +"(" (. int bodyStartPos = t.charPos; .) + (. factory.startFunction(identifierToken, bodyStartPos); .) [ identifier (. factory.addFormalParameter(t); .) { @@ -125,8 +126,8 @@ IfStatement = -"if" -"(" (. Token ifToken = t; .) +"if" (. Token ifToken = t; .) +"(" Expression ")" Block (. SLStatementNode elsePart = null; .)