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

implement Closure directly
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 08 Apr 2016 07:00:17 -0600
parents 2f449ccf54d2
children 7780cafca27f
line wrap: on
line diff
--- a/core/src/luan/impl/LuanParser.java	Thu Apr 07 23:36:56 2016 -0600
+++ b/core/src/luan/impl/LuanParser.java	Fri Apr 08 07:00:17 2016 -0600
@@ -174,10 +174,10 @@
 		return new ExpressionsExpr(exprs);
 	}
 
-	private FnDef newFnDef(int start,StmtString stmt) {
+	private Class newFnClass(int start,StmtString stmt) {
 		if( !stmt.hasReturn )
 			stmt.list.add( "return LuanFunction.NOTHING;\n" );
-		return toFnDef( stmt, frame.stackSize, symbolsSize(), frame.isVarArg, frame.upValueGetters.toArray(NO_UP_VALUE_GETTERS) );
+		return toFnClass( stmt, frame.stackSize, symbolsSize(), frame.isVarArg, frame.upValueGetters.toArray(NO_UP_VALUE_GETTERS) );
 	}
 
 	private ExpString newFnExpStr(int start,StmtString stmt) {
@@ -186,7 +186,7 @@
 		return toFnExpStr( stmt, frame.stackSize, symbolsSize(), frame.isVarArg, frame.upValueGetters.toArray(NO_UP_VALUE_GETTERS) );
 	}
 
-	FnDef Expression() throws ParseException {
+	Class Expression() throws ParseException {
 		Spaces(In.NOTHING);
 		int start = parser.begin();
 		ExpString expr = ExprZ(In.NOTHING);
@@ -196,18 +196,18 @@
 			stmt.list.addAll( expr.list );
 			stmt.list.add( ";\n" );
 			stmt.hasReturn = true;
-			return parser.success(newFnDef(start,stmt));
+			return parser.success(newFnClass(start,stmt));
 		}
 		return parser.failure(null);
 	}
 
-	FnDef RequiredModule() throws ParseException {
+	Class RequiredModule() throws ParseException {
 		Spaces(In.NOTHING);
 		int start = parser.begin();
 		frame.isVarArg = true;
 		StmtString stmt = RequiredBlock();
 		if( parser.endOfInput() )
-			return parser.success(newFnDef(start,stmt));
+			return parser.success(newFnClass(start,stmt));
 		throw parser.exception();
 	}
 
@@ -1757,7 +1757,7 @@
 		boolean hasReturn = false;
 	}
 
-	private static FnDef toFnDef(StmtString stmt,int stackSize,int numArgs,boolean isVarArg,UpValue.Getter[] upValueGetters) {
+	private static Class toFnClass(StmtString stmt,int stackSize,int numArgs,boolean isVarArg,UpValue.Getter[] upValueGetters) {
 		StringBuilder sb = new StringBuilder();
 		for( Object o : stmt.list ) {
 			if( o instanceof List )  throw new RuntimeException();
@@ -1777,9 +1777,9 @@
 			+"import luan.LuanException;\n"
 			+"import luan.modules.PackageLuan;\n"
 			+"\n"
-			+"public class " + className +" extends FnDef {\n"
-			+"	public "+className+"() {\n"
-			+"		super("+stackSize+","+numArgs+","+isVarArg+",(UpValue.Getter[])LuanImpl.getObj("+i+"));\n"
+			+"public class " + className +" extends Closure {\n"
+			+"	public "+className+"(LuanStateImpl luan) throws LuanException {\n"
+			+"		super(luan,"+stackSize+","+numArgs+","+isVarArg+",(UpValue.Getter[])LuanImpl.getObj("+i+"));\n"
 			+"	}\n"
 			+"\n"
 			+"	@Override public Object run(LuanStateImpl luan) throws LuanException {\n"
@@ -1790,14 +1790,9 @@
 		;
 		try {
 //System.out.println(classCode);
-			Class cls = LuanJavaCompiler.compile("luan.impl."+className,"code",classCode);
-			return (FnDef)cls.newInstance();
+			return LuanJavaCompiler.compile("luan.impl."+className,"code",classCode);
 		} catch(ClassNotFoundException e) {
 			throw new RuntimeException(e);
-		} catch(InstantiationException e) {
-			throw new RuntimeException(e);
-		} catch(IllegalAccessException e) {
-			throw new RuntimeException(e);
 		}
 	}
 
@@ -1806,7 +1801,7 @@
 		ExpString exp = new ExpString(true,false);
 		exp.list.add( ""
 			+"\n"
-			+"new FnDef("+stackSize+","+numArgs+","+isVarArg+",(UpValue.Getter[])LuanImpl.getObj("+i+")) {\n"
+			+"new Closure(luan,"+stackSize+","+numArgs+","+isVarArg+",(UpValue.Getter[])LuanImpl.getObj("+i+")) {\n"
 			+"	@Override public Object run(LuanStateImpl luan) throws LuanException {\n"
 			+"		Object t;\n"
 			+"		"
@@ -1814,7 +1809,7 @@
 		exp.list.addAll( stmt.list );
 		exp.list.add( ""
 			+"	}\n"
-			+"}.eval(luan)\n"
+			+"}\n"
 		);
 		return exp;
 	}