Mercurial Hosting > luan
comparison src/luan/LuanJavaFunction.java @ 1563:8fbcc4747091
remove LuanFunction.luan
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 09 Nov 2020 01:37:57 -0700 |
parents | 71f067287642 |
children | 8dd8c556c449 |
comparison
equal
deleted
inserted
replaced
1562:b89212fd04b5 | 1563:8fbcc4747091 |
---|---|
19 private final RtnConverter rtnConverter; | 19 private final RtnConverter rtnConverter; |
20 private final boolean takesLuan; | 20 private final boolean takesLuan; |
21 private final ArgConverter[] argConverters; | 21 private final ArgConverter[] argConverters; |
22 private final Class varArgCls; | 22 private final Class varArgCls; |
23 | 23 |
24 public LuanJavaFunction(Luan luan,Method method,Object obj) { | 24 public LuanJavaFunction(Method method,Object obj) { |
25 this( luan, JavaMethod.of(method), obj ); | 25 this( JavaMethod.of(method), obj ); |
26 } | 26 } |
27 | 27 |
28 public LuanJavaFunction(Luan luan,Constructor constr,Object obj) { | 28 public LuanJavaFunction(Constructor constr,Object obj) { |
29 this( luan, JavaMethod.of(constr), obj ); | 29 this( JavaMethod.of(constr), obj ); |
30 } | 30 } |
31 | 31 |
32 private LuanJavaFunction(Luan luan,JavaMethod method,Object obj) { | 32 private LuanJavaFunction(JavaMethod method,Object obj) { |
33 super(luan); | |
34 this.method = method; | 33 this.method = method; |
35 this.obj = obj; | 34 this.obj = obj; |
36 this.rtnConverter = getRtnConverter(method); | 35 this.rtnConverter = getRtnConverter(method); |
37 this.takesLuan = takesLuan(method); | 36 this.takesLuan = takesLuan(method); |
38 this.argConverters = getArgConverters(takesLuan,method); | 37 this.argConverters = getArgConverters(takesLuan,method); |
40 Class[] paramTypes = method.getParameterTypes(); | 39 Class[] paramTypes = method.getParameterTypes(); |
41 this.varArgCls = paramTypes[paramTypes.length-1].getComponentType(); | 40 this.varArgCls = paramTypes[paramTypes.length-1].getComponentType(); |
42 } else { | 41 } else { |
43 this.varArgCls = null; | 42 this.varArgCls = null; |
44 } | 43 } |
45 if( !takesLuan ) | |
46 dontClone(); | |
47 } | 44 } |
48 | 45 |
49 @Override public String toString() { | 46 @Override public String toString() { |
50 return "java-function: " + method; | 47 return "java-function: " + method; |
51 } | 48 } |
56 | 53 |
57 public boolean isVarArgs() { | 54 public boolean isVarArgs() { |
58 return method.isVarArgs(); | 55 return method.isVarArgs(); |
59 } | 56 } |
60 | 57 |
61 @Override public Object call(Object[] args) throws LuanException { | 58 @Override public Object call(Luan luan,Object[] args) throws LuanException { |
62 try { | 59 try { |
63 args = fixArgs(args); | 60 args = fixArgs(luan,args); |
64 return doCall(args); | 61 return doCall(args); |
65 } catch(IllegalArgumentException e) { | 62 } catch(IllegalArgumentException e) { |
66 checkArgs(args); | 63 checkArgs(args); |
67 throw e; | 64 throw e; |
68 } | 65 } |
69 } | 66 } |
70 | 67 |
71 public Object rawCall(Object[] args) throws LuanException { | 68 public Object rawCall(Luan luan,Object[] args) throws LuanException { |
72 args = fixArgs(args); | 69 args = fixArgs(luan,args); |
73 return doCall(args); | 70 return doCall(args); |
74 } | 71 } |
75 | 72 |
76 private Object doCall(Object[] args) throws LuanException { | 73 private Object doCall(Object[] args) throws LuanException { |
77 Object rtn; | 74 Object rtn; |
154 if( type.equals("LuanJavaFunction") ) | 151 if( type.equals("LuanJavaFunction") ) |
155 return "function"; | 152 return "function"; |
156 return type; | 153 return type; |
157 } | 154 } |
158 | 155 |
159 private Object[] fixArgs(Object[] args) throws LuanException { | 156 private Object[] fixArgs(Luan luan,Object[] args) throws LuanException { |
160 int n = argConverters.length; | 157 int n = argConverters.length; |
161 Object[] rtn; | 158 Object[] rtn; |
162 int start = 0; | 159 int start = 0; |
163 if( !takesLuan && varArgCls==null && args.length == n ) { | 160 if( !takesLuan && varArgCls==null && args.length == n ) { |
164 rtn = args; | 161 rtn = args; |
165 } else { | 162 } else { |
166 if( takesLuan ) | 163 if( takesLuan ) |
167 n++; | 164 n++; |
168 rtn = new Object[n]; | 165 rtn = new Object[n]; |
169 if( takesLuan ) { | 166 if( takesLuan ) { |
170 rtn[start++] = luan(); | 167 rtn[start++] = luan; |
171 } | 168 } |
172 n = argConverters.length; | 169 n = argConverters.length; |
173 if( varArgCls == null ) { | 170 if( varArgCls == null ) { |
174 for( int i=n; i<args.length; i++ ) { | 171 for( int i=n; i<args.length; i++ ) { |
175 if( args[i] != null ) | 172 if( args[i] != null ) |