# HG changeset patch # User Michael Van De Vanter # Date 1405381901 25200 # Node ID abe7128ca47319ce5f57b8859bd037e87556a085 # Parent aee02665e505c1adfd9e9174b77fc13c2ba14d92 SL: upgrade source attribution diff -r aee02665e505 -r abe7128ca473 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 Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/SLMain.java Mon Jul 14 16:51:41 2014 -0700 @@ -143,6 +143,7 @@ public static void run(SLContext context, Source source, PrintStream logOutput, int repeats) { if (logOutput != null) { logOutput.println("== running on " + Truffle.getRuntime().getName()); + // logOutput.println("Source = " + source.getCode()); } final SourceCallback sourceCallback = context.getSourceCallback(); @@ -163,10 +164,12 @@ /* 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 = false; /* Change to dump the AST to IGV over the network. */ boolean dumpASTToIGV = false; - printScript("before execution", context, logOutput, printASTToLog, dumpASTToIGV); + printScript("before execution", context, logOutput, printASTToLog, printSourceAttributionToLog, dumpASTToIGV); try { for (int i = 0; i < repeats; i++) { long start = System.nanoTime(); @@ -187,7 +190,7 @@ } } finally { - printScript("after execution", context, logOutput, printASTToLog, dumpASTToIGV); + printScript("after execution", context, logOutput, printASTToLog, printSourceAttributionToLog, dumpASTToIGV); } } @@ -197,7 +200,7 @@ *

* When printASTToLog is true: prints the ASTs to the console. */ - private static void printScript(String groupName, SLContext context, PrintStream logOutput, boolean printASTToLog, boolean dumpASTToIGV) { + private static void printScript(String groupName, SLContext context, PrintStream logOutput, boolean printASTToLog, boolean printSourceAttributionToLog, boolean dumpASTToIGV) { if (dumpASTToIGV) { GraphPrintVisitor graphPrinter = new GraphPrintVisitor(); graphPrinter.beginGroup(groupName); @@ -218,6 +221,15 @@ } } } + if (printSourceAttributionToLog && logOutput != null) { + for (SLFunction function : context.getFunctionRegistry().getFunctions()) { + RootCallTarget callTarget = function.getCallTarget(); + if (callTarget != null) { + logOutput.println("=== " + function); + NodeUtil.printSourceAttributionTree(logOutput, callTarget.getRootNode()); + } + } + } } /** @@ -233,7 +245,11 @@ result.append("Type error"); if (ex.getNode() != null && ex.getNode().getSourceSection() != null) { SourceSection ss = ex.getNode().getSourceSection(); - result.append(" at ").append(ss.getSource().getName()).append(" line ").append(ss.getStartLine()).append(" col ").append(ss.getStartColumn()); + if (ss == null || ss instanceof NullSourceSection) { + result.append(" at "); + } else { + result.append(" at ").append(ss.getSource().getName()).append(" line ").append(ss.getStartLine()).append(" col ").append(ss.getStartColumn()); + } } result.append(": operation"); if (ex.getNode() != null && ex.getNode().getClass().getAnnotation(NodeInfo.class) != null) { diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLBuiltinNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLBuiltinNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLBuiltinNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -23,6 +23,7 @@ package com.oracle.truffle.sl.builtins; import com.oracle.truffle.api.dsl.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.*; import com.oracle.truffle.sl.runtime.*; @@ -42,6 +43,10 @@ @NodeField(name = "context", type = SLContext.class) public abstract class SLBuiltinNode extends SLExpressionNode { + public SLBuiltinNode(SourceSection src) { + super(src); + } + /** * Accessor for the {@link SLContext}. The implementation of this method is generated * automatically based on the {@link NodeField} annotation on the class. diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLDefineFunctionBuiltin.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLDefineFunctionBuiltin.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLDefineFunctionBuiltin.java Mon Jul 14 16:51:41 2014 -0700 @@ -36,6 +36,10 @@ @NodeInfo(shortName = "defineFunction") public abstract class SLDefineFunctionBuiltin extends SLBuiltinNode { + public SLDefineFunctionBuiltin() { + super(new NullSourceSection("SL builtin", "defineFunction")); + } + @Specialization public String defineFunction(String code) { doDefineFunction(getContext(), code); diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLHelloEqualsWorldBuiltin.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLHelloEqualsWorldBuiltin.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLHelloEqualsWorldBuiltin.java Mon Jul 14 16:51:41 2014 -0700 @@ -27,6 +27,7 @@ import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.frame.FrameInstance.FrameAccess; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; /** * This builtin sets the variable named "hello" in the caller frame to the string "world". @@ -34,6 +35,10 @@ @NodeInfo(shortName = "helloEqualsWorld") public abstract class SLHelloEqualsWorldBuiltin extends SLBuiltinNode { + public SLHelloEqualsWorldBuiltin() { + super(new NullSourceSection("SL builtin", "helloEqualsWorld")); + } + @Specialization public String change() { FrameInstance frameInstance = Truffle.getRuntime().getStackTrace().iterator().next(); diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLNanoTimeBuiltin.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLNanoTimeBuiltin.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLNanoTimeBuiltin.java Mon Jul 14 16:51:41 2014 -0700 @@ -24,6 +24,7 @@ import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; /** * Builtin function that returns the value of a high-resolution time, in nanoseconds. @@ -31,6 +32,10 @@ @NodeInfo(shortName = "nanoTime") public abstract class SLNanoTimeBuiltin extends SLBuiltinNode { + public SLNanoTimeBuiltin() { + super(new NullSourceSection("SL builtin", "nanoTime")); + } + @Specialization public long nanoTime() { return System.nanoTime(); diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLPrintlnBuiltin.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLPrintlnBuiltin.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLPrintlnBuiltin.java Mon Jul 14 16:51:41 2014 -0700 @@ -27,6 +27,7 @@ import com.oracle.truffle.api.CompilerDirectives.SlowPath; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.runtime.*; /** @@ -41,6 +42,10 @@ @NodeInfo(shortName = "println") public abstract class SLPrintlnBuiltin extends SLBuiltinNode { + public SLPrintlnBuiltin() { + super(new NullSourceSection("SL builtin", "println")); + } + @Specialization public long println(long value) { doPrint(getContext().getOutput(), value); diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLReadlnBuiltin.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLReadlnBuiltin.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLReadlnBuiltin.java Mon Jul 14 16:51:41 2014 -0700 @@ -27,6 +27,7 @@ import com.oracle.truffle.api.CompilerDirectives.SlowPath; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.*; import com.oracle.truffle.sl.runtime.*; @@ -36,6 +37,10 @@ @NodeInfo(shortName = "readln") public abstract class SLReadlnBuiltin extends SLBuiltinNode { + public SLReadlnBuiltin() { + super(new NullSourceSection("SL builtin", "readln")); + } + @Specialization public String readln() { String result = doRead(getContext().getInput()); diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLStackTraceBuiltin.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLStackTraceBuiltin.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLStackTraceBuiltin.java Mon Jul 14 16:51:41 2014 -0700 @@ -28,6 +28,7 @@ import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.frame.FrameInstance.FrameAccess; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; /** * Returns a string representation of the current stack. This includes the {@link CallTarget}s and @@ -37,6 +38,10 @@ @NodeInfo(shortName = "stacktrace") public abstract class SLStackTraceBuiltin extends SLBuiltinNode { + public SLStackTraceBuiltin() { + super(new NullSourceSection("SL builtin", "stacktrace")); + } + @Specialization public String trace() { return createStackTrace(); diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/SLBinaryNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/SLBinaryNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/SLBinaryNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -23,6 +23,7 @@ package com.oracle.truffle.sl.nodes; import com.oracle.truffle.api.dsl.*; +import com.oracle.truffle.api.source.*; /** * Utility base class for operations that take two arguments (per convention called "left" and @@ -31,4 +32,8 @@ */ @NodeChildren({@NodeChild("leftNode"), @NodeChild("rightNode")}) public abstract class SLBinaryNode extends SLExpressionNode { + + public SLBinaryNode(SourceSection src) { + super(src); + } } diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/SLExpressionNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/SLExpressionNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/SLExpressionNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -27,6 +27,7 @@ import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.runtime.*; /** @@ -38,6 +39,10 @@ @NodeInfo(description = "The abstract base node for all expressions") public abstract class SLExpressionNode extends SLStatementNode { + public SLExpressionNode(SourceSection src) { + super(src); + } + /** * The execute method when no specialization is possible. This is the most general case, * therefore it must be provided by all subclasses. diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/SLStatementNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/SLStatementNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/SLStatementNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -24,6 +24,7 @@ import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; /** * The base class of all Truffle nodes for SL. All nodes (even expressions) can be used as @@ -33,6 +34,10 @@ @NodeInfo(language = "Simple Language", description = "The abstract base node for all statements") public abstract class SLStatementNode extends Node { + public SLStatementNode(SourceSection src) { + super(src); + } + /** * Execute this node as as statement, where no return value is necessary. */ diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/call/SLInvokeNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/call/SLInvokeNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/call/SLInvokeNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -26,6 +26,7 @@ import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.*; import com.oracle.truffle.sl.runtime.*; @@ -39,15 +40,16 @@ @NodeInfo(shortName = "invoke") public final class SLInvokeNode extends SLExpressionNode { - public static SLInvokeNode create(SLExpressionNode function, SLExpressionNode[] arguments) { - return new SLInvokeNode(function, arguments, new SLUninitializedDispatchNode()); + public static SLInvokeNode create(SourceSection src, SLExpressionNode function, SLExpressionNode[] arguments) { + return new SLInvokeNode(src, function, arguments, new SLUninitializedDispatchNode()); } @Child protected SLExpressionNode functionNode; @Children protected final SLExpressionNode[] argumentNodes; @Child protected SLAbstractDispatchNode dispatchNode; - private SLInvokeNode(SLExpressionNode functionNode, SLExpressionNode[] argumentNodes, SLAbstractDispatchNode dispatchNode) { + private SLInvokeNode(SourceSection src, SLExpressionNode functionNode, SLExpressionNode[] argumentNodes, SLAbstractDispatchNode dispatchNode) { + super(src); this.functionNode = functionNode; this.argumentNodes = argumentNodes; this.dispatchNode = dispatchNode; diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLBlockNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLBlockNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLBlockNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -25,6 +25,7 @@ import com.oracle.truffle.api.*; import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.*; /** @@ -40,7 +41,8 @@ */ @Children private final SLStatementNode[] bodyNodes; - public SLBlockNode(SLStatementNode[] bodyNodes) { + public SLBlockNode(SourceSection src, SLStatementNode[] bodyNodes) { + super(src); this.bodyNodes = bodyNodes; } diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLBreakNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLBreakNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLBreakNode.java Mon Jul 14 16:51:41 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.sl.nodes.*; /** @@ -35,6 +36,10 @@ @NodeInfo(shortName = "break", description = "The node implementing a break statement") public final class SLBreakNode extends SLStatementNode { + public SLBreakNode(SourceSection src) { + super(src); + } + @Override public void executeVoid(VirtualFrame frame) { throw SLBreakException.SINGLETON; diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLContinueNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLContinueNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLContinueNode.java Mon Jul 14 16:51:41 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.sl.nodes.*; /** @@ -35,6 +36,10 @@ @NodeInfo(shortName = "continue", description = "The node implementing a continue statement") public final class SLContinueNode extends SLStatementNode { + public SLContinueNode(SourceSection src) { + super(src); + } + @Override public void executeVoid(VirtualFrame frame) { throw SLContinueException.SINGLETON; diff -r aee02665e505 -r abe7128ca473 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 Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLFunctionBodyNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -29,7 +29,7 @@ import com.oracle.truffle.sl.runtime.*; /** - * The body of a user-defined SL function. This is the node references by a {@link SLRootNode} for + * The body of a user-defined SL function. This is the node referenced by a {@link SLRootNode} for * user-defined functions. It handles the return value of a function: the {@link SLReturnNode return * statement} throws an {@link SLReturnException exception} with the return value. This node catches * the exception. If the method ends without an explicit {@code return}, return the @@ -50,6 +50,7 @@ private final BranchProfile nullTaken = new BranchProfile(); public SLFunctionBodyNode(SLStatementNode bodyNode) { + super(null); this.bodyNode = bodyNode; } diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLIfNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLIfNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLIfNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -25,6 +25,7 @@ import com.oracle.truffle.api.dsl.*; 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.*; @@ -52,7 +53,8 @@ private final BranchProfile thenTaken = new BranchProfile(); private final BranchProfile elseTaken = new BranchProfile(); - public SLIfNode(SLExpressionNode conditionNode, SLStatementNode thenPartNode, SLStatementNode elsePartNode) { + public SLIfNode(SourceSection src, SLExpressionNode conditionNode, SLStatementNode thenPartNode, SLStatementNode elsePartNode) { + super(src); this.conditionNode = conditionNode; this.thenPartNode = thenPartNode; this.elsePartNode = elsePartNode; diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLReturnNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLReturnNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLReturnNode.java Mon Jul 14 16:51:41 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.sl.nodes.*; import com.oracle.truffle.sl.runtime.*; @@ -39,7 +40,8 @@ @Child private SLExpressionNode valueNode; - public SLReturnNode(SLExpressionNode valueNode) { + public SLReturnNode(SourceSection src, SLExpressionNode valueNode) { + super(src); this.valueNode = valueNode; } diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLWhileNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLWhileNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLWhileNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -26,6 +26,7 @@ import com.oracle.truffle.api.dsl.*; 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.*; @@ -50,7 +51,8 @@ private final BranchProfile continueTaken = new BranchProfile(); private final BranchProfile breakTaken = new BranchProfile(); - public SLWhileNode(SLExpressionNode conditionNode, SLStatementNode bodyNode) { + public SLWhileNode(SourceSection src, SLExpressionNode conditionNode, SLStatementNode bodyNode) { + super(src); this.conditionNode = conditionNode; this.bodyNode = bodyNode; } diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLAddNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLAddNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLAddNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -27,6 +27,7 @@ import com.oracle.truffle.api.*; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.*; /** @@ -42,6 +43,10 @@ @NodeInfo(shortName = "+") public abstract class SLAddNode extends SLBinaryNode { + public SLAddNode(SourceSection src) { + super(src); + } + /** * Specialization for primitive {@code long} values. This is the fast path of the * arbitrary-precision arithmetic. We need to check for overflows of the addition, and switch to diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLBigIntegerLiteralNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLBigIntegerLiteralNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLBigIntegerLiteralNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -26,6 +26,7 @@ import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.*; /** @@ -37,7 +38,8 @@ private final BigInteger value; - public SLBigIntegerLiteralNode(BigInteger value) { + public SLBigIntegerLiteralNode(SourceSection src, BigInteger value) { + super(src); this.value = value; } diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLDivNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLDivNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLDivNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -26,6 +26,7 @@ import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.*; /** @@ -36,6 +37,10 @@ @NodeInfo(shortName = "/") public abstract class SLDivNode extends SLBinaryNode { + public SLDivNode(SourceSection src) { + super(src); + } + @Specialization protected long div(long left, long right) { /* No overflow is possible on a division. */ diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLEqualNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLEqualNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLEqualNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -26,6 +26,7 @@ import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.*; import com.oracle.truffle.sl.runtime.*; @@ -42,6 +43,10 @@ @NodeInfo(shortName = "==") public abstract class SLEqualNode extends SLBinaryNode { + public SLEqualNode(SourceSection src) { + super(src); + } + @Specialization protected boolean equal(long left, long right) { return left == right; diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLFunctionLiteralNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLFunctionLiteralNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLFunctionLiteralNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -25,6 +25,7 @@ import com.oracle.truffle.api.*; import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.*; import com.oracle.truffle.sl.runtime.*; @@ -39,7 +40,8 @@ private final SLFunction value; - public SLFunctionLiteralNode(SLFunction value) { + public SLFunctionLiteralNode(SourceSection src, SLFunction value) { + super(src); this.value = value; } diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLessOrEqualNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLessOrEqualNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLessOrEqualNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -26,6 +26,7 @@ import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.*; /** @@ -34,6 +35,10 @@ @NodeInfo(shortName = "<=") public abstract class SLLessOrEqualNode extends SLBinaryNode { + public SLLessOrEqualNode(SourceSection src) { + super(src); + } + @Specialization protected boolean lessOrEqual(long left, long right) { return left <= right; diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLessThanNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLessThanNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLessThanNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -26,6 +26,7 @@ import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.*; /** @@ -35,6 +36,10 @@ @NodeInfo(shortName = "<") public abstract class SLLessThanNode extends SLBinaryNode { + public SLLessThanNode(SourceSection src) { + super(src); + } + @Specialization protected boolean lessThan(long left, long right) { return left < right; diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLogicalAndNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLogicalAndNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLogicalAndNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -24,6 +24,7 @@ import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.*; /** @@ -39,6 +40,10 @@ @SuppressWarnings("unused") public abstract class SLLogicalAndNode extends SLBinaryNode { + public SLLogicalAndNode(SourceSection src) { + super(src); + } + /** * This method is called after the left child was evaluated, but before the right child is * evaluated. The right child is only evaluated when the return value is {code true}. diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLogicalNotNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLogicalNotNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLogicalNotNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -24,6 +24,7 @@ import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.*; /** @@ -34,6 +35,10 @@ @NodeInfo(shortName = "!") public abstract class SLLogicalNotNode extends SLExpressionNode { + public SLLogicalNotNode(SourceSection src) { + super(src); + } + @Specialization protected boolean doBoolean(boolean value) { return !value; diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLogicalOrNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLogicalOrNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLogicalOrNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -24,6 +24,7 @@ import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.*; /** @@ -33,6 +34,10 @@ @SuppressWarnings("unused") public abstract class SLLogicalOrNode extends SLBinaryNode { + public SLLogicalOrNode(SourceSection src) { + super(src); + } + @ShortCircuit("rightNode") protected boolean needsRightNode(boolean left) { return !left; diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLongLiteralNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLongLiteralNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLongLiteralNode.java Mon Jul 14 16:51:41 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.sl.nodes.*; /** @@ -36,7 +37,8 @@ private final long value; - public SLLongLiteralNode(long value) { + public SLLongLiteralNode(SourceSection src, long value) { + super(src); this.value = value; } diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLMulNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLMulNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLMulNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -28,6 +28,7 @@ import com.oracle.truffle.api.CompilerDirectives.*; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.*; /** @@ -36,6 +37,10 @@ @NodeInfo(shortName = "*") public abstract class SLMulNode extends SLBinaryNode { + public SLMulNode(SourceSection src) { + super(src); + } + @Specialization(rewriteOn = ArithmeticException.class) protected long mul(long left, long right) { return ExactMath.multiplyExact(left, right); diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLStringLiteralNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLStringLiteralNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLStringLiteralNode.java Mon Jul 14 16:51:41 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.sl.nodes.*; /** @@ -34,7 +35,8 @@ private final String value; - public SLStringLiteralNode(String value) { + public SLStringLiteralNode(SourceSection src, String value) { + super(src); this.value = value; } diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLSubNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLSubNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLSubNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -27,6 +27,7 @@ import com.oracle.truffle.api.*; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.*; /** @@ -35,6 +36,10 @@ @NodeInfo(shortName = "-") public abstract class SLSubNode extends SLBinaryNode { + public SLSubNode(SourceSection src) { + super(src); + } + @Specialization(rewriteOn = ArithmeticException.class) protected long sub(long left, long right) { return ExactMath.subtractExact(left, right); diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/demo/SLAddWithoutSpecializationNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/demo/SLAddWithoutSpecializationNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/demo/SLAddWithoutSpecializationNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -42,6 +42,7 @@ @Child private SLExpressionNode rightNode; public SLAddWithoutSpecializationNode(SLExpressionNode leftNode, SLExpressionNode rightNode) { + super(null); this.leftNode = leftNode; this.rightNode = rightNode; } diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/local/SLReadArgumentNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/local/SLReadArgumentNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/local/SLReadArgumentNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -23,6 +23,7 @@ package com.oracle.truffle.sl.nodes.local; import com.oracle.truffle.api.frame.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.api.utilities.*; import com.oracle.truffle.sl.nodes.*; import com.oracle.truffle.sl.parser.*; @@ -46,7 +47,8 @@ */ private final BranchProfile outOfBoundsTaken = new BranchProfile(); - public SLReadArgumentNode(int index) { + public SLReadArgumentNode(SourceSection src, int index) { + super(src); this.index = index; } diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/local/SLReadLocalVariableNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/local/SLReadLocalVariableNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/local/SLReadLocalVariableNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -24,6 +24,7 @@ import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.frame.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.*; /** @@ -36,6 +37,10 @@ @NodeField(name = "slot", type = FrameSlot.class) public abstract class SLReadLocalVariableNode extends SLExpressionNode { + public SLReadLocalVariableNode(SourceSection src) { + super(src); + } + /** * Returns the descriptor of the accessed local variable. The implementation of this method is * created by the Truffle DSL based on the {@link NodeField} annotation on the class. diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/local/SLWriteLocalVariableNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/local/SLWriteLocalVariableNode.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/local/SLWriteLocalVariableNode.java Mon Jul 14 16:51:41 2014 -0700 @@ -25,6 +25,7 @@ import com.oracle.truffle.api.*; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.frame.*; +import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.*; /** @@ -35,6 +36,10 @@ @NodeField(name = "slot", type = FrameSlot.class) public abstract class SLWriteLocalVariableNode extends SLExpressionNode { + public SLWriteLocalVariableNode(SourceSection src) { + super(src); + } + /** * Returns the descriptor of the accessed local variable. The implementation of this method is * created by the Truffle DSL based on the {@link NodeField} annotation on the class. diff -r aee02665e505 -r abe7128ca473 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 Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java Mon Jul 14 16:51:41 2014 -0700 @@ -52,7 +52,7 @@ public final Scanner scanner; public final Errors errors; private final SLNodeFactory factory; - + public Parser(SLContext context, Source source) { this.scanner = new Scanner(source.getInputStream()); this.factory = new SLNodeFactory(context, source); @@ -133,39 +133,41 @@ void Function() { Expect(4); Expect(1); - factory.startFunction(t); + factory.startFunction(t); Expect(5); if (la.kind == 1) { Get(); - factory.addFormalParameter(t); + factory.addFormalParameter(t); while (la.kind == 6) { Get(); Expect(1); - factory.addFormalParameter(t); + factory.addFormalParameter(t); } } Expect(7); SLStatementNode body = Block(false); - factory.finishFunction(body); + factory.finishFunction(body); } SLStatementNode Block(boolean inLoop) { SLStatementNode result; factory.startBlock(); - List body = new ArrayList<>(); + List body = new ArrayList<>(); Expect(8); + int lBracePos = t.charPos; while (StartOf(1)) { SLStatementNode s = Statement(inLoop); - body.add(s); + body.add(s); } Expect(9); - result = factory.finishBlock(body); + int length = (t.charPos + t.val.length()) - lBracePos; + result = factory.finishBlock(body, lBracePos, length); return result; } SLStatementNode Statement(boolean inLoop) { SLStatementNode result; - result = null; + result = null; switch (la.kind) { case 13: { result = WhileStatement(); @@ -173,13 +175,13 @@ } case 10: { Get(); - if (inLoop) { result = factory.createBreak(t); } else { SemErr("break used outside of loop"); } + if (inLoop) { result = factory.createBreak(t); } else { SemErr("break used outside of loop"); } Expect(11); break; } case 12: { Get(); - if (inLoop) { result = factory.createContinue(t); } else { SemErr("continue used outside of loop"); } + if (inLoop) { result = factory.createContinue(t); } else { SemErr("continue used outside of loop"); } Expect(11); break; } @@ -205,11 +207,11 @@ SLStatementNode result; Expect(13); Expect(5); - Token whileToken = t; + Token whileToken = t; SLExpressionNode condition = Expression(); Expect(7); SLStatementNode body = Block(true); - result = factory.createWhile(whileToken, condition, body); + result = factory.createWhile(whileToken, condition, body); return result; } @@ -217,16 +219,16 @@ SLStatementNode result; Expect(14); Expect(5); - Token ifToken = t; + Token ifToken = t; SLExpressionNode condition = Expression(); Expect(7); SLStatementNode thenPart = Block(inLoop); - SLStatementNode elsePart = null; + SLStatementNode elsePart = null; if (la.kind == 15) { Get(); elsePart = Block(inLoop); } - result = factory.createIf(ifToken, condition, thenPart, elsePart); + result = factory.createIf(ifToken, condition, thenPart, elsePart); return result; } @@ -234,11 +236,11 @@ SLStatementNode result; Expect(16); Token returnToken = t; - SLExpressionNode value = null; + SLExpressionNode value = null; if (StartOf(2)) { value = Expression(); } - result = factory.createReturn(returnToken, value); + result = factory.createReturn(returnToken, value); Expect(11); return result; } @@ -248,9 +250,9 @@ result = LogicTerm(); while (la.kind == 17) { Get(); - Token op = t; + Token op = t; SLExpressionNode right = LogicTerm(); - result = factory.createBinary(op, result, right); + result = factory.createBinary(op, result, right); } return result; } @@ -260,9 +262,9 @@ result = LogicFactor(); while (la.kind == 18) { Get(); - Token op = t; + Token op = t; SLExpressionNode right = LogicFactor(); - result = factory.createBinary(op, result, right); + result = factory.createBinary(op, result, right); } return result; } @@ -297,9 +299,9 @@ break; } } - Token op = t; + Token op = t; SLExpressionNode right = Arithmetic(); - result = factory.createBinary(op, result, right); + result = factory.createBinary(op, result, right); } return result; } @@ -313,9 +315,9 @@ } else { Get(); } - Token op = t; + Token op = t; SLExpressionNode right = Term(); - result = factory.createBinary(op, result, right); + result = factory.createBinary(op, result, right); } return result; } @@ -329,47 +331,48 @@ } else { Get(); } - Token op = t; + Token op = t; SLExpressionNode right = Factor(); - result = factory.createBinary(op, result, right); + result = factory.createBinary(op, result, right); } return result; } SLExpressionNode Factor() { SLExpressionNode result; - result = null; + result = null; if (la.kind == 1) { Get(); - Token nameToken = t; + Token nameToken = t; if (la.kind == 5) { Get(); List parameters = new ArrayList<>(); - SLExpressionNode parameter; + SLExpressionNode parameter; if (StartOf(2)) { parameter = Expression(); - parameters.add(parameter); + parameters.add(parameter); while (la.kind == 6) { Get(); parameter = Expression(); - parameters.add(parameter); + parameters.add(parameter); } } - result = factory.createCall(nameToken, parameters); Expect(7); + Token finalToken = t; + result = factory.createCall(nameToken, parameters, finalToken); } else if (la.kind == 29) { Get(); SLExpressionNode value = Expression(); - result = factory.createAssignment(nameToken, value); + result = factory.createAssignment(nameToken, value); } else if (StartOf(4)) { - result = factory.createRead(nameToken); + result = factory.createRead(nameToken); } else SynErr(32); } else if (la.kind == 2) { Get(); - result = factory.createStringLiteral(t); + result = factory.createStringLiteral(t); } else if (la.kind == 3) { Get(); - result = factory.createNumericLiteral(t); + result = factory.createNumericLiteral(t); } else if (la.kind == 5) { Get(); result = Expression(); diff -r aee02665e505 -r abe7128ca473 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 Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SLNodeFactory.java Mon Jul 14 16:51:41 2014 -0700 @@ -95,14 +95,16 @@ * ensures that accesses to parameters are specialized the same way as local variables are * specialized. */ - SLReadArgumentNode readArg = assignSource(nameToken, new SLReadArgumentNode(parameterCount)); + final SourceSection src = source.createSection(nameToken.val, nameToken.charPos, nameToken.val.length()); + SLReadArgumentNode readArg = new SLReadArgumentNode(src, parameterCount); methodNodes.add(createAssignment(nameToken, readArg)); parameterCount++; } public void finishFunction(SLStatementNode bodyNode) { methodNodes.add(bodyNode); - SLStatementNode methodBlock = finishBlock(methodNodes); + // TODO (mlvdv) testing + SLStatementNode methodBlock = finishBlock(methodNodes, -1, -1); assert lexicalScope == null : "Wrong scoping of blocks in parser"; SLFunctionBodyNode functionBodyNode = new SLFunctionBodyNode(methodBlock); @@ -120,17 +122,34 @@ lexicalScope = new LexicalScope(lexicalScope); } - public SLStatementNode finishBlock(List bodyNodes) { + public SLStatementNode finishBlock(List bodyNodes, int lBracePos, 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 is unnecessary, we can just that other node. */ + /* + * A block containing one other node, not surrounded by braces is unnecessary, we can + * just that other node. + */ return flattenedNodes.get(0); - } else { - return new SLBlockNode(flattenedNodes.toArray(new SLStatementNode[flattenedNodes.size()])); } + /* + * 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()])); } private void flattenBlocks(Iterable bodyNodes, List flattenedNodes) { @@ -144,75 +163,90 @@ } public SLStatementNode createBreak(Token t) { - return assignSource(t, new SLBreakNode()); + return new SLBreakNode(source.createSection(t.val, t.charPos, t.val.length())); } public SLStatementNode createContinue(Token t) { - return assignSource(t, new SLContinueNode()); + return new SLContinueNode(source.createSection(t.val, t.charPos, t.val.length())); } public SLStatementNode createWhile(Token t, SLExpressionNode conditionNode, SLStatementNode bodyNode) { - return assignSource(t, new SLWhileNode(conditionNode, bodyNode)); + final int start = t.charPos; + final int end = bodyNode.getSourceSection().getCharEndIndex(); + return new SLWhileNode(source.createSection(t.val, start, end - start), conditionNode, bodyNode); } public SLStatementNode createIf(Token t, SLExpressionNode conditionNode, SLStatementNode thenPartNode, SLStatementNode elsePartNode) { - return assignSource(t, new SLIfNode(conditionNode, thenPartNode, elsePartNode)); + final int start = t.charPos; + final int end = elsePartNode == null ? thenPartNode.getSourceSection().getCharEndIndex() : elsePartNode.getSourceSection().getCharEndIndex(); + return new SLIfNode(source.createSection(t.val, start, end - start), conditionNode, thenPartNode, elsePartNode); } public SLStatementNode createReturn(Token t, SLExpressionNode valueNode) { - return assignSource(t, new SLReturnNode(valueNode)); + final int start = t.charPos; + final int length = valueNode == null ? t.val.length() : valueNode.getSourceSection().getCharEndIndex() - start; + return new SLReturnNode(source.createSection(t.val, start, length), valueNode); } public SLExpressionNode createBinary(Token opToken, SLExpressionNode leftNode, SLExpressionNode rightNode) { + int start = leftNode.getSourceSection().getCharIndex(); + int length = rightNode.getSourceSection().getCharEndIndex() - start; + final SourceSection src = source.createSection(opToken.val, start, length); switch (opToken.val) { case "+": - return assignSource(opToken, SLAddNodeFactory.create(leftNode, rightNode)); + return SLAddNodeFactory.create(src, leftNode, rightNode); case "*": - return assignSource(opToken, SLMulNodeFactory.create(leftNode, rightNode)); + return SLMulNodeFactory.create(src, leftNode, rightNode); case "/": - return assignSource(opToken, SLDivNodeFactory.create(leftNode, rightNode)); + return SLDivNodeFactory.create(src, leftNode, rightNode); case "-": - return assignSource(opToken, SLSubNodeFactory.create(leftNode, rightNode)); + return SLSubNodeFactory.create(src, leftNode, rightNode); case "<": - return assignSource(opToken, SLLessThanNodeFactory.create(leftNode, rightNode)); + return SLLessThanNodeFactory.create(src, leftNode, rightNode); case "<=": - return assignSource(opToken, SLLessOrEqualNodeFactory.create(leftNode, rightNode)); + return SLLessOrEqualNodeFactory.create(src, leftNode, rightNode); case ">": - return assignSource(opToken, SLLogicalNotNodeFactory.create(assignSource(opToken, SLLessOrEqualNodeFactory.create(leftNode, rightNode)))); + return SLLogicalNotNodeFactory.create(src, SLLessOrEqualNodeFactory.create(null, leftNode, rightNode)); case ">=": - return assignSource(opToken, SLLogicalNotNodeFactory.create(assignSource(opToken, SLLessThanNodeFactory.create(leftNode, rightNode)))); + return SLLogicalNotNodeFactory.create(src, SLLessThanNodeFactory.create(null, leftNode, rightNode)); case "==": - return assignSource(opToken, SLEqualNodeFactory.create(leftNode, rightNode)); + return SLEqualNodeFactory.create(src, leftNode, rightNode); case "!=": - return assignSource(opToken, SLLogicalNotNodeFactory.create(assignSource(opToken, SLEqualNodeFactory.create(leftNode, rightNode)))); + return SLLogicalNotNodeFactory.create(src, SLEqualNodeFactory.create(null, leftNode, rightNode)); case "&&": - return assignSource(opToken, SLLogicalAndNodeFactory.create(leftNode, rightNode)); + return SLLogicalAndNodeFactory.create(src, leftNode, rightNode); case "||": - return assignSource(opToken, SLLogicalOrNodeFactory.create(leftNode, rightNode)); + return SLLogicalOrNodeFactory.create(src, leftNode, rightNode); default: throw new RuntimeException("unexpected operation: " + opToken.val); } } - public SLExpressionNode createCall(Token nameToken, List parameterNodes) { + public SLExpressionNode createCall(Token nameToken, List parameterNodes, Token finalToken) { + final int startPos = nameToken.charPos; + final int endPos = finalToken.charPos + finalToken.val.length(); + final SourceSection src = source.createSection(nameToken.val, startPos, endPos - startPos); SLExpressionNode functionNode = createRead(nameToken); - return assignSource(nameToken, SLInvokeNode.create(functionNode, parameterNodes.toArray(new SLExpressionNode[parameterNodes.size()]))); + return SLInvokeNode.create(src, functionNode, parameterNodes.toArray(new SLExpressionNode[parameterNodes.size()])); } public SLExpressionNode createAssignment(Token nameToken, SLExpressionNode valueNode) { FrameSlot frameSlot = frameDescriptor.findOrAddFrameSlot(nameToken.val); lexicalScope.locals.put(nameToken.val, frameSlot); - return assignSource(nameToken, SLWriteLocalVariableNodeFactory.create(valueNode, frameSlot)); + final int start = nameToken.charPos; + final int length = valueNode.getSourceSection().getCharEndIndex() - start; + return SLWriteLocalVariableNodeFactory.create(source.createSection("=", start, length), valueNode, frameSlot); } public SLExpressionNode createRead(Token nameToken) { - FrameSlot frameSlot = lexicalScope.locals.get(nameToken.val); + final FrameSlot frameSlot = lexicalScope.locals.get(nameToken.val); + final SourceSection src = source.createSection(nameToken.val, nameToken.charPos, nameToken.val.length()); if (frameSlot != null) { /* Read of a local variable. */ - return assignSource(nameToken, SLReadLocalVariableNodeFactory.create(frameSlot)); + return SLReadLocalVariableNodeFactory.create(src, frameSlot); } else { /* Read of a global name. In our language, the only global names are functions. */ - return assignSource(nameToken, new SLFunctionLiteralNode(context.getFunctionRegistry().lookup(nameToken.val))); + return new SLFunctionLiteralNode(src, context.getFunctionRegistry().lookup(nameToken.val)); } } @@ -220,31 +254,21 @@ /* Remove the trailing and ending " */ String literal = literalToken.val; assert literal.length() >= 2 && literal.startsWith("\"") && literal.endsWith("\""); + final SourceSection src = source.createSection(literalToken.val, literalToken.charPos, literalToken.val.length()); literal = literal.substring(1, literal.length() - 1); - return assignSource(literalToken, new SLStringLiteralNode(literal)); + return new SLStringLiteralNode(src, literal); } public SLExpressionNode createNumericLiteral(Token literalToken) { + final SourceSection src = source.createSection(literalToken.val, literalToken.charPos, literalToken.val.length()); try { /* Try if the literal is small enough to fit into a long value. */ - return assignSource(literalToken, new SLLongLiteralNode(Long.parseLong(literalToken.val))); + return new SLLongLiteralNode(src, Long.parseLong(literalToken.val)); } catch (NumberFormatException ex) { /* Overflow of long value, so fall back to BigInteger. */ - return assignSource(literalToken, new SLBigIntegerLiteralNode(new BigInteger(literalToken.val))); + return new SLBigIntegerLiteralNode(src, new BigInteger(literalToken.val)); } } - private T assignSource(Token t, T node) { - assert functionName != null; - assert t != null; - - int startLine = t.line; - int startColumn = t.col; - int charLength = t.val.length(); - SourceSection sourceSection = source.createSection(functionName, startLine, startColumn, 0, charLength); - - node.assignSourceSection(sourceSection); - return node; - } } diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Scanner.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Scanner.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Scanner.java Mon Jul 14 16:51:41 2014 -0700 @@ -25,8 +25,11 @@ package com.oracle.truffle.sl.parser; -import java.io.*; -import java.util.*; +import java.io.InputStream; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.Map; +import java.util.HashMap; // Checkstyle: stop // @formatter:off diff -r aee02665e505 -r abe7128ca473 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 Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SimpleLanguage.atg Mon Jul 14 16:51:41 2014 -0700 @@ -84,11 +84,12 @@ Block = (. factory.startBlock(); List body = new ArrayList<>(); .) -"{" +"{" (. int lBracePos = t.charPos; .) { Statement (. body.add(s); .) } -"}" (. result = factory.finishBlock(body); .) +"}" (. int length = (t.charPos + t.val.length()) - lBracePos; .) + (. result = factory.finishBlock(body, lBracePos, length); .) . @@ -210,8 +211,9 @@ "," Expression (. parameters.add(parameter); .) } - ] (. result = factory.createCall(nameToken, parameters); .) - ")" + ] + ")" (. Token finalToken = t; .) + (. result = factory.createCall(nameToken, parameters, finalToken); .) | "=" Expression (. result = factory.createAssignment(nameToken, value); .) diff -r aee02665e505 -r abe7128ca473 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/runtime/SLContext.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/runtime/SLContext.java Mon Jul 14 16:04:09 2014 -0700 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/runtime/SLContext.java Mon Jul 14 16:51:41 2014 -0700 @@ -121,7 +121,7 @@ * from this array. */ for (int i = 0; i < argumentCount; i++) { - argumentNodes[i] = new SLReadArgumentNode(i); + argumentNodes[i] = new SLReadArgumentNode(null, i); } /* Instantiate the builtin node. This node performs the actual functionality. */ SLBuiltinNode builtinBodyNode = factory.createNode(argumentNodes, this);