Mercurial Hosting > luan
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 ) { |