Mercurial Hosting > luan
diff 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 |
line wrap: on
line diff
--- a/core/src/luan/impl/LuanCompiler.java Wed Jul 02 04:52:25 2014 +0000 +++ b/core/src/luan/impl/LuanCompiler.java Thu Jul 03 08:19:48 2014 +0000 @@ -24,17 +24,28 @@ parser.addVar( (String)key, entry.getValue() ); } FnDef fnDef = parse(luan,parser,allowExpr); - if( passedEnv ) - return new Closure((LuanStateImpl)luan,fnDef); - final Closure c = new Closure((LuanStateImpl)luan,fnDef); - return new LuanFunction() { - @Override public Object call(LuanState luan,Object[] args) throws LuanException { - Object rtn = c.call(luan,args); - if( rtn instanceof Object[] && ((Object[])rtn).length==0 ) - rtn = c.upValues()[0].get(); - return rtn; - } - }; + final LuanStateImpl luanImpl = (LuanStateImpl)luan; + MtGetterLink mtGetterLink = (MtGetterLink)env.get("_MTG"); + final Closure c = new Closure(luanImpl,fnDef,mtGetterLink); + final LuanTable ENV = env; + if( passedEnv ) { + return new LuanFunction() { + @Override public Object call(LuanState luan,Object[] args) throws LuanException { + Object rtn = c.call(luan,args); + ENV.put("_MTG",luanImpl.mtGetterLink); + return rtn; + } + }; + } else { + return new LuanFunction() { + @Override public Object call(LuanState luan,Object[] args) throws LuanException { + Object rtn = c.call(luan,args); + if( rtn instanceof Object[] && ((Object[])rtn).length==0 ) + rtn = ENV; + return rtn; + } + }; + } } private static FnDef parse(LuanState luan,LuanParser parser,boolean allowExpr) throws LuanException {