diff core/src/luan/impl/LuanCompiler.java @ 667:08966099aa6d

implement Closure directly
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 08 Apr 2016 07:00:17 -0600
parents 37f0cf43f191
children 58ebfec6178b
line wrap: on
line diff
--- a/core/src/luan/impl/LuanCompiler.java	Thu Apr 07 23:36:56 2016 -0600
+++ b/core/src/luan/impl/LuanCompiler.java	Fri Apr 08 07:00:17 2016 -0600
@@ -1,12 +1,13 @@
 package luan.impl;
 
+import java.util.Map;
+import java.lang.reflect.InvocationTargetException;
 import luan.LuanFunction;
 import luan.LuanState;
 import luan.LuanException;
 import luan.LuanTable;
 import luan.modules.JavaLuan;
 import luan.modules.PackageLuan;
-import java.util.Map;
 
 
 public final class LuanCompiler {
@@ -16,17 +17,27 @@
 		LuanParser parser = new LuanParser(sourceName,sourceText,env);
 		parser.addVar( "java", JavaLuan.javaFn );
 		parser.addVar( "require", PackageLuan.requireFn );
-		FnDef fnDef = parse(parser,allowExpr);
+		Class fnClass = parse(parser,allowExpr);
 		final LuanStateImpl luanImpl = (LuanStateImpl)luan;
-		return new Closure(luanImpl,fnDef);
+		try {
+			return (LuanFunction)fnClass.getConstructor(LuanStateImpl.class).newInstance(luanImpl);
+		} catch(NoSuchMethodException e) {
+			throw new RuntimeException(e);
+		} catch(InstantiationException e) {
+			throw new RuntimeException(e);
+		} catch(IllegalAccessException e) {
+			throw new RuntimeException(e);
+		} catch(InvocationTargetException e) {
+			throw new RuntimeException(e);
+		}
 	}
 
-	private static FnDef parse(LuanParser parser,boolean allowExpr) throws LuanException {
+	private static Class parse(LuanParser parser,boolean allowExpr) throws LuanException {
 		try {
 			if( allowExpr ) {
-				FnDef fnDef = parser.Expression();
-				if( fnDef != null )
-					return fnDef;
+				Class fnClass = parser.Expression();
+				if( fnClass != null )
+					return fnClass;
 			}
 			return parser.RequiredModule();
 		} catch(ParseException e) {