Mercurial Hosting > luan
comparison core/src/luan/modules/PackageLuan.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 | d34be4588556 |
children | 673eebd83b74 |
comparison
equal
deleted
inserted
replaced
326:db37d6aee4db | 327:0be73ac9103d |
---|---|
1 package luan.modules; | 1 package luan.modules; |
2 | 2 |
3 import java.io.IOException; | 3 import java.io.IOException; |
4 import java.util.Arrays; | 4 import java.util.Arrays; |
5 import java.util.Collections; | 5 import java.util.Collections; |
6 import java.util.List; | 6 import java.util.Set; |
7 import java.util.HashSet; | |
7 import luan.Luan; | 8 import luan.Luan; |
8 import luan.LuanState; | 9 import luan.LuanState; |
9 import luan.LuanTable; | 10 import luan.LuanTable; |
10 import luan.LuanFunction; | 11 import luan.LuanFunction; |
11 import luan.LuanJavaFunction; | 12 import luan.LuanJavaFunction; |
44 LuanTable loaded = loaded(luan); | 45 LuanTable loaded = loaded(luan); |
45 Object mod = loaded.get(modName); | 46 Object mod = loaded.get(modName); |
46 if( mod == null ) { | 47 if( mod == null ) { |
47 if( modName.startsWith("java:") ) { | 48 if( modName.startsWith("java:") ) { |
48 mod = JavaLuan.load(luan,modName.substring(5)); | 49 mod = JavaLuan.load(luan,modName.substring(5)); |
49 if( mod == null ) | 50 if( mod != null ) |
50 return null; | 51 loaded.put(modName,mod); |
51 } else { | 52 } else { |
52 String src = read(luan,modName+".luan"); | 53 String src = read(luan,modName+".luan"); |
53 if( src == null ) | 54 if( src == null ) |
54 return null; | 55 return null; |
55 LuanFunction loader = BasicLuan.load(luan,src,modName,null,false); | 56 LuanTable env = Luan.newTable(); |
56 mod = Luan.first( | 57 LuanFunction loader = BasicLuan.load(luan,src,modName,env,false); |
57 luan.call(loader,"<require \""+modName+"\">",new Object[]{modName}) | 58 loaded.put(modName,env); |
58 ); | 59 @SuppressWarnings("unchecked") |
59 } | 60 Set<String> loading = (Set<String>)luan.registry().get("Package.loading"); |
60 if( mod != null ) { | 61 boolean top = loading==null; |
61 loaded.put(modName,mod); | 62 if(top) { |
62 } else { | 63 loading = new HashSet<String>(); |
63 mod = loaded.get(modName); | 64 luan.registry().put("Package.loading",loading); |
64 if( mod==null ) { | 65 } |
65 mod = true; | 66 loading.add(modName); |
67 boolean ok = false; | |
68 try { | |
69 mod = Luan.first( | |
70 luan.call(loader,"<require \""+modName+"\">",new Object[]{modName}) | |
71 ); | |
72 ok = true; | |
73 } finally { | |
74 if( !ok ) { | |
75 if(top) { | |
76 for( String mn : loading ) { | |
77 loaded.put(mn,null); | |
78 } | |
79 } else { | |
80 loaded.put(modName,null); | |
81 } | |
82 } | |
83 if(top) | |
84 luan.registry().put("Package.loading",null); | |
85 } | |
86 if( mod != null ) | |
66 loaded.put(modName,mod); | 87 loaded.put(modName,mod); |
67 } | 88 else |
89 mod = env; | |
68 } | 90 } |
69 } | 91 } |
70 return mod; | 92 return mod; |
71 } | 93 } |
72 | 94 |