comparison src/luan/modules/JavaLuan.java @ 1333:25746915a241

merge Luan and LuanState
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 12 Feb 2019 22:33:40 -0700
parents f41919741100
children e0cf0d108a77
comparison
equal deleted inserted replaced
1332:11b7e11f9ed5 1333:25746915a241
16 import java.util.Iterator; 16 import java.util.Iterator;
17 import java.util.Collections; 17 import java.util.Collections;
18 import java.util.Arrays; 18 import java.util.Arrays;
19 import java.util.Comparator; 19 import java.util.Comparator;
20 import luan.Luan; 20 import luan.Luan;
21 import luan.LuanState;
22 import luan.LuanTable; 21 import luan.LuanTable;
23 import luan.LuanException; 22 import luan.LuanException;
24 import luan.LuanFunction; 23 import luan.LuanFunction;
25 import luan.LuanJavaFunction; 24 import luan.LuanJavaFunction;
26 25
27 26
28 public final class JavaLuan { 27 public final class JavaLuan {
29 28
30 public static void java(LuanState luan) throws LuanException { 29 public static void java(Luan luan) throws LuanException {
31 Luan.checkSecurity(luan,"java"); 30 Luan.checkSecurity(luan,"java");
32 luan.peek().javaOk = true; 31 luan.peek().javaOk = true;
33 } 32 }
34 33
35 public static final LuanFunction javaFn; 34 public static final LuanFunction javaFn;
36 static { 35 static {
37 try { 36 try {
38 javaFn = new LuanJavaFunction(JavaLuan.class.getMethod("java",LuanState.class),null); 37 javaFn = new LuanJavaFunction(JavaLuan.class.getMethod("java",Luan.class),null);
39 } catch(NoSuchMethodException e) { 38 } catch(NoSuchMethodException e) {
40 throw new RuntimeException(e); 39 throw new RuntimeException(e);
41 } 40 }
42 } 41 }
43 42
44 private static void checkJava(LuanState luan) throws LuanException { 43 private static void checkJava(Luan luan) throws LuanException {
45 if( !luan.peek().javaOk ) 44 if( !luan.peek().javaOk )
46 throw new LuanException("Java isn't allowed"); 45 throw new LuanException("Java isn't allowed");
47 } 46 }
48 47
49 public static Object __index(LuanState luan,Object obj,Object key) throws LuanException { 48 public static Object __index(Luan luan,Object obj,Object key) throws LuanException {
50 checkJava(luan); 49 checkJava(luan);
51 Class cls; 50 Class cls;
52 if( obj instanceof Static ) { 51 if( obj instanceof Static ) {
53 Static st = (Static)obj; 52 Static st = (Static)obj;
54 cls = st.cls; 53 cls = st.cls;
134 } catch(IllegalAccessException e) { 133 } catch(IllegalAccessException e) {
135 throw new RuntimeException(e); 134 throw new RuntimeException(e);
136 } 135 }
137 } 136 }
138 137
139 public static void __new_index(LuanState luan,Object obj,Object key,Object value) throws LuanException { 138 public static void __new_index(Luan luan,Object obj,Object key,Object value) throws LuanException {
140 checkJava(luan); 139 checkJava(luan);
141 Class cls; 140 Class cls;
142 if( obj instanceof Static ) { 141 if( obj instanceof Static ) {
143 Static st = (Static)obj; 142 Static st = (Static)obj;
144 cls = st.cls; 143 cls = st.cls;
308 307
309 @Override public boolean isSynthetic() { 308 @Override public boolean isSynthetic() {
310 return cls.isSynthetic(); 309 return cls.isSynthetic();
311 } 310 }
312 311
313 public Object luan_proxy(final LuanState luan,final LuanTable t) throws LuanException { 312 public Object luan_proxy(final Luan luan,final LuanTable t) throws LuanException {
314 return Proxy.newProxyInstance( 313 return Proxy.newProxyInstance(
315 cls.getClassLoader(), 314 cls.getClassLoader(),
316 new Class[]{cls}, 315 new Class[]{cls},
317 new InvocationHandler() { 316 new InvocationHandler() {
318 public Object invoke(Object proxy,Method method, Object[] args) 317 public Object invoke(Object proxy,Method method, Object[] args)
332 } 331 }
333 } 332 }
334 private static final Method luan_proxyMethod; 333 private static final Method luan_proxyMethod;
335 static { 334 static {
336 try { 335 try {
337 luan_proxyMethod = Static.class.getMethod("luan_proxy",LuanState.class,LuanTable.class); 336 luan_proxyMethod = Static.class.getMethod("luan_proxy",Luan.class,LuanTable.class);
338 luan_proxyMethod.setAccessible(true); 337 luan_proxyMethod.setAccessible(true);
339 } catch(NoSuchMethodException e) { 338 } catch(NoSuchMethodException e) {
340 throw new RuntimeException(e); 339 throw new RuntimeException(e);
341 } 340 }
342 } 341 }
343 342
344 public static Static load(LuanState luan,String name) throws LuanException { 343 public static Static load(Luan luan,String name) throws LuanException {
345 checkJava(luan); 344 checkJava(luan);
346 Class cls; 345 Class cls;
347 try { 346 try {
348 cls = Class.forName(name); 347 cls = Class.forName(name);
349 } catch(ClassNotFoundException e) { 348 } catch(ClassNotFoundException e) {
381 } 380 }
382 } 381 }
383 Collections.sort(varArgs,varArgsSorter); 382 Collections.sort(varArgs,varArgsSorter);
384 } 383 }
385 384
386 @Override public Object call(LuanState luan,Object[] args) throws LuanException { 385 @Override public Object call(Luan luan,Object[] args) throws LuanException {
387 List<LuanJavaFunction> list = fnMap.get(args.length); 386 List<LuanJavaFunction> list = fnMap.get(args.length);
388 if( list != null ) { 387 if( list != null ) {
389 for( LuanJavaFunction fn : list ) { 388 for( LuanJavaFunction fn : list ) {
390 try { 389 try {
391 return fn.rawCall(luan,args); 390 return fn.rawCall(luan,args);
428 427
429 AssertClass(Class cls) { 428 AssertClass(Class cls) {
430 this.cls = cls; 429 this.cls = cls;
431 } 430 }
432 431
433 public Object assertClass(LuanState luan,Object v) throws LuanException { 432 public Object assertClass(Luan luan,Object v) throws LuanException {
434 if( !cls.isInstance(v) ) { 433 if( !cls.isInstance(v) ) {
435 String got = v.getClass().getSimpleName(); 434 String got = v.getClass().getSimpleName();
436 String expected = cls.getSimpleName(); 435 String expected = cls.getSimpleName();
437 throw new LuanException(luan,"bad argument #1 ("+expected+" expected, got "+got+")"); 436 throw new LuanException(luan,"bad argument #1 ("+expected+" expected, got "+got+")");
438 } 437 }
440 } 439 }
441 } 440 }
442 private static final Method assertClass; 441 private static final Method assertClass;
443 static { 442 static {
444 try { 443 try {
445 assertClass = AssertClass.class.getMethod("assertClass",LuanState.class,Object.class); 444 assertClass = AssertClass.class.getMethod("assertClass",Luan.class,Object.class);
446 assertClass.setAccessible(true); 445 assertClass.setAccessible(true);
447 } catch(NoSuchMethodException e) { 446 } catch(NoSuchMethodException e) {
448 throw new RuntimeException(e); 447 throw new RuntimeException(e);
449 } 448 }
450 } 449 }
451 450
452 451
453 public static Object proxy(final LuanState luan,Static st,final LuanTable t,final Object base) throws LuanException { 452 public static Object proxy(final Luan luan,Static st,final LuanTable t,final Object base) throws LuanException {
454 return Proxy.newProxyInstance( 453 return Proxy.newProxyInstance(
455 st.cls.getClassLoader(), 454 st.cls.getClassLoader(),
456 new Class[]{st.cls}, 455 new Class[]{st.cls},
457 new InvocationHandler() { 456 new InvocationHandler() {
458 public Object invoke(Object proxy,Method method, Object[] args) 457 public Object invoke(Object proxy,Method method, Object[] args)