Mercurial Hosting > luan
comparison core/src/luan/modules/PackageLuan.java @ 200:9fb218211763
add Package.block();
add LuanException.getFullMessage();
git-svn-id: https://luan-java.googlecode.com/svn/trunk@201 21e917c8-12df-6dd8-5cb6-c86387c605b9
| author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
|---|---|
| date | Thu, 03 Jul 2014 22:22:16 +0000 |
| parents | be0275bda373 |
| children | 75750ceb45ee |
comparison
equal
deleted
inserted
replaced
| 199:8960c81eb4bc | 200:9fb218211763 |
|---|---|
| 25 module.put("preload",luan.preload()); | 25 module.put("preload",luan.preload()); |
| 26 module.put("path","?.luan;java:luan/modules/?.luan"); | 26 module.put("path","?.luan;java:luan/modules/?.luan"); |
| 27 module.put("jpath",jpath); | 27 module.put("jpath",jpath); |
| 28 try { | 28 try { |
| 29 module.put("require",requireFn); | 29 module.put("require",requireFn); |
| 30 add( module, "block_lib", LuanState.class, String.class ); | |
| 30 add( module, "load", LuanState.class, String.class ); | 31 add( module, "load", LuanState.class, String.class ); |
| 31 add( module, "load_lib", String.class ); | 32 add( module, "load_lib", LuanState.class, String.class ); |
| 32 add( module, "search_path", String.class, String.class ); | 33 add( module, "search_path", String.class, String.class ); |
| 33 add( module, "search", LuanState.class, String.class ); | 34 add( module, "search", LuanState.class, String.class ); |
| 34 } catch(NoSuchMethodException e) { | 35 } catch(NoSuchMethodException e) { |
| 35 throw new RuntimeException(e); | 36 throw new RuntimeException(e); |
| 36 } | 37 } |
| 147 | 148 |
| 148 public static final LuanFunction javaLoader = new LuanFunction() { | 149 public static final LuanFunction javaLoader = new LuanFunction() { |
| 149 @Override public Object call(LuanState luan,Object[] args) throws LuanException { | 150 @Override public Object call(LuanState luan,Object[] args) throws LuanException { |
| 150 try { | 151 try { |
| 151 String objName = (String)args[1]; | 152 String objName = (String)args[1]; |
| 152 LuanFunction fn = load_lib(objName); | 153 LuanFunction fn = load_lib(luan,objName); |
| 153 return fn.call(luan,args); | 154 return fn.call(luan,args); |
| 154 } catch(ClassNotFoundException e) { | 155 } catch(ClassNotFoundException e) { |
| 155 throw new RuntimeException(e); | 156 throw new RuntimeException(e); |
| 156 } catch(NoSuchFieldException e) { | 157 } catch(NoSuchFieldException e) { |
| 157 throw new RuntimeException(e); | 158 throw new RuntimeException(e); |
| 160 } | 161 } |
| 161 } | 162 } |
| 162 }; | 163 }; |
| 163 | 164 |
| 164 public static final LuanFunction javaSearcher = new LuanFunction() { | 165 public static final LuanFunction javaSearcher = new LuanFunction() { |
| 165 @Override public Object[] call(LuanState luan,Object[] args) { | 166 @Override public Object[] call(LuanState luan,Object[] args) |
| 167 throws LuanException | |
| 168 { | |
| 166 String modName = (String)args[0]; | 169 String modName = (String)args[0]; |
| 167 modName = modName.replace('/','.'); | 170 modName = modName.replace('/','.'); |
| 168 String path = (String)luan.get("Package.jpath"); | 171 String path = (String)luan.get("Package.jpath"); |
| 169 if( path==null ) | 172 if( path==null ) |
| 170 path = jpath; | 173 path = jpath; |
| 171 for( String s : path.split(";") ) { | 174 for( String s : path.split(";") ) { |
| 172 String objName = s.replaceAll("\\?",modName); | 175 String objName = s.replaceAll("\\?",modName); |
| 173 try { | 176 try { |
| 174 load_lib(objName); // throws exception if not found | 177 load_lib(luan,objName); // throws exception if not found |
| 175 return new Object[]{javaLoader,objName}; | 178 return new Object[]{javaLoader,objName}; |
| 176 } catch(ClassNotFoundException e) { | 179 } catch(ClassNotFoundException e) { |
| 177 } catch(NoSuchFieldException e) { | 180 } catch(NoSuchFieldException e) { |
| 178 } catch(IllegalAccessException e) { | 181 } catch(IllegalAccessException e) { |
| 179 } | 182 } |
| 181 return LuanFunction.NOTHING; | 184 return LuanFunction.NOTHING; |
| 182 } | 185 } |
| 183 }; | 186 }; |
| 184 | 187 |
| 185 | 188 |
| 186 public static LuanFunction load_lib(String path) | 189 public static void block_lib(LuanState luan,String path) { |
| 187 throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException | 190 luan.blocked.add(path); |
| 191 } | |
| 192 | |
| 193 public static LuanFunction load_lib(LuanState luan,String path) | |
| 194 throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, LuanException | |
| 188 { | 195 { |
| 196 if( luan.blocked.contains(path) ) | |
| 197 throw luan.exception(path+" is blocked"); | |
| 189 int i = path.lastIndexOf('.'); | 198 int i = path.lastIndexOf('.'); |
| 190 String clsPath = path.substring(0,i); | 199 String clsPath = path.substring(0,i); |
| 191 String fld = path.substring(i+1); | 200 String fld = path.substring(i+1); |
| 192 Class cls = Class.forName(clsPath); | 201 Class cls = Class.forName(clsPath); |
| 193 return (LuanFunction)cls.getField(fld).get(null); | 202 return (LuanFunction)cls.getField(fld).get(null); |
