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 )