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