Mercurial Hosting > luan
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; }