diff core/src/luan/impl/LuanParser.java @ 195:24ede40ee0aa

make MetatableGetter DeepCloneable, scoped, and secure git-svn-id: https://luan-java.googlecode.com/svn/trunk@196 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Thu, 03 Jul 2014 08:19:48 +0000
parents 66ed8886abc0
children 9fb218211763
line wrap: on
line diff
--- a/core/src/luan/impl/LuanParser.java	Wed Jul 02 04:52:25 2014 +0000
+++ b/core/src/luan/impl/LuanParser.java	Thu Jul 03 08:19:48 2014 +0000
@@ -272,8 +272,10 @@
 		if( exp == null )
 			return null;
 		Expr fnExp = (Expr)nameVar(start,"Io").expr();
-		fnExp = new IndexExpr( se(start,"stdout"), fnExp, new ConstExpr("stdout") );
-		fnExp = new IndexExpr( se(start,"write"), fnExp, new ConstExpr("write") );
+		LuanSource.Element se = se(start,"stdout");
+		fnExp = new IndexExpr( se, fnExp, new ConstExpr(se,"stdout") );
+		se = se(start,"write");
+		fnExp = new IndexExpr( se, fnExp, new ConstExpr(se,"write") );
 		FnCall fnCall = new FnCall( se(start), fnExp, exp );
 		return new ExpressionsStmt(fnCall);
 	}
@@ -304,7 +306,7 @@
 						throw parser.exception("Unclosed template expression");
 				} while( !parser.test( "<%" ) );
 				String match = parser.textFrom(i);
-				builder.add( new ConstExpr(match) );
+				builder.add( new ConstExpr(se(i),match) );
 			}
 		}
 	}
@@ -360,7 +362,7 @@
 		if( !isValidName(varName) )
 			throw parser.exception("invalid variable name '"+varName+"' in import");
 		LuanSource.Element se = se(start);
-		FnCall require = new FnCall( se, new ConstExpr(se,PackageLuan.requireFn), new ConstExpr(modName) );
+		FnCall require = new FnCall( se, new ConstExpr(se,PackageLuan.requireFn), new ConstExpr(se(start,modName),modName) );
 		Settable settable;
 		if( interactive ) {
 			settable = nameVar(se,varName).settable();
@@ -974,7 +976,7 @@
 				index = upValueIndex(name);
 				if( index != -1 )
 					return new GetUpVar(se,index);
-				return new IndexExpr( se, env(), new ConstExpr(name) );
+				return new IndexExpr( se, env(), new ConstExpr(se,name) );
 			}
 
 			public Settable settable() {
@@ -984,7 +986,7 @@
 				index = upValueIndex(name);
 				if( index != -1 )
 					return new SetUpVar(index);
-				return new SetTableEntry( se, env(), new ConstExpr(name) );
+				return new SetTableEntry( se, env(), new ConstExpr(se,name) );
 			}
 		};
 	}
@@ -1023,6 +1025,7 @@
 	}
 
 	private boolean args(In in,List<Expressions> builder) throws ParseException {
+		int start = parser.begin();
 		if( parser.match('(') ) {
 			In inParens = in.parens();
 			Spaces(inParens);
@@ -1030,26 +1033,26 @@
 			if( !parser.match(')') )
 				throw parser.exception("Expression or ')' expected");
 			Spaces(in);
-			return true;
+			return parser.success();
 		}
 		Expr exp = TableExpr(in);
 		if( exp != null ) {
 			builder.add(exp);
-			return true;
+			return parser.success();
 		}
 		String s = StringLiteral(in);
 		if( s != null ) {
-			builder.add( new ConstExpr(s) );
-			return true;
+			builder.add( new ConstExpr(se(start),s) );
+			return parser.success();
 		}
 /*
 		Expressions exps = TemplateExpressions(in);
 		if( exps != null ) {
 			builder.add(exps);
-			return true;
+			return parser.success();
 		}
 */
-		return false;
+		return parser.failure();
 	}
 
 	private Expressions ExpList(In in) throws ParseException {
@@ -1093,8 +1096,11 @@
 	}
 
 	private Expr NameExpr(In in) throws ParseException {
+		int start = parser.begin();
 		String name = Name(in);
-		return name==null ? null : new ConstExpr(name);
+		if( name==null )
+			return parser.failure(null);
+		return parser.success(new ConstExpr(se(start),name));
 	}
 
 	private String RequiredName(In in) throws ParseException {
@@ -1177,18 +1183,19 @@
 	));
 
 	private Expr Literal(In in) throws ParseException {
+		int start = parser.begin();
 		if( NilLiteral(in) )
-			return new ConstExpr(null);
+			return parser.success(new ConstExpr(se(start),null));
 		Boolean b = BooleanLiteral(in);
 		if( b != null )
-			return new ConstExpr(b);
+			return parser.success(new ConstExpr(se(start),b));
 		Number n = NumberLiteral(in);
 		if( n != null )
-			return new ConstExpr(n);
+			return parser.success(new ConstExpr(se(start),n));
 		String s = StringLiteral(in);
 		if( s != null )
-			return new ConstExpr(s);
-		return null;
+			return parser.success(new ConstExpr(se(start),s));
+		return parser.failure(null);
 	}
 
 	private boolean NilLiteral(In in) throws ParseException {