Mercurial Hosting > luan
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 } |