comparison core/src/luan/impl/LuanCompiler.java @ 327:0be73ac9103d

handle circular package loading git-svn-id: https://luan-java.googlecode.com/svn/trunk@328 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Thu, 19 Mar 2015 05:36:05 +0000
parents 7f7708e8fdd4
children 23b99a5039b5
comparison
equal deleted inserted replaced
326:db37d6aee4db 327:0be73ac9103d
14 14
15 public final class LuanCompiler { 15 public final class LuanCompiler {
16 private LuanCompiler() {} // never 16 private LuanCompiler() {} // never
17 17
18 public static LuanFunction compile(LuanState luan,LuanSource src,LuanTable env,boolean allowExpr) throws LuanException { 18 public static LuanFunction compile(LuanState luan,LuanSource src,LuanTable env,boolean allowExpr) throws LuanException {
19 boolean passedEnv = env != null; 19 if( env==null )
20 if( !passedEnv )
21 env = Luan.newTable(); 20 env = Luan.newTable();
22 UpValue.Getter envGetter = new UpValue.ValueGetter(env); 21 UpValue.Getter envGetter = new UpValue.ValueGetter(env);
23 LuanParser parser = new LuanParser(src,envGetter); 22 LuanParser parser = new LuanParser(src,envGetter);
24 parser.addVar( "java", JavaLuan.javaFn ); 23 parser.addVar( "java", JavaLuan.javaFn );
25 parser.addVar( "require", PackageLuan.requireFn ); 24 parser.addVar( "require", PackageLuan.requireFn );
26 FnDef fnDef = parse(luan,parser,allowExpr); 25 FnDef fnDef = parse(luan,parser,allowExpr);
27 final LuanStateImpl luanImpl = (LuanStateImpl)luan; 26 final LuanStateImpl luanImpl = (LuanStateImpl)luan;
28 final Closure c = new Closure(luanImpl,fnDef); 27 return new Closure(luanImpl,fnDef);
29 if( passedEnv )
30 return c;
31 return new LuanFunction() {
32 @Override public Object call(LuanState luan,Object[] args) throws LuanException {
33 Object rtn = c.call(luan,args);
34 if( rtn instanceof Object[] && ((Object[])rtn).length==0 )
35 rtn = c.upValues()[0].get();
36 return rtn;
37 }
38 };
39 } 28 }
40 29
41 private static FnDef parse(LuanState luan,LuanParser parser,boolean allowExpr) throws LuanException { 30 private static FnDef parse(LuanState luan,LuanParser parser,boolean allowExpr) throws LuanException {
42 try { 31 try {
43 if( allowExpr ) { 32 if( allowExpr ) {