Changeset 4690
- Timestamp:
- 11/11/03 09:44:08 (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/j/src/org/armedbear/lisp/Java.java
r4689 r4690 3 3 * 4 4 * Copyright (C) 2002-2003 Peter Graves 5 * $Id: Java.java,v 1.2 1 2003-11-10 09:40:19asimon Exp $5 * $Id: Java.java,v 1.22 2003-11-11 09:44:08 asimon Exp $ 6 6 * 7 7 * This program is free software; you can redistribute it and/or … … 81 81 if (args.length < 2 || args.length > 4) 82 82 throw new ConditionThrowable(new WrongNumberOfArgumentsException(this)); 83 84 85 86 83 String fieldName, className = null; 84 Class c; 85 Field f; 86 Object instance = null; 87 87 try { 88 88 if (args[1] instanceof LispString) { 89 89 // Cases 1-5. 90 90 fieldName = LispString.getValue(args[1]); 91 92 93 94 95 96 97 98 91 if (args[0] instanceof LispString) { 92 className = LispString.getValue(args[0]); 93 c = Class.forName(className); 94 } 95 else { 96 c = (Class)JavaObject.getObject(args[0]); 97 className = c.getName(); 98 } 99 99 } else { 100 100 // Cases 6 and 7. … … 120 120 } else { 121 121 // Case 3. 122 123 122 f.set(null,args[2].javaInstance()); 123 return args[2]; 124 124 } 125 125 } else { … … 162 162 163 163 // ### jconstructor 164 // jconstructor class- name &rest parameter-class-names164 // jconstructor class-ref &rest parameter-class-refs 165 165 private static final Primitive JCONSTRUCTOR = 166 166 new Primitive("jconstructor", PACKAGE_JAVA) … … 170 170 if (args.length < 1) 171 171 throw new ConditionThrowable(new WrongNumberOfArgumentsException(this)); 172 String className = LispString.getValue(args[0]); 173 try { 174 final Class c = Class.forName(className); 175 Class[] parameterTypes = new Class[args.length-1]; 176 for (int i = 1; i < args.length; i++) { 177 className = LispString.getValue(args[i]); 178 parameterTypes[i-1] = forName(className); 179 } 180 return new JavaObject(c.getConstructor(parameterTypes)); 172 try { 173 final Class c = forClassRef(args[0]); 174 int argCount = 0; 175 if (args.length == 2 && args[1] instanceof Fixnum) { 176 argCount = Fixnum.getValue(args[1]); 177 } else { 178 Class[] parameterTypes = new Class[args.length-1]; 179 for (int i = 1; i < args.length; i++) { 180 parameterTypes[i-1] = forClassRef(args[i]); 181 } 182 return new JavaObject(c.getConstructor(parameterTypes)); 183 } 184 // Parameter types not explicitly specified. 185 Constructor[] constructors = c.getConstructors(); 186 for (int i = 0; i < constructors.length; i++) { 187 Constructor constructor = constructors[i]; 188 if (constructor.getParameterTypes().length == argCount) 189 return new JavaObject(constructor); 190 } 191 throw new NoSuchMethodException(); 181 192 } 182 193 catch (ClassNotFoundException e) { 183 throw new ConditionThrowable(new LispError("class not found: " + className));194 throw new ConditionThrowable(new LispError("class not found: " + e.getMessage())); 184 195 } 185 196 catch (NoSuchMethodException e) { 186 197 throw new ConditionThrowable(new LispError("no such constructor")); 187 198 } 199 catch (ConditionThrowable e) { 200 throw e; 201 } 188 202 catch (Throwable t) { 189 203 throw new ConditionThrowable(new LispError(getMessage(t))); … … 193 207 194 208 // ### jmethod 195 // jmethod class-ref name &rest parameter-class- names209 // jmethod class-ref name &rest parameter-class-refs 196 210 private static final Primitive JMETHOD = new Primitive("jmethod", PACKAGE_JAVA) 197 211 { … … 200 214 if (args.length < 2) 201 215 throw new ConditionThrowable(new WrongNumberOfArgumentsException(this)); 202 String className = LispString.getValue(args[0]);203 216 String methodName = LispString.getValue(args[1]); 204 217 try { 205 final Class c = Class.forName(className);218 final Class c = forClassRef(args[0]); 206 219 int argCount = 0; 207 220 if (args.length == 3 && args[2] instanceof Fixnum) { 208 221 argCount = Fixnum.getValue(args[2]); 209 } else if (args.length > 2) {222 } else { 210 223 Class[] parameterTypes = new Class[args.length-2]; 211 224 for (int i = 2; i < args.length; i++) { 212 className = LispString.getValue(args[i]); 213 parameterTypes[i-2] = forName(className); 225 parameterTypes[i-2] = forClassRef(args[i]); 214 226 } 215 227 return new JavaObject(c.getMethod(methodName, … … 224 236 return new JavaObject(method); 225 237 } 226 throw new ConditionThrowable(new LispError("no such method"));238 throw new NoSuchMethodException(); 227 239 } 228 240 catch (ClassNotFoundException e) { 229 throw new ConditionThrowable(new LispError("class not found: " + className));241 throw new ConditionThrowable(new LispError("class not found: " + e.getMessage())); 230 242 } 231 243 catch (NoSuchMethodException e) { 232 throw new ConditionThrowable(new LispError("no such method")); 244 throw new ConditionThrowable(new LispError("no such method: " + methodName)); 245 } 246 catch (ConditionThrowable e) { 247 throw e; 233 248 } 234 249 catch (Throwable t) { … … 282 297 Object[] methodArgs = new Object[args.length-2]; 283 298 for (int i = 2; i < args.length; i++) { 284 299 methodArgs[i-2] = args[i].javaInstance(); 285 300 } 286 301 Object result = m.invoke(null, methodArgs); … … 306 321 Object[] initargs = new Object[args.length-1]; 307 322 for (int i = 1; i < args.length; i++) { 308 323 initargs[i-1] = args[i].javaInstance(); 309 324 } 310 325 return new JavaObject(constructor.newInstance(initargs)); … … 345 360 346 361 // Supports Java primitive types too. 347 private static Class forName(String className) throws ClassNotFoundException 348 { 349 if (className.equals("boolean")) 350 return Boolean.TYPE; 351 if (className.equals("byte")) 352 return Byte.TYPE; 353 if (className.equals("char")) 354 return Character.TYPE; 355 if (className.equals("short")) 356 return Short.TYPE; 357 if (className.equals("int")) 358 return Integer.TYPE; 359 if (className.equals("long")) 360 return Long.TYPE; 361 if (className.equals("float")) 362 return Float.TYPE; 363 if (className.equals("double")) 364 return Double.TYPE; 365 // Not a primitive Java type. 366 return Class.forName(className); 362 private static Class forClassRef(LispObject classRef) throws ClassNotFoundException, ConditionThrowable 363 { 364 if (classRef instanceof LispString) { 365 String className = LispString.getValue(classRef); 366 if (className.equals("boolean")) 367 return Boolean.TYPE; 368 if (className.equals("byte")) 369 return Byte.TYPE; 370 if (className.equals("char")) 371 return Character.TYPE; 372 if (className.equals("short")) 373 return Short.TYPE; 374 if (className.equals("int")) 375 return Integer.TYPE; 376 if (className.equals("long")) 377 return Long.TYPE; 378 if (className.equals("float")) 379 return Float.TYPE; 380 if (className.equals("double")) 381 return Double.TYPE; 382 // Not a primitive Java type. 383 return Class.forName(className); 384 } else 385 try { 386 return (Class)JavaObject.getObject(classRef); 387 } 388 catch (ClassCastException e) { 389 throw new ConditionThrowable(new TypeError(classRef, "Java class")); 390 } 391 catch (ConditionThrowable e) { 392 throw new ClassNotFoundException(e.getMessage()); 393 } 367 394 } 368 395
Note: See TracChangeset
for help on using the changeset viewer.