changeset 460:b48cfa14ba60

improve stack trace
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 06 May 2015 14:32:29 -0600
parents 30544d1a9cbf
children e12841f7edef
files core/src/luan/LuanBit.java core/src/luan/LuanElement.java core/src/luan/LuanSource.java core/src/luan/LuanState.java core/src/luan/impl/AddExpr.java core/src/luan/impl/AndExpr.java core/src/luan/impl/BinaryOpExpr.java core/src/luan/impl/Code.java core/src/luan/impl/CodeImpl.java core/src/luan/impl/ConcatExpr.java core/src/luan/impl/ConstExpr.java core/src/luan/impl/DivExpr.java core/src/luan/impl/EqExpr.java core/src/luan/impl/ExpList.java core/src/luan/impl/ExpressionsExpr.java core/src/luan/impl/FnCall.java core/src/luan/impl/FnDef.java core/src/luan/impl/ForStmt.java core/src/luan/impl/GetLocalVar.java core/src/luan/impl/GetUpVar.java core/src/luan/impl/IfStmt.java core/src/luan/impl/IndexExpr.java core/src/luan/impl/LeExpr.java core/src/luan/impl/LenExpr.java core/src/luan/impl/LtExpr.java core/src/luan/impl/LuanCompiler.java core/src/luan/impl/LuanParser.java core/src/luan/impl/LuanStateImpl.java core/src/luan/impl/ModExpr.java core/src/luan/impl/MulExpr.java core/src/luan/impl/NotExpr.java core/src/luan/impl/OrExpr.java core/src/luan/impl/PowExpr.java core/src/luan/impl/RepeatStmt.java core/src/luan/impl/ReturnStmt.java core/src/luan/impl/SetTableEntry.java core/src/luan/impl/SubExpr.java core/src/luan/impl/TableExpr.java core/src/luan/impl/UnaryOpExpr.java core/src/luan/impl/UnmExpr.java core/src/luan/impl/VarArgs.java core/src/luan/impl/WhileStmt.java
diffstat 42 files changed, 181 insertions(+), 206 deletions(-) [+]
line wrap: on
line diff
--- a/core/src/luan/LuanBit.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/LuanBit.java	Wed May 06 14:32:29 2015 -0600
@@ -19,10 +19,12 @@
 	public String stackTrace() {
 		StringBuilder buf = new StringBuilder();
 		LuanElement el = this.el;
+		if( el != null )
+			buf.append( "\n\t" ).append( el.toString(null) );
 		for( int i  = luan.stackTrace.size() - 1; i>=0; i-- ) {
 			StackTraceElement stackTraceElement = luan.stackTrace.get(i);
+			el = stackTraceElement.call;
 			buf.append( "\n\t" ).append( el.toString(stackTraceElement.fnName) );
-			el = stackTraceElement.call;
 		}
 		return buf.toString();
 	}
@@ -32,6 +34,8 @@
 	}
 
 	public Object call(LuanFunction fn,String fnName,Object[] args) throws LuanException {
+		if( el == null )
+			return fn.call(luan,args);
 		List<StackTraceElement> stackTrace = luan.stackTrace;
 		stackTrace.add( new StackTraceElement(el,fnName) );
 		try {
@@ -46,9 +50,8 @@
 	public String checkString(Object obj) throws LuanException {
 		if( obj instanceof String )
 			return (String)obj;
-		if( el instanceof LuanSource.Element ) {
-			LuanSource.Element se = (LuanSource.Element)el;
-			throw exception( "attempt to use '"+se.text()+"' (a " + Luan.type(obj) + " value) as a string" );
+		if( el != null ) {
+			throw exception( "attempt to use '"+el.text()+"' (a " + Luan.type(obj) + " value) as a string" );
 		} else {
 			throw exception( "attempt to use a " + Luan.type(obj) + " as a string" );
 		}
@@ -57,9 +60,8 @@
 	public Number checkNumber(Object obj) throws LuanException {
 		if( obj instanceof Number )
 			return (Number)obj;
-		if( el instanceof LuanSource.Element ) {
-			LuanSource.Element se = (LuanSource.Element)el;
-			throw exception( "attempt to perform arithmetic on '"+se.text()+"' (a " + Luan.type(obj) + " value)" );
+		if( el != null ) {
+			throw exception( "attempt to perform arithmetic on '"+el.text()+"' (a " + Luan.type(obj) + " value)" );
 		} else {
 			throw exception( "attempt to perform arithmetic on a " + Luan.type(obj) + " value" );
 		}
@@ -68,9 +70,8 @@
 	public LuanFunction checkFunction(Object obj) throws LuanException {
 		if( obj instanceof LuanFunction )
 			return (LuanFunction)obj;
-		if( el instanceof LuanSource.Element ) {
-			LuanSource.Element se = (LuanSource.Element)el;
-			throw exception( "attempt to call '"+se.text()+"' (a " + Luan.type(obj) + " value)" );
+		if( el != null ) {
+			throw exception( "attempt to call '"+el.text()+"' (a " + Luan.type(obj) + " value)" );
 		} else {
 			throw exception( "attempt to call a " + Luan.type(obj) + " value" );
 		}
@@ -79,9 +80,8 @@
 	public Boolean checkBoolean(Object obj) throws LuanException {
 		if( obj instanceof Boolean )
 			return (Boolean)obj;
-		if( el instanceof LuanSource.Element ) {
-			LuanSource.Element se = (LuanSource.Element)el;
-			throw exception( "attempt to use '"+se.text()+"' (a " + Luan.type(obj) + " value) as a boolean" );
+		if( el != null ) {
+			throw exception( "attempt to use '"+el.text()+"' (a " + Luan.type(obj) + " value) as a boolean" );
 		} else {
 			throw exception( "attempt to use a " + Luan.type(obj) + " as a boolean" );
 		}
--- a/core/src/luan/LuanElement.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/LuanElement.java	Wed May 06 14:32:29 2015 -0600
@@ -1,20 +1,51 @@
 package luan;
 
 
-public abstract class LuanElement {
+public final class LuanElement {
+	public final LuanSource source;
+	public final int start;
+	public final int end;
+	private final String text;
+
+	public LuanElement(LuanSource source,int start,int end) {
+		this(source,start,end,null);
+	}
 
-	final String toString(String fnName) {
+	public LuanElement(LuanSource source,int start,int end,String text) {
+		if( source==null )
+			throw new NullPointerException("source is null");
+		this.source = source;
+		this.start = start;
+		while( end > 0 && Character.isWhitespace(source.text.charAt(end-1)) ) {
+			end--;
+		}
+		this.end = end;
+		this.text = text;
+	}
+
+	public String text() {
+		return text!=null ? text : source.text.substring(start,end);
+	}
+
+	private String location() {
+		return source.name + " line " + lineNumber();
+	}
+
+	private int lineNumber() {
+		int line = 0;
+		int i = -1;
+		do {
+			line++;
+			i = source.text.indexOf('\n',i+1);
+		} while( i != -1 && i < start );
+		return line;
+	}
+
+	String toString(String fnName) {
 		String s = location();
 		if( fnName != null )
-			s += ": in function '" + fnName + "'";
+			s += " in call to '" + fnName + "'";
 		return s;
 	}
 
-	abstract String location();
-
-	public static final LuanElement JAVA = new LuanElement(){
-		@Override String location() {
-			return "Java";
-		}
-	};
 }
--- a/core/src/luan/LuanSource.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/LuanSource.java	Wed May 06 14:32:29 2015 -0600
@@ -9,60 +9,4 @@
 		this.name = name;
 		this.text = text;
 	}
-
-	public static final class CompilerElement extends LuanElement {
-		public final LuanSource source;
-
-		public CompilerElement(LuanSource source) {
-			if( source==null )
-				throw new NullPointerException("source is null");
-			this.source = source;
-		}
-
-		@Override String location() {
-			return "Compiling " + source.name;
-		}
-	}
-
-	public static final class Element extends LuanElement {
-		public final LuanSource source;
-		public final int start;
-		public final int end;
-		private final String text;
-
-		public Element(LuanSource source,int start,int end) {
-			this(source,start,end,null);
-		}
-
-		public Element(LuanSource source,int start,int end,String text) {
-			if( source==null )
-				throw new NullPointerException("source is null");
-			this.source = source;
-			this.start = start;
-			while( end > 0 && Character.isWhitespace(source.text.charAt(end-1)) ) {
-				end--;
-			}
-			this.end = end;
-			this.text = text;
-		}
-
-		public String text() {
-			return text!=null ? text : source.text.substring(start,end);
-		}
-
-		@Override String location() {
-			return source.name + ':' + lineNumber();
-		}
-
-		private int lineNumber() {
-			int line = 0;
-			int i = -1;
-			do {
-				line++;
-				i = source.text.indexOf('\n',i+1);
-			} while( i != -1 && i < start );
-			return line;
-		}
-
-	}
 }
--- a/core/src/luan/LuanState.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/LuanState.java	Wed May 06 14:32:29 2015 -0600
@@ -50,7 +50,7 @@
 
 	// convenience methods
 
-	private final LuanBit JAVA = bit(LuanElement.JAVA);
+	private final LuanBit JAVA = bit(null);
 
 	public LuanException exception(Object msg) {
 		return JAVA.exception(msg);
--- a/core/src/luan/impl/AddExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/AddExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -1,12 +1,12 @@
 package luan.impl;
 
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class AddExpr extends BinaryOpExpr {
 
-	AddExpr(LuanSource.Element se,Expr op1,Expr op2) {
+	AddExpr(LuanElement se,Expr op1,Expr op2) {
 		super(se,op1,op2);
 	}
 
--- a/core/src/luan/impl/AndExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/AndExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -2,12 +2,12 @@
 
 import luan.Luan;
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class AndExpr extends BinaryOpExpr {
 
-	AndExpr(LuanSource.Element se,Expr op1,Expr op2) {
+	AndExpr(LuanElement se,Expr op1,Expr op2) {
 		super(se,op1,op2);
 	}
 
--- a/core/src/luan/impl/BinaryOpExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/BinaryOpExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -4,21 +4,21 @@
 import luan.LuanTable;
 import luan.LuanFunction;
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 abstract class BinaryOpExpr extends CodeImpl implements Expr {
 	final Expr op1;
 	final Expr op2;
 
-	BinaryOpExpr(LuanSource.Element se,Expr op1,Expr op2) {
-		super(se);
+	BinaryOpExpr(LuanElement el,Expr op1,Expr op2) {
+		super(el);
 		this.op1 = op1;
 		this.op2 = op2;
 	}
 
 	Object arithmetic(LuanStateImpl luan,String op,Object o1,Object o2) throws LuanException {
-		return luan.bit(se()).arithmetic(op,o1,o2);
+		return luan.bit(el()).arithmetic(op,o1,o2);
 	}
 
 }
--- a/core/src/luan/impl/Code.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/Code.java	Wed May 06 14:32:29 2015 -0600
@@ -1,8 +1,8 @@
 package luan.impl;
 
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 interface Code {
-	public LuanSource.Element se();
+	public LuanElement el();
 }
--- a/core/src/luan/impl/CodeImpl.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/CodeImpl.java	Wed May 06 14:32:29 2015 -0600
@@ -1,16 +1,16 @@
 package luan.impl;
 
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 class CodeImpl implements Code {
-	final LuanSource.Element se;
+	final LuanElement el;
 
-	CodeImpl(LuanSource.Element se) {
-		this.se = se;
+	CodeImpl(LuanElement el) {
+		this.el = el;
 	}
 
-	@Override public final LuanSource.Element se() {
-		return se;
+	@Override public final LuanElement el() {
+		return el;
 	}
 }
--- a/core/src/luan/impl/ConcatExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/ConcatExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -3,25 +3,25 @@
 import luan.Luan;
 import luan.LuanFunction;
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 import luan.LuanBit;
 
 
 final class ConcatExpr extends BinaryOpExpr {
 
-	ConcatExpr(LuanSource.Element se,Expr op1,Expr op2) {
-		super(se,op1,op2);
+	ConcatExpr(LuanElement el,Expr op1,Expr op2) {
+		super(el,op1,op2);
 	}
 
 	@Override public Object eval(LuanStateImpl luan) throws LuanException {
 		Object o1 = op1.eval(luan);
 		Object o2 = op2.eval(luan);
-		LuanBit bit = luan.bit(se);
+		LuanBit bit = luan.bit(el);
 		LuanFunction fn = bit.getBinHandler("__concat",o1,o2);
 		if( fn != null )
 			return Luan.first(bit.call(fn,"__concat",new Object[]{o1,o2}));
-		String s1 = luan.bit(op1.se()).toString(o1);
-		String s2 = luan.bit(op2.se()).toString(o2);
+		String s1 = luan.bit(op1.el()).toString(o1);
+		String s2 = luan.bit(op2.el()).toString(o2);
 		return s1 + s2;
 	}
 }
--- a/core/src/luan/impl/ConstExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/ConstExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -1,12 +1,12 @@
 package luan.impl;
 
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class ConstExpr extends CodeImpl implements Expr {
 	private final Object obj;
 
-	ConstExpr(LuanSource.Element se,Object obj) {
+	ConstExpr(LuanElement se,Object obj) {
 		super(se);
 		this.obj = obj;
 	}
--- a/core/src/luan/impl/DivExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/DivExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -1,12 +1,12 @@
 package luan.impl;
 
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class DivExpr extends BinaryOpExpr {
 
-	DivExpr(LuanSource.Element se,Expr op1,Expr op2) {
+	DivExpr(LuanElement se,Expr op1,Expr op2) {
 		super(se,op1,op2);
 	}
 
--- a/core/src/luan/impl/EqExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/EqExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -5,14 +5,14 @@
 import luan.LuanFunction;
 import luan.LuanTable;
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 import luan.LuanBit;
 
 
 final class EqExpr extends BinaryOpExpr {
 
-	EqExpr(LuanSource.Element se,Expr op1,Expr op2) {
-		super(se,op1,op2);
+	EqExpr(LuanElement el,Expr op1,Expr op2) {
+		super(el,op1,op2);
 	}
 
 	@Override public Object eval(LuanStateImpl luan) throws LuanException {
@@ -45,7 +45,7 @@
 		Object f = mt1.rawGet("__eq");
 		if( f == null || !f.equals(mt2.rawGet("__eq")) )
 			return false;
-		LuanBit bit = luan.bit(se);
+		LuanBit bit = luan.bit(el);
 		LuanFunction fn = bit.checkFunction(f);
 		return bit.checkBoolean( Luan.first(bit.call(fn,"__eq",new Object[]{o1,o2})) );
 	}
--- a/core/src/luan/impl/ExpList.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/ExpList.java	Wed May 06 14:32:29 2015 -0600
@@ -4,7 +4,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 import luan.LuanFunction;
 import luan.Luan;
 
@@ -17,7 +17,7 @@
 			return LuanFunction.NOTHING;
 		}
 
-		@Override public LuanSource.Element se() {
+		@Override public LuanElement el() {
 			return null;
 		}
 	};
@@ -66,8 +66,8 @@
 			return a;
 		}
 	
-		@Override public LuanSource.Element se() {
-			return new LuanSource.Element(exprs[0].se().source,exprs[0].se().start,exprs[exprs.length-1].se().end);
+		@Override public LuanElement el() {
+			return new LuanElement(exprs[0].el().source,exprs[0].el().start,exprs[exprs.length-1].el().end);
 		}
 	}
 
@@ -89,8 +89,8 @@
 			return list.toArray();
 		}
 	
-		@Override public LuanSource.Element se() {
-			return new LuanSource.Element(exprs[0].se().source,exprs[0].se().start,last.se().end);
+		@Override public LuanElement el() {
+			return new LuanElement(exprs[0].el().source,exprs[0].el().start,last.el().end);
 		}
 	}
 }
--- a/core/src/luan/impl/ExpressionsExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/ExpressionsExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -3,7 +3,7 @@
 import java.util.List;
 import luan.Luan;
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class ExpressionsExpr implements Expr {
@@ -19,8 +19,8 @@
 		return Luan.first( expressions.eval(luan) );
 	}
 
-	public LuanSource.Element se() {
-		return expressions.se();
+	public LuanElement el() {
+		return expressions.el();
 	}
 
 }
--- a/core/src/luan/impl/FnCall.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/FnCall.java	Wed May 06 14:32:29 2015 -0600
@@ -3,7 +3,7 @@
 import luan.Luan;
 import luan.LuanFunction;
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 import luan.LuanTable;
 
 
@@ -12,11 +12,11 @@
 	final Expressions args;
 	final String fnName;
 
-	FnCall(LuanSource.Element se,Expr fnExpr,Expressions args) {
-		super(se);
+	FnCall(LuanElement el,Expr fnExpr,Expressions args) {
+		super(el);
 		this.fnExpr = fnExpr;
 		this.args = args;
-		this.fnName = fnExpr.se().text();
+		this.fnName = fnExpr.el().text();
 	}
 
 	@Override public Object eval(LuanStateImpl luan) throws LuanException {
@@ -26,7 +26,7 @@
 	private Object call(LuanStateImpl luan,Object o) throws LuanException {
 		if( o instanceof LuanFunction ) {
 			LuanFunction fn = (LuanFunction)o;
-			return luan.bit(se).call( fn, fnName, Luan.array(args.eval(luan)) );
+			return luan.bit(el).call( fn, fnName, Luan.array(args.eval(luan)) );
 		}
 		if( o instanceof LuanTable ) {
 			LuanTable t = (LuanTable)o;
@@ -34,7 +34,7 @@
 			if( h != null )
 				return call(luan,h);
 		}
-		throw luan.bit(fnExpr.se()).exception( "attempt to call '"+fnExpr.se().text()+"' (a " + Luan.type(o) + " value)" );
+		throw luan.bit(fnExpr.el()).exception( "attempt to call '"+fnExpr.el().text()+"' (a " + Luan.type(o) + " value)" );
 	}
 
 	@Override public String toString() {
--- a/core/src/luan/impl/FnDef.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/FnDef.java	Wed May 06 14:32:29 2015 -0600
@@ -1,7 +1,7 @@
 package luan.impl;
 
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class FnDef extends CodeImpl implements Expr {
@@ -11,7 +11,7 @@
 	final boolean isVarArg;
 	final UpValue.Getter[] upValueGetters;
 
-	FnDef(LuanSource.Element se,Stmt block,int stackSize,int numArgs,boolean isVarArg,UpValue.Getter[] upValueGetters) {
+	FnDef(LuanElement se,Stmt block,int stackSize,int numArgs,boolean isVarArg,UpValue.Getter[] upValueGetters) {
 		super(se);
 		this.block = block;
 		this.stackSize = stackSize;
--- a/core/src/luan/impl/ForStmt.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/ForStmt.java	Wed May 06 14:32:29 2015 -0600
@@ -3,7 +3,7 @@
 import luan.Luan;
 import luan.LuanException;
 import luan.LuanFunction;
-import luan.LuanSource;
+import luan.LuanElement;
 import luan.LuanBit;
 
 
@@ -13,8 +13,8 @@
 	private final Expr iterExpr;
 	private final Stmt block;
 
-	ForStmt(LuanSource.Element se,int iVars,int nVars,Expr iterExpr,Stmt block) {
-		super(se);
+	ForStmt(LuanElement el,int iVars,int nVars,Expr iterExpr,Stmt block) {
+		super(el);
 		this.iVars = iVars;
 		this.nVars = nVars;
 		this.iterExpr = iterExpr;
@@ -22,9 +22,9 @@
 	}
 
 	@Override public void eval(LuanStateImpl luan) throws LuanException {
-		LuanBit bit = luan.bit(iterExpr.se());
+		LuanBit bit = luan.bit(iterExpr.el());
 		LuanFunction iter = bit.checkFunction( iterExpr.eval(luan) );
-		String name = iterExpr.se().text();
+		String name = iterExpr.el().text();
 		try {
 			while(true) {
 				Object vals = bit.call(iter,name,LuanFunction.NOTHING);
--- a/core/src/luan/impl/GetLocalVar.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/GetLocalVar.java	Wed May 06 14:32:29 2015 -0600
@@ -1,12 +1,12 @@
 package luan.impl;
 
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class GetLocalVar extends CodeImpl implements Expr {
 	private final int index;
 
-	GetLocalVar(LuanSource.Element se,int index) {
+	GetLocalVar(LuanElement se,int index) {
 		super(se);
 		this.index = index;
 	}
--- a/core/src/luan/impl/GetUpVar.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/GetUpVar.java	Wed May 06 14:32:29 2015 -0600
@@ -1,12 +1,12 @@
 package luan.impl;
 
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class GetUpVar extends CodeImpl implements Expr {
 	private final int index;
 
-	GetUpVar(LuanSource.Element se,int index) {
+	GetUpVar(LuanElement se,int index) {
 		super(se);
 		this.index = index;
 	}
--- a/core/src/luan/impl/IfStmt.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/IfStmt.java	Wed May 06 14:32:29 2015 -0600
@@ -2,7 +2,7 @@
 
 import luan.Luan;
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class IfStmt extends CodeImpl implements Stmt {
@@ -10,15 +10,15 @@
 	final Stmt thenStmt;
 	final Stmt elseStmt;
 
-	IfStmt(LuanSource.Element se,Expr cnd,Stmt thenStmt,Stmt elseStmt) {
-		super(se);
+	IfStmt(LuanElement el,Expr cnd,Stmt thenStmt,Stmt elseStmt) {
+		super(el);
 		this.cnd = cnd;
 		this.thenStmt = thenStmt;
 		this.elseStmt = elseStmt;
 	}
 
 	@Override public void eval(LuanStateImpl luan) throws LuanException {
-		if( luan.bit(cnd.se()).checkBoolean( cnd.eval(luan) ) ) {
+		if( luan.bit(cnd.el()).checkBoolean( cnd.eval(luan) ) ) {
 			thenStmt.eval(luan);
 		} else {
 			elseStmt.eval(luan);
--- a/core/src/luan/impl/IndexExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/IndexExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -4,7 +4,7 @@
 import luan.LuanException;
 import luan.LuanTable;
 import luan.LuanFunction;
-import luan.LuanSource;
+import luan.LuanElement;
 import luan.LuanMeta;
 import luan.modules.StringLuan;
 import luan.modules.BinaryLuan;
@@ -13,8 +13,8 @@
 
 final class IndexExpr extends BinaryOpExpr {
 
-	IndexExpr(LuanSource.Element se,Expr op1,Expr op2) {
-		super(se,op1,op2);
+	IndexExpr(LuanElement el,Expr op1,Expr op2) {
+		super(el,op1,op2);
 	}
 
 	@Override public Object eval(LuanStateImpl luan) throws LuanException {
@@ -33,6 +33,6 @@
 		if( obj != null && luan.currentEnvironment().hasJava() )
 			return JavaLuan.__index(luan,obj,key);
 		else
-			throw luan.bit(op1.se()).exception( "attempt to index '"+op1.se().text()+"' (a " + Luan.type(obj) + " value)" );
+			throw luan.bit(op1.el()).exception( "attempt to index '"+op1.el().text()+"' (a " + Luan.type(obj) + " value)" );
 	}
 }
--- a/core/src/luan/impl/LeExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/LeExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -3,14 +3,14 @@
 import luan.Luan;
 import luan.LuanFunction;
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 import luan.LuanBit;
 
 
 final class LeExpr extends BinaryOpExpr {
 
-	LeExpr(LuanSource.Element se,Expr op1,Expr op2) {
-		super(se,op1,op2);
+	LeExpr(LuanElement el,Expr op1,Expr op2) {
+		super(el,op1,op2);
 	}
 
 	@Override public Object eval(LuanStateImpl luan) throws LuanException {
@@ -30,7 +30,7 @@
 			String s2 = (String)o2;
 			return s1.compareTo(s2) <= 0;
 		}
-		LuanBit bit = luan.bit(se);
+		LuanBit bit = luan.bit(el);
 		LuanFunction fn = bit.getBinHandler("__le",o1,o2);
 		if( fn != null )
 			return bit.checkBoolean( Luan.first(bit.call(fn,"__le",new Object[]{o1,o2})) );
--- a/core/src/luan/impl/LenExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/LenExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -4,14 +4,14 @@
 import luan.LuanTable;
 import luan.LuanFunction;
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 import luan.LuanBit;
 
 
 final class LenExpr extends UnaryOpExpr {
 
-	LenExpr(LuanSource.Element se,Expr op) {
-		super(se,op);
+	LenExpr(LuanElement el,Expr op) {
+		super(el,op);
 	}
 
 	@Override public Object eval(LuanStateImpl luan) throws LuanException {
@@ -24,7 +24,7 @@
 			byte[] a = (byte[])o;
 			return a.length;
 		}
-		LuanBit bit = luan.bit(se);
+		LuanBit bit = luan.bit(el);
 		if( !(o instanceof LuanTable) )
 			throw bit.exception( "attempt to get length of a " + Luan.type(o) + " value" );
 		LuanTable t = (LuanTable)o;
--- a/core/src/luan/impl/LtExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/LtExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -3,18 +3,18 @@
 import luan.Luan;
 import luan.LuanFunction;
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class LtExpr extends BinaryOpExpr {
 
-	LtExpr(LuanSource.Element se,Expr op1,Expr op2) {
-		super(se,op1,op2);
+	LtExpr(LuanElement el,Expr op1,Expr op2) {
+		super(el,op1,op2);
 	}
 
 	@Override public Object eval(LuanStateImpl luan) throws LuanException {
 		Object o1 = op1.eval(luan);
 		Object o2 = op2.eval(luan);
-		return luan.bit(se).isLessThan(o1,o2);
+		return luan.bit(el).isLessThan(o1,o2);
 	}
 }
--- a/core/src/luan/impl/LuanCompiler.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/LuanCompiler.java	Wed May 06 14:32:29 2015 -0600
@@ -36,8 +36,7 @@
 			return parser.RequiredModule();
 		} catch(ParseException e) {
 //e.printStackTrace();
-			LuanElement le = new LuanSource.CompilerElement(parser.source);
-			throw luan.bit(le).exception( e.getFancyMessage() );
+			throw luan.exception( e.getFancyMessage() );
 		}
 	}
 
--- a/core/src/luan/impl/LuanParser.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/LuanParser.java	Wed May 06 14:32:29 2015 -0600
@@ -9,6 +9,7 @@
 import luan.Luan;
 import luan.LuanState;
 import luan.LuanSource;
+import luan.LuanElement;
 import luan.modules.PackageLuan;
 
 
@@ -110,12 +111,12 @@
 		frame.addUpValueGetter(name,new UpValue.ValueGetter(value));
 	}
 
-	private LuanSource.Element se(int start) {
+	private LuanElement se(int start) {
 		return se(start,null);
 	}
 
-	private LuanSource.Element se(int start,String text) {
-		return new LuanSource.Element(source,start,parser.currentIndex(),text);
+	private LuanElement se(int start,String text) {
+		return new LuanElement(source,start,parser.currentIndex(),text);
 	}
 
 	private List<String> symbols() {
@@ -268,7 +269,7 @@
 		Expressions exprs = TemplateExpressions(In.NOTHING);
 		if( exprs == null )
 			return null;
-		LuanSource.Element se = se(start,"require 'luan:Io'");
+		LuanElement se = se(start,"require 'luan:Io'");
 		FnCall requireCall = new FnCall( se, new ConstExpr(se,PackageLuan.requireFn), new ConstExpr(se,"luan:Io") );
 		se = se(start,"stdout");
 		Expr stdoutExp = new IndexExpr( se, expr(requireCall), new ConstExpr(se,"stdout") );
@@ -878,7 +879,7 @@
 		return nameVar(se(start,name),name);
 	}
 
-	private Var nameVar(final LuanSource.Element se,final String name) {
+	private Var nameVar(final LuanElement se,final String name) {
 		return new Var() {
 
 			public Expr expr() {
--- a/core/src/luan/impl/LuanStateImpl.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/LuanStateImpl.java	Wed May 06 14:32:29 2015 -0600
@@ -117,7 +117,7 @@
 	@Override public LuanSource currentSource(){
 		if( frame==null )
 			return null;
-		return frame.closure.fnDef.se().source;
+		return frame.closure.fnDef.el().source;
 	}
 
 }
--- a/core/src/luan/impl/ModExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/ModExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -1,12 +1,12 @@
 package luan.impl;
 
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class ModExpr extends BinaryOpExpr {
 
-	ModExpr(LuanSource.Element se,Expr op1,Expr op2) {
+	ModExpr(LuanElement se,Expr op1,Expr op2) {
 		super(se,op1,op2);
 	}
 
--- a/core/src/luan/impl/MulExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/MulExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -1,12 +1,12 @@
 package luan.impl;
 
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class MulExpr extends BinaryOpExpr {
 
-	MulExpr(LuanSource.Element se,Expr op1,Expr op2) {
+	MulExpr(LuanElement se,Expr op1,Expr op2) {
 		super(se,op1,op2);
 	}
 
--- a/core/src/luan/impl/NotExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/NotExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -2,17 +2,17 @@
 
 import luan.Luan;
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class NotExpr extends UnaryOpExpr {
 
-	NotExpr(LuanSource.Element se,Expr op) {
-		super(se,op);
+	NotExpr(LuanElement el,Expr op) {
+		super(el,op);
 	}
 
 	@Override public Object eval(LuanStateImpl luan) throws LuanException {
-		return !luan.bit(op.se()).checkBoolean( op.eval(luan) );
+		return !luan.bit(op.el()).checkBoolean( op.eval(luan) );
 	}
 
 	@Override public String toString() {
--- a/core/src/luan/impl/OrExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/OrExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -2,12 +2,12 @@
 
 import luan.Luan;
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class OrExpr extends BinaryOpExpr {
 
-	OrExpr(LuanSource.Element se,Expr op1,Expr op2) {
+	OrExpr(LuanElement se,Expr op1,Expr op2) {
 		super(se,op1,op2);
 	}
 
--- a/core/src/luan/impl/PowExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/PowExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -1,12 +1,12 @@
 package luan.impl;
 
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class PowExpr extends BinaryOpExpr {
 
-	PowExpr(LuanSource.Element se,Expr op1,Expr op2) {
+	PowExpr(LuanElement se,Expr op1,Expr op2) {
 		super(se,op1,op2);
 	}
 
--- a/core/src/luan/impl/RepeatStmt.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/RepeatStmt.java	Wed May 06 14:32:29 2015 -0600
@@ -2,15 +2,15 @@
 
 import luan.Luan;
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class RepeatStmt extends CodeImpl implements Stmt {
 	private final Stmt doStmt;
 	private final Expr cnd;
 
-	RepeatStmt(LuanSource.Element se,Stmt doStmt,Expr cnd) {
-		super(se);
+	RepeatStmt(LuanElement el,Stmt doStmt,Expr cnd) {
+		super(el);
 		this.doStmt = doStmt;
 		this.cnd = cnd;
 	}
@@ -19,7 +19,7 @@
 		try {
 			do {
 				doStmt.eval(luan);
-			} while( !luan.bit(se).checkBoolean( cnd.eval(luan) ) );
+			} while( !luan.bit(el).checkBoolean( cnd.eval(luan) ) );
 		} catch(BreakException e) {}
 	}
 }
--- a/core/src/luan/impl/ReturnStmt.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/ReturnStmt.java	Wed May 06 14:32:29 2015 -0600
@@ -3,7 +3,7 @@
 import luan.Luan;
 import luan.LuanException;
 import luan.LuanFunction;
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class ReturnStmt extends CodeImpl implements Stmt {
@@ -11,8 +11,8 @@
 	private final Expr tailFnExpr;
 	boolean throwReturnException = true;
 
-	ReturnStmt(LuanSource.Element se,Expressions expressions) {
-		super(se);
+	ReturnStmt(LuanElement el,Expressions expressions) {
+		super(el);
 		if( expressions instanceof FnCall ) {  // tail call
 			FnCall fnCall = (FnCall)expressions;
 			this.expressions = fnCall.args;
@@ -26,12 +26,12 @@
 	@Override public void eval(LuanStateImpl luan) throws LuanException {
 		luan.returnValues = expressions.eval(luan);
 		if( tailFnExpr != null ) {
-			LuanSource.Element seTail = tailFnExpr.se();
-			LuanFunction tailFn = luan.bit(seTail).checkFunction( tailFnExpr.eval(luan) );
+			LuanElement elTail = tailFnExpr.el();
+			LuanFunction tailFn = luan.bit(elTail).checkFunction( tailFnExpr.eval(luan) );
 			if( tailFn instanceof Closure ) {
 				luan.tailFn = (Closure)tailFn;
 			} else {
-				luan.returnValues =  luan.bit(seTail).call(tailFn,seTail.text(),Luan.array(luan.returnValues));
+				luan.returnValues =  luan.bit(elTail).call(tailFn,elTail.text(),Luan.array(luan.returnValues));
 			}
 		}
 		if( throwReturnException )
--- a/core/src/luan/impl/SetTableEntry.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/SetTableEntry.java	Wed May 06 14:32:29 2015 -0600
@@ -4,7 +4,7 @@
 import luan.LuanTable;
 import luan.Luan;
 import luan.LuanFunction;
-import luan.LuanSource;
+import luan.LuanElement;
 import luan.LuanMeta;
 import luan.modules.JavaLuan;
 
@@ -13,8 +13,8 @@
 	private final Expr tableExpr;
 	private final Expr keyExpr;
 
-	SetTableEntry(LuanSource.Element se,Expr tableExpr,Expr keyExpr) {
-		super(se);
+	SetTableEntry(LuanElement el,Expr tableExpr,Expr keyExpr) {
+		super(el);
 		this.tableExpr = tableExpr;
 		this.keyExpr = keyExpr;
 	}
@@ -32,7 +32,7 @@
 		if( t != null && luan.currentEnvironment().hasJava() )
 			JavaLuan.__new_index(luan,t,key,value);
 		else
-			throw luan.bit(se).exception( "attempt to index '"+tableExpr.se().text()+"' (a " + Luan.type(t) + " value)" );
+			throw luan.bit(el).exception( "attempt to index '"+tableExpr.el().text()+"' (a " + Luan.type(t) + " value)" );
 	}
 
 }
--- a/core/src/luan/impl/SubExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/SubExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -1,12 +1,12 @@
 package luan.impl;
 
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class SubExpr extends BinaryOpExpr {
 
-	SubExpr(LuanSource.Element se,Expr op1,Expr op2) {
+	SubExpr(LuanElement se,Expr op1,Expr op2) {
 		super(se,op1,op2);
 	}
 
--- a/core/src/luan/impl/TableExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/TableExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -2,7 +2,7 @@
 
 import luan.LuanException;
 import luan.LuanTable;
-import luan.LuanSource;
+import luan.LuanElement;
 import luan.Luan;
 
 
@@ -21,7 +21,7 @@
 	private final Field[] fields;
 	private final Expressions expressions;
 
-	TableExpr(LuanSource.Element se,Field[] fields,Expressions expressions) {
+	TableExpr(LuanElement se,Field[] fields,Expressions expressions) {
 		super(se);
 		this.fields = fields;
 		this.expressions = expressions;
--- a/core/src/luan/impl/UnaryOpExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/UnaryOpExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -1,12 +1,12 @@
 package luan.impl;
 
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 abstract class UnaryOpExpr extends CodeImpl implements Expr {
 	final Expr op;
 
-	UnaryOpExpr(LuanSource.Element se,Expr op) {
+	UnaryOpExpr(LuanElement se,Expr op) {
 		super(se);
 		this.op = op;
 	}
--- a/core/src/luan/impl/UnmExpr.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/UnmExpr.java	Wed May 06 14:32:29 2015 -0600
@@ -3,7 +3,7 @@
 import luan.Luan;
 import luan.LuanFunction;
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 import luan.LuanBit;
 import luan.LuanTable;
 
@@ -11,15 +11,15 @@
 // unary minus
 final class UnmExpr extends UnaryOpExpr {
 
-	UnmExpr(LuanSource.Element se,Expr op) {
-		super(se,op);
+	UnmExpr(LuanElement el,Expr op) {
+		super(el,op);
 	}
 
 	@Override public Object eval(LuanStateImpl luan) throws LuanException {
 		Object o = op.eval(luan);
 		if( o instanceof Number )
 			return -((Number)o).doubleValue();
-		LuanBit bit = luan.bit(se);
+		LuanBit bit = luan.bit(el);
 		if( o instanceof LuanTable ) {
 			LuanFunction fn = bit.getHandlerFunction("__unm",(LuanTable)o);
 			if( fn != null ) {
--- a/core/src/luan/impl/VarArgs.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/VarArgs.java	Wed May 06 14:32:29 2015 -0600
@@ -1,11 +1,11 @@
 package luan.impl;
 
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class VarArgs extends CodeImpl implements Expressions {
 
-	VarArgs(LuanSource.Element se) {
+	VarArgs(LuanElement se) {
 		super(se);
 	}
 
--- a/core/src/luan/impl/WhileStmt.java	Wed May 06 12:58:06 2015 -0600
+++ b/core/src/luan/impl/WhileStmt.java	Wed May 06 14:32:29 2015 -0600
@@ -2,22 +2,22 @@
 
 import luan.Luan;
 import luan.LuanException;
-import luan.LuanSource;
+import luan.LuanElement;
 
 
 final class WhileStmt extends CodeImpl implements Stmt {
 	private final Expr cnd;
 	private final Stmt doStmt;
 
-	WhileStmt(LuanSource.Element se,Expr cnd,Stmt doStmt) {
-		super(se);
+	WhileStmt(LuanElement el,Expr cnd,Stmt doStmt) {
+		super(el);
 		this.cnd = cnd;
 		this.doStmt = doStmt;
 	}
 
 	@Override public void eval(LuanStateImpl luan) throws LuanException {
 		try {
-			while( luan.bit(se).checkBoolean( cnd.eval(luan) ) ) {
+			while( luan.bit(el).checkBoolean( cnd.eval(luan) ) ) {
 				doStmt.eval(luan);
 			}
 		} catch(BreakException e) {}