comparison 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
comparison
equal deleted inserted replaced
107:dbf459397217 108:3c404a296995
19 import luan.LuanState; 19 import luan.LuanState;
20 import luan.LuanTable; 20 import luan.LuanTable;
21 import luan.MetatableGetter; 21 import luan.MetatableGetter;
22 import luan.LuanException; 22 import luan.LuanException;
23 import luan.LuanFunction; 23 import luan.LuanFunction;
24 import luan.LuanLoader;
25 import luan.LuanJavaFunction; 24 import luan.LuanJavaFunction;
26 import luan.LuanElement; 25 import luan.LuanElement;
27 26
28 27
29 public final class JavaLib { 28 public final class JavaLib {
30 29
31 public static final String NAME = "Java"; 30 public static final String NAME = "Java";
32 31
33 public static final LuanLoader LOADER = new LuanLoader() { 32 public static final LuanFunction LOADER = new LuanFunction() {
34 @Override protected void load(LuanState luan) { 33 @Override public Object[] call(LuanState luan,Object[] args) {
35 luan.addMetatableGetter(mg); 34 luan.addMetatableGetter(mg);
36 LuanTable module = new LuanTable(); 35 LuanTable module = new LuanTable();
37 LuanTable global = new LuanTable(); 36 LuanTable global = luan.global();
38 module.put( LuanState._G, global );
39 try { 37 try {
40 global.put( "import", new LuanJavaFunction(JavaLib.class.getMethod("importClass",LuanState.class,String.class),null) );
41 module.put( "class", new LuanJavaFunction(JavaLib.class.getMethod("getClass",LuanState.class,String.class),null) ); 38 module.put( "class", new LuanJavaFunction(JavaLib.class.getMethod("getClass",LuanState.class,String.class),null) );
42 add( module, "proxy", LuanState.class, Static.class, LuanTable.class, Object.class ); 39 add( module, "proxy", LuanState.class, Static.class, LuanTable.class, Object.class );
43 } catch(NoSuchMethodException e) { 40 } catch(NoSuchMethodException e) {
44 throw new RuntimeException(e); 41 throw new RuntimeException(e);
45 } 42 }
46 luan.loaded().put(NAME,module); 43 luan.searchers().add(javaSearcher);
44 return new Object[]{module};
47 } 45 }
48 }; 46 };
47
48 public static final LuanFunction javaSearcher = new LuanFunction() {
49 @Override public Object[] call(LuanState luan,Object[] args) throws LuanException {
50 String modName = (String)args[0];
51 final Static s = JavaLib.getClass(luan,modName);
52 if( s==null )
53 return LuanFunction.EMPTY;
54 LuanFunction loader = new LuanFunction() {
55 @Override public Object[] call(LuanState luan,Object[] args) {
56 return new Object[]{s};
57 }
58 };
59 return new Object[]{loader};
60 }
61 };
62
63 private static void add(LuanTable t,String method,Class<?>... parameterTypes) {
64 try {
65 t.put( method, new LuanJavaFunction(JavaLib.class.getMethod(method,parameterTypes),null) );
66 } catch(NoSuchMethodException e) {
67 throw new RuntimeException(e);
68 }
69 }
49 70
50 private static final LuanTable mt = new LuanTable(); 71 private static final LuanTable mt = new LuanTable();
51 static { 72 static {
52 add( mt, "__index", LuanState.class, Object.class, Object.class ); 73 add( mt, "__index", LuanState.class, Object.class, Object.class );
53 add( mt, "__newindex", LuanState.class, Object.class, Object.class, Object.class ); 74 add( mt, "__newindex", LuanState.class, Object.class, Object.class, Object.class );
54 }
55
56 private static void add(LuanTable t,String method,Class<?>... parameterTypes) {
57 try {
58 t.put( method, new LuanJavaFunction(JavaLib.class.getMethod(method,parameterTypes),null) );
59 } catch(NoSuchMethodException e) {
60 throw new RuntimeException(e);
61 }
62 } 75 }
63 76
64 private static final MetatableGetter mg = new MetatableGetter() { 77 private static final MetatableGetter mg = new MetatableGetter() {
65 public LuanTable getMetatable(Object obj) { 78 public LuanTable getMetatable(Object obj) {
66 if( obj==null ) 79 if( obj==null )
328 cls = Class.forName(name); 341 cls = Class.forName(name);
329 } catch(ClassNotFoundException e) { 342 } catch(ClassNotFoundException e) {
330 try { 343 try {
331 cls = Thread.currentThread().getContextClassLoader().loadClass(name); 344 cls = Thread.currentThread().getContextClassLoader().loadClass(name);
332 } catch(ClassNotFoundException e2) { 345 } catch(ClassNotFoundException e2) {
333 throw luan.JAVA.exception(e); 346 return null;
334 } 347 }
335 } 348 }
336 return new Static(cls); 349 return new Static(cls);
337 } 350 }
338 351 /*
339 public static void importClass(LuanState luan,String name) throws LuanException { 352 public static void importClass(LuanState luan,String name) throws LuanException {
340 luan.currentEnvironment().put( name.substring(name.lastIndexOf('.')+1), getClass(luan,name) ); 353 luan.currentEnvironment().put( name.substring(name.lastIndexOf('.')+1), getClass(luan,name) );
341 } 354 }
342 355 */
343 static class AmbiguousJavaFunction extends LuanFunction { 356 static class AmbiguousJavaFunction extends LuanFunction {
344 private final Map<Integer,List<LuanJavaFunction>> fnMap = new HashMap<Integer,List<LuanJavaFunction>>(); 357 private final Map<Integer,List<LuanJavaFunction>> fnMap = new HashMap<Integer,List<LuanJavaFunction>>();
345 358
346 AmbiguousJavaFunction(List<LuanJavaFunction> fns) { 359 AmbiguousJavaFunction(List<LuanJavaFunction> fns) {
347 for( LuanJavaFunction fn : fns ) { 360 for( LuanJavaFunction fn : fns ) {