Changeset 12583
- Timestamp:
- 04/08/10 19:44:14 (14 years ago)
- Location:
- trunk/abcl/src/org/armedbear/lisp
- Files:
-
- 1 deleted
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abcl/src/org/armedbear/lisp/Autoload.java
r12576 r12583 506 506 autoload(PACKAGE_EXT, "string-position", "StringFunctions"); 507 507 autoload(PACKAGE_JAVA, "%jnew-proxy", "JProxy"); 508 autoload(PACKAGE_JAVA, "%find-java-class", "JavaClass"); 508 autoload(PACKAGE_JAVA, "%find-java-class", "JavaObject"); 509 autoload(PACKAGE_JAVA, "%register-java-class", "JavaObject"); 509 510 autoload(PACKAGE_JAVA, "%jmake-invocation-handler", "JProxy"); 510 511 autoload(PACKAGE_JAVA, "%jmake-proxy", "JProxy"); -
trunk/abcl/src/org/armedbear/lisp/JavaObject.java
r12581 r12583 39 39 import java.lang.reflect.Field; 40 40 import java.math.BigInteger; 41 import java.util.ArrayList; 42 import java.util.Collection; 43 import java.util.HashSet; 44 import java.util.LinkedList; 45 import java.util.Set; 41 import java.util.*; 46 42 47 43 public final class JavaObject extends LispObject { … … 54 50 obj != null ? Java.maybeBoxClass(obj.getClass()) : null; 55 51 } 52 53 public static final Symbol JAVA_CLASS_JCLASS = PACKAGE_JAVA.intern("JAVA-CLASS-JCLASS"); 54 public static final Symbol JAVA_CLASS = PACKAGE_JAVA.intern("JAVA-CLASS"); 55 public static final Symbol ENSURE_JAVA_CLASS = PACKAGE_JAVA.intern("ENSURE-JAVA-CLASS"); 56 56 57 57 /** … … 88 88 return BuiltInClass.JAVA_OBJECT; 89 89 } else { 90 return JavaClass.findJavaClass(obj.getClass());90 return ENSURE_JAVA_CLASS.execute(new JavaObject(obj.getClass())); 91 91 } 92 92 } 93 93 94 94 @Override 95 public LispObject typep(LispObject type) 96 { 95 public LispObject typep(LispObject type) { 97 96 if (type == Symbol.JAVA_OBJECT) 98 97 return T; 99 98 if (type == BuiltInClass.JAVA_OBJECT) 100 99 return T; 101 if(type instanceof JavaClass && obj != null) { 102 return ((JavaClass) type).getJavaClass().isAssignableFrom(obj.getClass()) ? T : NIL; 103 } 100 if(type.typep(LispClass.findClass(JAVA_CLASS, false)) != NIL) { 101 if(obj != null) { 102 Class c = (Class) JAVA_CLASS_JCLASS.execute(type).javaInstance(); 103 return c.isAssignableFrom(obj.getClass()) ? T : NIL; 104 } else { 105 return T; 106 } 107 } 104 108 return super.typep(type); 105 109 } … … 523 527 } 524 528 }; 529 530 //JAVA-CLASS support 531 532 //There is no point for this Map to be weak since values keep a reference to the corresponding 533 //key (the Java class). This should not be a problem since Java classes are limited in number - 534 //if they grew indefinitely, the JVM itself would crash. 535 private static final Map<Class<?>, LispObject> javaClassMap = new HashMap<Class<?>, LispObject>(); 536 537 public static LispObject registerJavaClass(Class<?> javaClass, LispObject classMetaObject) { 538 synchronized (javaClassMap) { 539 javaClassMap.put(javaClass, classMetaObject); 540 return classMetaObject; 541 } 542 } 543 544 public static LispObject findJavaClass(Class<?> javaClass) { 545 synchronized (javaClassMap) { 546 LispObject c = javaClassMap.get(javaClass); 547 if (c != null) { 548 return c; 549 } else { 550 return NIL; 551 } 552 } 553 } 554 555 private static final Primitive _FIND_JAVA_CLASS = new Primitive("%find-java-class", PACKAGE_JAVA, false, "class-name-or-class") { 556 public LispObject execute(LispObject arg) { 557 try { 558 if(arg instanceof AbstractString) { 559 return findJavaClass(Class.forName((String) arg.getStringValue())); 560 } else { 561 return findJavaClass((Class<?>) arg.javaInstance()); 562 } 563 } catch (ClassNotFoundException e) { 564 return error(new LispError("Cannot find Java class " + arg.getStringValue())); 565 } 566 } 567 568 }; 569 570 private static final Primitive _REGISTER_JAVA_CLASS = new Primitive("%register-java-class", PACKAGE_JAVA, false, "jclass class-metaobject") { 571 public LispObject execute(LispObject jclass, LispObject classMetaObject) { 572 return registerJavaClass((Class<?>) jclass.javaInstance(), classMetaObject); 573 } 574 575 }; 576 525 577 } -
trunk/abcl/src/org/armedbear/lisp/StandardClass.java
r12582 r12583 396 396 addStandardClass(Symbol.BUILT_IN_CLASS, list(CLASS)); 397 397 398 public static final StandardClass JAVA_CLASS =399 addStandardClass(Symbol.JAVA_CLASS, list(CLASS));400 401 398 public static final StandardClass FORWARD_REFERENCED_CLASS = 402 399 addStandardClass(Symbol.FORWARD_REFERENCED_CLASS, list(CLASS)); … … 549 546 BUILT_IN_CLASS.setCPL(BUILT_IN_CLASS, CLASS, STANDARD_OBJECT, 550 547 BuiltInClass.CLASS_T); 551 JAVA_CLASS.setCPL(JAVA_CLASS, CLASS, STANDARD_OBJECT,552 BuiltInClass.CLASS_T);553 548 CELL_ERROR.setCPL(CELL_ERROR, ERROR, SERIOUS_CONDITION, CONDITION, 554 549 STANDARD_OBJECT, BuiltInClass.CLASS_T); -
trunk/abcl/src/org/armedbear/lisp/autoloads.lisp
r12516 r12583 280 280 (export 'jruntime-class-exists-p "JAVA") 281 281 (autoload 'jruntime-class-exists-p "runtime-class") 282 (export 'ensure-java-class "JAVA") 283 (autoload 'ensure-java-class "java") 282 284 283 285 ;; Profiler. -
trunk/abcl/src/org/armedbear/lisp/clos.lisp
r12578 r12583 579 579 (getf canonical-slot :name)) 580 580 581 (defvar *extensible-built-in-classes* (list (find-class 'sequence) ))581 (defvar *extensible-built-in-classes* (list (find-class 'sequence) (find-class 'java:java-object))) 582 582 583 583 (defun ensure-class (name &rest all-keys &key metaclass &allow-other-keys) … … 972 972 ((and (consp specializer) 973 973 (eq (car specializer) 'java:jclass)) 974 (let ((class-name (cadr specializer))) 975 (when (and (consp class-name) 976 (eq (car class-name) 'quote)) 977 (setf class-name (cadr class-name))) 978 (java::%find-java-class class-name))) 974 (let ((jclass (eval specializer))) 975 (java::ensure-java-class jclass))) 979 976 (t 980 977 (error "Unknown specializer: ~S" specializer)))) -
trunk/abcl/src/org/armedbear/lisp/java.lisp
r12315 r12583 33 33 34 34 (require "CLOS") 35 (require "PRINT-OBJECT") 35 36 36 37 (defun jregister-handler (object event handler &key data count) … … 309 310 (%jset-property-value obj prop value)) 310 311 311 (provide "JAVA-EXTENSIONS") 312 ;;; print-object 313 314 (defmethod print-object ((obj java:java-object) stream) 315 (write-string (sys::%write-to-string obj) stream)) 316 317 (defmethod print-object ((e java:java-exception) stream) 318 (if *print-escape* 319 (print-unreadable-object (e stream :type t :identity t) 320 (format stream "~A" 321 (java:jcall (java:jmethod "java.lang.Object" "toString") 322 (java:java-exception-cause e)))) 323 (format stream "Java exception '~A'." 324 (java:jcall (java:jmethod "java.lang.Object" "toString") 325 (java:java-exception-cause e))))) 326 327 ;;; JAVA-CLASS support 328 329 (defclass java-class (standard-class) 330 ((jclass :initarg :java-class 331 :initform (error "class is required") 332 :reader java-class-jclass))) 333 334 (defun ensure-java-class (jclass) 335 (let ((class (%find-java-class jclass))) 336 (if class 337 class 338 (%register-java-class 339 jclass (mop::ensure-class (make-symbol (jclass-name jclass)) 340 :metaclass (find-class 'java-class) 341 :direct-superclasses (if (jclass-superclass-p jclass (jclass "java.lang.Object")) 342 (list (find-class 'java-object)) 343 (mapcar #'ensure-java-class 344 (delete nil 345 (concatenate 'list (list (jclass-superclass jclass)) 346 (jclass-interfaces jclass))))) 347 :java-class jclass))))) 348 349 (defmethod make-instance ((class java-class) &rest initargs &key &allow-other-keys) 350 (declare (ignore initargs)) 351 (error "make-instance not supported for ~S" class)) 352 353 (provide "JAVA") -
trunk/abcl/src/org/armedbear/lisp/known-symbols.lisp
r12400 r12583 32 32 (in-package #:system) 33 33 34 (require "JAVA") 35 34 36 (export '(lookup-known-symbol)) 35 37 -
trunk/abcl/src/org/armedbear/lisp/print-object.lisp
r12379 r12583 33 33 34 34 (require 'clos) 35 (require 'java)36 35 37 36 (when (autoloadp 'print-object) … … 50 49 (format stream "~S" (class-name (class-of object)))) 51 50 object) 52 53 (defmethod print-object ((obj java:java-object) stream)54 (write-string (%write-to-string obj) stream))55 56 (defmethod print-object ((class java:java-class) stream)57 (write-string (%write-to-string class) stream))58 51 59 52 (defmethod print-object ((class class) stream) … … 124 117 (format stream "The variable ~S is unbound." (cell-error-name x)))) 125 118 126 (defmethod print-object ((e java:java-exception) stream)127 (if *print-escape*128 (print-unreadable-object (e stream :type t :identity t)129 (format stream "~A"130 (java:jcall (java:jmethod "java.lang.Object" "toString")131 (java:java-exception-cause e))))132 (format stream "Java exception '~A'."133 (java:jcall (java:jmethod "java.lang.Object" "toString")134 (java:java-exception-cause e)))))135 136 119 (provide 'print-object)
Note: See TracChangeset
for help on using the changeset viewer.