Mercurial Hosting > luan
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 {