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