Mercurial Hosting > luan
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 ) { |