comparison core/src/luan/impl/LuanCompiler.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 08df375e2e5f
children 5ba136769034
comparison
equal deleted inserted replaced
194:08df375e2e5f 195:24ede40ee0aa
22 Object key = entry.getKey(); 22 Object key = entry.getKey();
23 if( key instanceof String ) 23 if( key instanceof String )
24 parser.addVar( (String)key, entry.getValue() ); 24 parser.addVar( (String)key, entry.getValue() );
25 } 25 }
26 FnDef fnDef = parse(luan,parser,allowExpr); 26 FnDef fnDef = parse(luan,parser,allowExpr);
27 if( passedEnv ) 27 final LuanStateImpl luanImpl = (LuanStateImpl)luan;
28 return new Closure((LuanStateImpl)luan,fnDef); 28 MtGetterLink mtGetterLink = (MtGetterLink)env.get("_MTG");
29 final Closure c = new Closure((LuanStateImpl)luan,fnDef); 29 final Closure c = new Closure(luanImpl,fnDef,mtGetterLink);
30 return new LuanFunction() { 30 final LuanTable ENV = env;
31 @Override public Object call(LuanState luan,Object[] args) throws LuanException { 31 if( passedEnv ) {
32 Object rtn = c.call(luan,args); 32 return new LuanFunction() {
33 if( rtn instanceof Object[] && ((Object[])rtn).length==0 ) 33 @Override public Object call(LuanState luan,Object[] args) throws LuanException {
34 rtn = c.upValues()[0].get(); 34 Object rtn = c.call(luan,args);
35 return rtn; 35 ENV.put("_MTG",luanImpl.mtGetterLink);
36 } 36 return rtn;
37 }; 37 }
38 };
39 } else {
40 return new LuanFunction() {
41 @Override public Object call(LuanState luan,Object[] args) throws LuanException {
42 Object rtn = c.call(luan,args);
43 if( rtn instanceof Object[] && ((Object[])rtn).length==0 )
44 rtn = ENV;
45 return rtn;
46 }
47 };
48 }
38 } 49 }
39 50
40 private static FnDef parse(LuanState luan,LuanParser parser,boolean allowExpr) throws LuanException { 51 private static FnDef parse(LuanState luan,LuanParser parser,boolean allowExpr) throws LuanException {
41 try { 52 try {
42 if( allowExpr ) { 53 if( allowExpr ) {