# HG changeset patch # User Michael Van De Vanter # Date 1407204176 25200 # Node ID 6fdfe46660a11eae30f20abe3659996880809557 # Parent 7c8ddb4233cdd210256bb247c0787739159c01ae# Parent 4d0d1dc5db0039a0c7a0a1f127819b222b49a3a1 Merge with 4d0d1dc5db0039a0c7a0a1f127819b222b49a3a1 diff -r 4d0d1dc5db00 -r 6fdfe46660a1 graal/com.oracle.truffle.sl.test/src/com/oracle/truffle/sl/test/SLTestRunner.java --- a/graal/com.oracle.truffle.sl.test/src/com/oracle/truffle/sl/test/SLTestRunner.java Mon Aug 04 23:25:14 2014 +0200 +++ b/graal/com.oracle.truffle.sl.test/src/com/oracle/truffle/sl/test/SLTestRunner.java Mon Aug 04 19:02:56 2014 -0700 @@ -43,7 +43,7 @@ public final class SLTestRunner extends ParentRunner { - private static final int REPEATS = 1; + private static final int REPEATS = 10; private static final String SOURCE_SUFFIX = ".sl"; private static final String INPUT_SUFFIX = ".input"; @@ -156,7 +156,7 @@ try { SLContext context = new SLContext(new BufferedReader(new StringReader(repeat(testCase.testInput, REPEATS))), printer); final Source source = Source.fromText(readAllLines(testCase.path), testCase.sourceName); - SLMain.run(context, source, System.out, REPEATS); + SLMain.run(context, source, null, REPEATS); String actualOutput = new String(out.toByteArray()); Assert.assertEquals(repeat(testCase.expectedOutput, REPEATS), actualOutput); diff -r 4d0d1dc5db00 -r 6fdfe46660a1 graal/com.oracle.truffle.sl.test/tests/error/TypeError02.output --- a/graal/com.oracle.truffle.sl.test/tests/error/TypeError02.output Mon Aug 04 23:25:14 2014 +0200 +++ b/graal/com.oracle.truffle.sl.test/tests/error/TypeError02.output Mon Aug 04 19:02:56 2014 -0700 @@ -1,1 +1,1 @@ -Type error at TypeError02.sl line 2 col 6: operation "if" not defined for String "4" +Type error at TypeError02.sl line 2 col 3: operation "if" not defined for String "4" diff -r 4d0d1dc5db00 -r 6fdfe46660a1 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/SLMain.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/SLMain.java Mon Aug 04 23:25:14 2014 +0200 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/SLMain.java Mon Aug 04 19:02:56 2014 -0700 @@ -153,9 +153,6 @@ sourceCallback.startLoading(source); } Parser.parseSL(context, source, null); - System.out.println(source.getName() + "========================"); - System.out.println(source.getCode()); - System.out.println(source.getName() + "========================"); if (sourceCallback != null) { sourceCallback.endLoading(source); } @@ -168,7 +165,7 @@ /* Change to true if you want to see the AST on the console. */ boolean printASTToLog = false; /* Change to true if you want to see source attribution for the AST to the console */ - boolean printSourceAttributionToLog = true; + boolean printSourceAttributionToLog = false; /* Change to dump the AST to IGV over the network. */ boolean dumpASTToIGV = false; diff -r 4d0d1dc5db00 -r 6fdfe46660a1 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 Mon Aug 04 23:25:14 2014 +0200 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLFunctionBodyNode.java Mon Aug 04 19:02:56 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 4d0d1dc5db00 -r 6fdfe46660a1 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 Mon Aug 04 23:25:14 2014 +0200 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java Mon Aug 04 19:02:56 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 4d0d1dc5db00 -r 6fdfe46660a1 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 Mon Aug 04 23:25:14 2014 +0200 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SLNodeFactory.java Mon Aug 04 19:02:56 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); - SLRootNode rootNode = new SLRootNode(frameDescriptor, functionBodyNode, functionName); + final SLFunctionBodyNode functionBodyNode = new SLFunctionBodyNode(functionSrc, methodBlock); + final 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,34 +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); - return new SLBlockNode(src, flattenedNodes.toArray(new SLStatementNode[flattenedNodes.size()])); - } - if (flattenedNodes.size() == 0) { - // TODO (mlvdv) for error reporting, should have the character position, even if the - // block is empty. - return new SLBlockNode(null, new SLStatementNode[0]); - } - if (flattenedNodes.size() == 1) { - /* - * A block containing one other node, not surrounded by braces is unnecessary, we can - * just that other node. - */ - return flattenedNodes.get(0); - } - /* - * A "block" not surrounded by braces. - */ - final int start = flattenedNodes.get(0).getSourceSection().getCharIndex(); - final int end = flattenedNodes.get(flattenedNodes.size() - 1).getSourceSection().getCharEndIndex(); - return new SLBlockNode(source.createSection("block", start, end - start), flattenedNodes.toArray(new SLStatementNode[flattenedNodes.size()])); + final SourceSection src = source.createSection("block", startPos, length); + return new SLBlockNode(src, flattenedNodes.toArray(new SLStatementNode[flattenedNodes.size()])); } private void flattenBlocks(Iterable bodyNodes, List flattenedNodes) { diff -r 4d0d1dc5db00 -r 6fdfe46660a1 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 Mon Aug 04 23:25:14 2014 +0200 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SimpleLanguage.atg Mon Aug 04 19:02:56 2014 -0700 @@ -65,9 +65,10 @@ Function = -"function" -identifier (. factory.startFunction(t); .) -"(" +"function" +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; .)