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 {