changeset 664:71f8f5075df8

compile FnDef
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 07 Apr 2016 15:11:52 -0600
parents b438a47196bc
children 41f8fdbc3a0a
files core/src/luan/impl/Closure.java core/src/luan/impl/FnDef.java core/src/luan/impl/LuanImpl.java core/src/luan/impl/LuanParser.java core/src/luan/impl/ThemeParser.java core/src/luan/impl/UpValue.java
diffstat 6 files changed, 43 insertions(+), 118 deletions(-) [+]
line wrap: on
line diff
--- a/core/src/luan/impl/Closure.java	Thu Apr 07 00:01:10 2016 -0600
+++ b/core/src/luan/impl/Closure.java	Thu Apr 07 15:11:52 2016 -0600
@@ -57,7 +57,7 @@
 		}
 		Object returnValues;
 		try {
-			return fnDef.block.eval(luan);
+			return fnDef.run(luan);
 		} catch(StackOverflowError e) {
 			throw new LuanException( "stack overflow", e );
 		} finally {
--- a/core/src/luan/impl/FnDef.java	Thu Apr 07 00:01:10 2016 -0600
+++ b/core/src/luan/impl/FnDef.java	Thu Apr 07 15:11:52 2016 -0600
@@ -3,38 +3,22 @@
 import luan.LuanException;
 
 
-final class FnDef extends CodeImpl implements Expr {
-	final Expressions block;
+public abstract class FnDef extends CodeImpl implements Expr {
 	final int stackSize;
 	final int numArgs;
 	final boolean isVarArg;
 	final UpValue.Getter[] upValueGetters;
 
-	FnDef(Expressions block,int stackSize,int numArgs,boolean isVarArg,UpValue.Getter[] upValueGetters) {
-		this.block = block;
+	public FnDef(int stackSize,int numArgs,boolean isVarArg,UpValue.Getter[] upValueGetters) {
 		this.stackSize = stackSize;
 		this.numArgs = numArgs;
 		this.isVarArg = isVarArg;
 		this.upValueGetters = upValueGetters;
-//		fixReturns(block);
 	}
-/*
-	private static void fixReturns(Stmt stmt) {
-		if( stmt instanceof ReturnStmt ) {
-			ReturnStmt rs = (ReturnStmt)stmt;
-			rs.throwReturnException = false;
-		} else if( stmt instanceof Block ) {
-			Block b = (Block)stmt;
-			fixReturns( b.stmts[b.stmts.length-1] );
-		} else if( stmt instanceof IfStmt ) {
-			IfStmt is = (IfStmt)stmt;
-			fixReturns( is.thenStmt );
-			fixReturns( is.elseStmt );
-		}
-	}
-*/
+
 	@Override public Object eval(LuanStateImpl luan) throws LuanException {
 		return new Closure(luan,this);
 	}
 
+	public abstract Object run(LuanStateImpl luan) throws LuanException;
 }
--- a/core/src/luan/impl/LuanImpl.java	Thu Apr 07 00:01:10 2016 -0600
+++ b/core/src/luan/impl/LuanImpl.java	Thu Apr 07 15:11:52 2016 -0600
@@ -15,42 +15,16 @@
 	private LuanImpl() {}  // never
 
 
-	private static List<Expressions> listExpressions = new ArrayList<Expressions>();
+	private static List list = new ArrayList();
 
-	static int addExpressions(Expressions exp) {
-		int i = listExpressions.size();
-		listExpressions.add(exp);
+	static int addObj(Object obj) {
+		int i = list.size();
+		list.add(obj);
 		return i;
 	}
 
-	public static Expressions getExpressions(int i) {
-		return listExpressions.get(i);
-	}
-
-/*
-	private static List<Stmt> listStmt = new ArrayList<Stmt>();
-
-	static int addStmt(Stmt stmt) {
-		int i = listStmt.size();
-		listStmt.add(stmt);
-		return i;
-	}
-
-	public static Stmt getStmt(int i) {
-		return listStmt.get(i);
-	}
-*/
-
-	private static List<Settable> listSettable = new ArrayList<Settable>();
-
-	static int addSettable(Settable settable) {
-		int i = listSettable.size();
-		listSettable.add(settable);
-		return i;
-	}
-
-	public static Settable getSettable(int i) {
-		return listSettable.get(i);
+	public static Object getObj(int i) {
+		return list.get(i);
 	}
 
 
--- a/core/src/luan/impl/LuanParser.java	Thu Apr 07 00:01:10 2016 -0600
+++ b/core/src/luan/impl/LuanParser.java	Thu Apr 07 15:11:52 2016 -0600
@@ -177,7 +177,8 @@
 	private FnDef newFnDef(int start,StmtString stmt) {
 		if( !stmt.hasReturn )
 			stmt = new StmtString( stmt.code + "return LuanFunction.NOTHING;\n" );
-		return new FnDef( toExpressions(stmt), frame.stackSize, symbolsSize(), frame.isVarArg, frame.upValueGetters.toArray(NO_UP_VALUE_GETTERS) );
+//		return new FnDef( toExpressions(stmt), frame.stackSize, symbolsSize(), frame.isVarArg, frame.upValueGetters.toArray(NO_UP_VALUE_GETTERS) );
+		return toFnDef( stmt, frame.stackSize, symbolsSize(), frame.isVarArg, frame.upValueGetters.toArray(NO_UP_VALUE_GETTERS) );
 	}
 
 	FnDef Expression() throws ParseException {
@@ -280,18 +281,6 @@
 		return new ExpString(code,true,false);
 	}
 
-	private ExpString constExpStr(String s) {
-		s = s
-			.replace("\\","\\\\")
-			.replace("\"","\\\"")
-			.replace("\n","\\n")
-			.replace("\r","\\r")
-			.replace("\t","\\t")
-			.replace("\b","\\b")
-		;
-		return new ExpString( "\""+s+"\"", true,false);
-	}
-
 	private ExpString callExpStr(ExpString fn,ExpString args) {
 		String code = "Luan.checkFunction(" + fn.expr().code + ").call(luan,Luan.array(" + args.code + "))";
 		return new ExpString(code,false,true);
@@ -1276,6 +1265,18 @@
 		return parser.failure(null);
 	}
 
+	private ExpString constExpStr(String s) {
+		s = s
+			.replace("\\","\\\\")
+			.replace("\"","\\\"")
+			.replace("\n","\\n")
+			.replace("\r","\\r")
+			.replace("\t","\\t")
+			.replace("\b","\\b")
+		;
+		return new ExpString( "\""+s+"\"", true,false);
+	}
+
 	private boolean NilLiteral(In in) throws ParseException {
 		return Keyword("nil",in);
 	}
@@ -1532,8 +1533,8 @@
 
 		ExpString(Expressions exp) {
 			if( exp==null )  throw new NullPointerException();
-			int i = LuanImpl.addExpressions(exp);
-			code = "LuanImpl.getExpressions(" + i + ").eval(luan)";
+			int i = LuanImpl.addObj(exp);
+			code = "((Expressions)LuanImpl.getObj(" + i + ")).eval(luan)";
 			isExpr = exp instanceof Expr;
 			isStmt = exp instanceof StmtExp;
 		}
@@ -1577,56 +1578,17 @@
 	private static class StmtString {
 		final String code;
 		boolean hasReturn = false;
-/*
-		StmtString(Stmt stmt) {
-			if( stmt==null )  throw new NullPointerException();
-			int i = LuanImpl.addStmt(stmt);
-			code = "LuanImpl.getStmt(" + i + ").eval(luan);\n";
-		}
-*/
+
 		StmtString(String code) {
 			this.code = code;
 			if( code.contains("LuanParser") )  throw new RuntimeException("\n"+code);
 		}
-
-		Stmt toStmt() {
-			String className = "EXP" + ++classCounter;
-			String classCode = ""
-				+"package luan.impl;\n"
-				+"import luan.Luan;\n"
-				+"import luan.LuanFunction;\n"
-				+"import luan.LuanException;\n"
-				+"import luan.modules.PackageLuan;\n"
-				+"\n"
-				+"public class " + className +" implements Stmt {\n"
-				+"	@Override public void eval(LuanStateImpl luan) throws LuanException {\n"
-				+"		Object t;\n"
-				+"		" + code
-				+"	}\n"
-				+"}\n"
-			;
-//System.out.println(code);
-			try {
-				Class cls = LuanJavaCompiler.compile("luan.impl."+className,"code",classCode);
-				return (Stmt)cls.newInstance();
-			} catch(ClassNotFoundException e) {
-				throw new RuntimeException(e);
-			} catch(InstantiationException e) {
-				throw new RuntimeException(e);
-			} catch(IllegalAccessException e) {
-				throw new RuntimeException(e);
-			}
-		}
 	}
 
 	private static StmtString EMPTY_STMT = new StmtString("");
 
-	private static Stmt stmt(StmtString stmtStr) {
-		return stmtStr==null ? null : stmtStr.toStmt();
-	}
-
-
-	static Expressions toExpressions(StmtString stmt) {
+	static FnDef toFnDef(StmtString stmt,int stackSize,int numArgs,boolean isVarArg,UpValue.Getter[] upValueGetters) {
+		int i = LuanImpl.addObj(upValueGetters);
 		String className = "EXP" + ++classCounter;
 		String classCode = ""
 			+"package luan.impl;\n"
@@ -1635,8 +1597,12 @@
 			+"import luan.LuanException;\n"
 			+"import luan.modules.PackageLuan;\n"
 			+"\n"
-			+"public class " + className +" implements Expressions {\n"
-			+"	@Override public Object eval(LuanStateImpl luan) throws LuanException {\n"
+			+"public class " + className +" extends FnDef {\n"
+			+"	public "+className+"() {\n"
+			+"		super("+stackSize+","+numArgs+","+isVarArg+",(UpValue.Getter[])LuanImpl.getObj("+i+"));\n"
+			+"	}\n"
+			+"\n"
+			+"	@Override public Object run(LuanStateImpl luan) throws LuanException {\n"
 			+"		Object t;\n"
 			+"		" + stmt.code
 			+"	}\n"
@@ -1644,7 +1610,7 @@
 		;
 		try {
 			Class cls = LuanJavaCompiler.compile("luan.impl."+className,"code",classCode);
-			return (Expressions)cls.newInstance();
+			return (FnDef)cls.newInstance();
 		} catch(ClassNotFoundException e) {
 			throw new RuntimeException(e);
 		} catch(InstantiationException e) {
@@ -1660,8 +1626,8 @@
 
 		SettableString(Settable settable) {
 			if( settable==null )  throw new NullPointerException();
-			int i = LuanImpl.addSettable(settable);
-			code = "LuanImpl.getSettable(" + i + ")";
+			int i = LuanImpl.addObj(settable);
+			code = "((Settable)LuanImpl.getObj(" + i + "))";
 		}
 
 		SettableString(String code) {
--- a/core/src/luan/impl/ThemeParser.java	Thu Apr 07 00:01:10 2016 -0600
+++ b/core/src/luan/impl/ThemeParser.java	Thu Apr 07 15:11:52 2016 -0600
@@ -107,7 +107,8 @@
 	}
 
 	private FnDef newFnDef(Stmt stmt) {
-		return new FnDef( /*stmt*/null, frame.stackSize, symbolsSize(), frame.isVarArg, frame.upValueGetters.toArray(NO_UP_VALUE_GETTERS) );
+//		return new FnDef( /*stmt*/null, frame.stackSize, symbolsSize(), frame.isVarArg, frame.upValueGetters.toArray(NO_UP_VALUE_GETTERS) );
+		return null;
 	}
 
 	private int stackIndex(String name) {
--- a/core/src/luan/impl/UpValue.java	Thu Apr 07 00:01:10 2016 -0600
+++ b/core/src/luan/impl/UpValue.java	Thu Apr 07 15:11:52 2016 -0600
@@ -5,7 +5,7 @@
 import luan.LuanException;
 
 
-final class UpValue implements DeepCloneable {
+public final class UpValue implements DeepCloneable {
 	private Object[] stack;
 	private int index;
 	private boolean isClosed = false;
@@ -56,7 +56,7 @@
 		stack = null;
 	}
 
-	static interface Getter {
+	public static interface Getter {
 		public UpValue get(LuanStateImpl luan) throws LuanException;
 	}