comparison src/luan/modules/JavaLuan.java @ 1563:8fbcc4747091

remove LuanFunction.luan
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 09 Nov 2020 01:37:57 -0700
parents b89212fd04b5
children c922446f53aa
comparison
equal deleted inserted replaced
1562:b89212fd04b5 1563:8fbcc4747091
50 return cls; 50 return cls;
51 } else if( "new".equals(name) ) { 51 } else if( "new".equals(name) ) {
52 Constructor[] constructors = cls.getConstructors(); 52 Constructor[] constructors = cls.getConstructors();
53 if( constructors.length > 0 ) { 53 if( constructors.length > 0 ) {
54 if( constructors.length==1 ) { 54 if( constructors.length==1 ) {
55 return new LuanJavaFunction(luan,constructors[0],null); 55 return new LuanJavaFunction(constructors[0],null);
56 } else { 56 } else {
57 List<LuanJavaFunction> fns = new ArrayList<LuanJavaFunction>(); 57 List<LuanJavaFunction> fns = new ArrayList<LuanJavaFunction>();
58 for( Constructor constructor : constructors ) { 58 for( Constructor constructor : constructors ) {
59 fns.add(new LuanJavaFunction(luan,constructor,null)); 59 fns.add(new LuanJavaFunction(constructor,null));
60 } 60 }
61 return new AmbiguousJavaFunction(fns); 61 return new AmbiguousJavaFunction(fns);
62 } 62 }
63 } 63 }
64 /* 64 /*
65 } else if( "assert".equals(name) ) { 65 } else if( "assert".equals(name) ) {
66 return new LuanJavaFunction(assertClass,new AssertClass(cls)); 66 return new LuanJavaFunction(assertClass,new AssertClass(cls));
67 */ 67 */
68 } else if( "luan_proxy".equals(name) ) { 68 } else if( "luan_proxy".equals(name) ) {
69 return new LuanJavaFunction(luan,luan_proxyMethod,st); 69 return new LuanJavaFunction(luan_proxyMethod,st);
70 } else { 70 } else {
71 List<Member> members = getStaticMembers(cls,name); 71 List<Member> members = getStaticMembers(cls,name);
72 if( !members.isEmpty() ) { 72 if( !members.isEmpty() ) {
73 return member(luan,null,members); 73 return member(null,members);
74 } 74 }
75 } 75 }
76 } 76 }
77 } else { 77 } else {
78 cls = obj.getClass(); 78 cls = obj.getClass();
86 } 86 }
87 // throw new LuanException(luan,"invalid member '"+key+"' for java array: "+obj); 87 // throw new LuanException(luan,"invalid member '"+key+"' for java array: "+obj);
88 } else if( key instanceof String ) { 88 } else if( key instanceof String ) {
89 String name = (String)key; 89 String name = (String)key;
90 if( "instanceof".equals(name) ) { 90 if( "instanceof".equals(name) ) {
91 return new LuanJavaFunction(luan,instanceOf,new InstanceOf(obj)); 91 return new LuanJavaFunction(instanceOf,new InstanceOf(obj));
92 } else { 92 } else {
93 List<Member> members = getMembers(cls,name); 93 List<Member> members = getMembers(cls,name);
94 if( !members.isEmpty() ) { 94 if( !members.isEmpty() ) {
95 return member(luan,obj,members); 95 return member(obj,members);
96 } 96 }
97 } 97 }
98 } 98 }
99 } 99 }
100 //System.out.println("invalid member '"+key+"' for java object: "+obj); 100 //System.out.println("invalid member '"+key+"' for java object: "+obj);
101 throw new LuanException( "invalid index '"+key+"' for java "+cls ); 101 throw new LuanException( "invalid index '"+key+"' for java "+cls );
102 } 102 }
103 103
104 private static Object member(Luan luan,Object obj,List<Member> members) throws LuanException { 104 private static Object member(Object obj,List<Member> members) throws LuanException {
105 try { 105 try {
106 if( members.size()==1 ) { 106 if( members.size()==1 ) {
107 Member member = members.get(0); 107 Member member = members.get(0);
108 if( member instanceof Static ) { 108 if( member instanceof Static ) {
109 return member; 109 return member;
111 Field field = (Field)member; 111 Field field = (Field)member;
112 Object rtn = field.get(obj); 112 Object rtn = field.get(obj);
113 return rtn instanceof Object[] ? Arrays.asList((Object[])rtn) : rtn; 113 return rtn instanceof Object[] ? Arrays.asList((Object[])rtn) : rtn;
114 } else { 114 } else {
115 Method method = (Method)member; 115 Method method = (Method)member;
116 return new LuanJavaFunction(luan,method,obj); 116 return new LuanJavaFunction(method,obj);
117 } 117 }
118 } else { 118 } else {
119 List<LuanJavaFunction> fns = new ArrayList<LuanJavaFunction>(); 119 List<LuanJavaFunction> fns = new ArrayList<LuanJavaFunction>();
120 for( Member member : members ) { 120 for( Member member : members ) {
121 Method method = (Method)member; 121 Method method = (Method)member;
122 fns.add(new LuanJavaFunction(luan,method,obj)); 122 fns.add(new LuanJavaFunction(method,obj));
123 } 123 }
124 return new AmbiguousJavaFunction(fns); 124 return new AmbiguousJavaFunction(fns);
125 } 125 }
126 } catch(IllegalAccessException e) { 126 } catch(IllegalAccessException e) {
127 throw new RuntimeException(e); 127 throw new RuntimeException(e);
300 300
301 @Override public boolean isSynthetic() { 301 @Override public boolean isSynthetic() {
302 return cls.isSynthetic(); 302 return cls.isSynthetic();
303 } 303 }
304 304
305 public Object luan_proxy(Luan luan,final LuanTable t) throws LuanException { 305 public Object luan_proxy(final Luan luan,final LuanTable t) throws LuanException {
306 return Proxy.newProxyInstance( 306 return Proxy.newProxyInstance(
307 cls.getClassLoader(), 307 cls.getClassLoader(),
308 new Class[]{cls}, 308 new Class[]{cls},
309 new InvocationHandler() { 309 new InvocationHandler() {
310 public Object invoke(Object proxy,Method method, Object[] args) 310 public Object invoke(Object proxy,Method method, Object[] args)
315 String name = method.getName(); 315 String name = method.getName();
316 Object fnObj = t.get(luan,name); 316 Object fnObj = t.get(luan,name);
317 if( fnObj == null ) 317 if( fnObj == null )
318 throw new NullPointerException("luan_proxy couldn't find method '"+name+"'"); 318 throw new NullPointerException("luan_proxy couldn't find method '"+name+"'");
319 LuanFunction fn = Luan.checkFunction(fnObj); 319 LuanFunction fn = Luan.checkFunction(fnObj);
320 return Luan.first(fn.call(args)); 320 return Luan.first(fn.call(luan,args));
321 } 321 }
322 } 322 }
323 ); 323 );
324 } 324 }
325 } 325 }
357 private static final class AmbiguousJavaFunction extends LuanFunction { 357 private static final class AmbiguousJavaFunction extends LuanFunction {
358 private Map<Integer,List<LuanJavaFunction>> fnMap = new HashMap<Integer,List<LuanJavaFunction>>(); 358 private Map<Integer,List<LuanJavaFunction>> fnMap = new HashMap<Integer,List<LuanJavaFunction>>();
359 private List<LuanJavaFunction> varArgs = new ArrayList<LuanJavaFunction>(); 359 private List<LuanJavaFunction> varArgs = new ArrayList<LuanJavaFunction>();
360 360
361 AmbiguousJavaFunction(List<LuanJavaFunction> fns) { 361 AmbiguousJavaFunction(List<LuanJavaFunction> fns) {
362 super(true);
363 for( LuanJavaFunction fn : fns ) { 362 for( LuanJavaFunction fn : fns ) {
364 if( fn.isVarArgs() ) { 363 if( fn.isVarArgs() ) {
365 varArgs.add(fn); 364 varArgs.add(fn);
366 } else { 365 } else {
367 Integer n = fn.getParameterCount(); 366 Integer n = fn.getParameterCount();
374 } 373 }
375 } 374 }
376 Collections.sort(varArgs,varArgsSorter); 375 Collections.sort(varArgs,varArgsSorter);
377 } 376 }
378 377
379 @Override protected void completeClone(LuanFunction dc,LuanCloner cloner) { 378 @Override public Object call(Luan luan,Object[] args) throws LuanException {
380 AmbiguousJavaFunction clone = (AmbiguousJavaFunction)dc;
381 clone.fnMap = (Map)cloner.clone(fnMap);
382 clone.varArgs = (List)cloner.clone(varArgs);
383 // no call to super?
384 }
385
386 @Override public void makeImmutable(LuanImmutabler immutabler) throws LuanException {
387 immutabler.makeImmutable(fnMap);
388 immutabler.makeImmutable(varArgs);
389 super.makeImmutable(immutabler);
390 }
391
392 @Override public Object call(Object[] args) throws LuanException {
393 List<LuanJavaFunction> list = fnMap.get(args.length); 379 List<LuanJavaFunction> list = fnMap.get(args.length);
394 if( list != null ) { 380 if( list != null ) {
395 for( LuanJavaFunction fn : list ) { 381 for( LuanJavaFunction fn : list ) {
396 try { 382 try {
397 return fn.rawCall(args); 383 return fn.rawCall(luan,args);
398 } catch(IllegalArgumentException e) {} 384 } catch(IllegalArgumentException e) {}
399 } 385 }
400 } 386 }
401 for( LuanJavaFunction fn : varArgs ) { 387 for( LuanJavaFunction fn : varArgs ) {
402 try { 388 try {
403 return fn.rawCall(args); 389 return fn.rawCall(luan,args);
404 } catch(IllegalArgumentException e) {} 390 } catch(IllegalArgumentException e) {}
405 } 391 }
406 throw new LuanException("no method matched args: "+Arrays.asList(args)); 392 throw new LuanException("no method matched args: "+Arrays.asList(args));
407 } 393 }
408 } 394 }