Mercurial Hosting > luan
diff src/luan/lib/JavaLib.java @ 108:3c404a296995
make Package module more standard;
return _ENV by default;
add "import" statement;
git-svn-id: https://luan-java.googlecode.com/svn/trunk@109 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Fri, 23 May 2014 03:21:54 +0000 |
parents | 90b918cbf888 |
children | f5af13062b10 |
line wrap: on
line diff
--- a/src/luan/lib/JavaLib.java Mon May 19 09:17:57 2014 +0000 +++ b/src/luan/lib/JavaLib.java Fri May 23 03:21:54 2014 +0000 @@ -21,7 +21,6 @@ import luan.MetatableGetter; import luan.LuanException; import luan.LuanFunction; -import luan.LuanLoader; import luan.LuanJavaFunction; import luan.LuanElement; @@ -30,28 +29,36 @@ public static final String NAME = "Java"; - public static final LuanLoader LOADER = new LuanLoader() { - @Override protected void load(LuanState luan) { + public static final LuanFunction LOADER = new LuanFunction() { + @Override public Object[] call(LuanState luan,Object[] args) { luan.addMetatableGetter(mg); LuanTable module = new LuanTable(); - LuanTable global = new LuanTable(); - module.put( LuanState._G, global ); + LuanTable global = luan.global(); try { - global.put( "import", new LuanJavaFunction(JavaLib.class.getMethod("importClass",LuanState.class,String.class),null) ); module.put( "class", new LuanJavaFunction(JavaLib.class.getMethod("getClass",LuanState.class,String.class),null) ); add( module, "proxy", LuanState.class, Static.class, LuanTable.class, Object.class ); } catch(NoSuchMethodException e) { throw new RuntimeException(e); } - luan.loaded().put(NAME,module); + luan.searchers().add(javaSearcher); + return new Object[]{module}; } }; - private static final LuanTable mt = new LuanTable(); - static { - add( mt, "__index", LuanState.class, Object.class, Object.class ); - add( mt, "__newindex", LuanState.class, Object.class, Object.class, Object.class ); - } + public static final LuanFunction javaSearcher = new LuanFunction() { + @Override public Object[] call(LuanState luan,Object[] args) throws LuanException { + String modName = (String)args[0]; + final Static s = JavaLib.getClass(luan,modName); + if( s==null ) + return LuanFunction.EMPTY; + LuanFunction loader = new LuanFunction() { + @Override public Object[] call(LuanState luan,Object[] args) { + return new Object[]{s}; + } + }; + return new Object[]{loader}; + } + }; private static void add(LuanTable t,String method,Class<?>... parameterTypes) { try { @@ -61,6 +68,12 @@ } } + private static final LuanTable mt = new LuanTable(); + static { + add( mt, "__index", LuanState.class, Object.class, Object.class ); + add( mt, "__newindex", LuanState.class, Object.class, Object.class, Object.class ); + } + private static final MetatableGetter mg = new MetatableGetter() { public LuanTable getMetatable(Object obj) { if( obj==null ) @@ -330,16 +343,16 @@ try { cls = Thread.currentThread().getContextClassLoader().loadClass(name); } catch(ClassNotFoundException e2) { - throw luan.JAVA.exception(e); + return null; } } return new Static(cls); } - +/* public static void importClass(LuanState luan,String name) throws LuanException { luan.currentEnvironment().put( name.substring(name.lastIndexOf('.')+1), getClass(luan,name) ); } - +*/ static class AmbiguousJavaFunction extends LuanFunction { private final Map<Integer,List<LuanJavaFunction>> fnMap = new HashMap<Integer,List<LuanJavaFunction>>();