Changeset 14202
- Timestamp:
- Aug 21, 2010, 3:40:26 AM (14 years ago)
- File:
-
- 1 edited
-
trunk/source/objc-bridge/objc-clos.lisp (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/objc-bridge/objc-clos.lisp
r13067 r14202 22 22 ;;; - Variable arity ObjC methods 23 23 ;;; - Pass-by-ref structures need to keep track of IN, OUT, IN/OUT info 24 24 25 ;;; - Need to canonicalize and retain every returned :ID 25 26 ;;; - Support :BEFORE, :AFTER and :AROUND for ObjC methods … … 72 73 73 74 (defvar *objc-object-slot-vectors* (make-hash-table :test #'eql)) 74 (defvar *objc-canonical-instances* (make-hash-table :test #'eql :weak :value)) 75 76 (defun raw-macptr-for-instance (instance) 77 (let* ((p (%null-ptr))) 78 (%set-macptr-domain p 1) ; not an ObjC object, but EQL to one 79 (%setf-macptr p instance) 80 p)) 81 82 (defun register-canonical-objc-instance (instance raw-ptr) 83 ;(terminate-when-unreachable instance) 84 ;(retain-objc-instance instance) 85 (setf (gethash raw-ptr *objc-canonical-instances*) instance)) 86 87 (defun canonicalize-objc-instance (instance) 88 (or (gethash instance *objc-canonical-instances*) 89 (register-canonical-objc-instance 90 (setq instance (%inc-ptr instance 0)) 91 (raw-macptr-for-instance instance)))) 75 92 76 93 77 … … 153 137 (remhash p *objc-object-slot-vectors*)) 154 138 139 (defun objc:remove-lisp-slots (p) 140 (%remove-lisp-slot-vector p)) 141 155 142 (defun %objc-domain-slots-vector (p) 156 143 (let* ((type (%macptr-type p)) … … 161 148 (#.objc-flag-instance (or (gethash p *objc-object-slot-vectors*) 162 149 ; try to allocate the slot vector on demand 163 (let* ((raw-ptr (raw-macptr-for-instance p)) 164 (slot-vector (create-foreign-instance-slot-vector (class-of p)))) 150 (let* ((slot-vector (create-foreign-instance-slot-vector (class-of p)))) 165 151 (when slot-vector 166 (setf (slot-vector.instance slot-vector) raw-ptr) 167 (setf (gethash raw-ptr *objc-object-slot-vectors*) slot-vector) 168 (register-canonical-objc-instance p raw-ptr) 152 (setf (slot-vector.instance slot-vector) p) 153 (setf (gethash p *objc-object-slot-vectors*) slot-vector) 169 154 (initialize-instance p)) 170 155 slot-vector) … … 775 760 (let* ((slot-vector (create-foreign-instance-slot-vector class))) 776 761 (when slot-vector 777 (let* ((raw-ptr (raw-macptr-for-instance instance))) 778 (setf (slot-vector.instance slot-vector) raw-ptr) 779 (setf (gethash raw-ptr *objc-object-slot-vectors*) slot-vector) 780 (register-canonical-objc-instance instance raw-ptr)))))) 762 (setf (slot-vector.instance slot-vector) instance) 763 (setf (gethash instance *objc-object-slot-vectors*) slot-vector))))) 781 764 instance)) 782 765 … … 790 773 (apply #'shared-initialize instance nil initargs)) 791 774 792 (defmethod initialize-instance :after ((class objc:objc-class) &rest initargs) 793 (declare (ignore initargs)) 775 (defmethod initialize-instance :after ((class objc:objc-class) &key name &allow-other-keys) 794 776 (unless (slot-value class 'foreign) 795 777 #-(or apple-objc-2.0 cocotron-objc) … … 798 780 (%add-objc-class class ivars instance-size)) 799 781 #+(or apple-objc-2.0 cocotron-objc) 800 (%add-objc-class class))) 782 (%add-objc-class class) 783 (setf (find-class name) class) 784 (ensure-dealloc-method-for-class class))) 801 785 802 786 (defmethod shared-initialize ((instance objc:objc-object) slot-names … … 871 855 (progn 872 856 (apply #'reinitialize-instance class initargs) 873 (setf (find-class name) class)) 857 (setf (find-class name) class) 858 (ensure-dealloc-method-for-class class) 859 class) 874 860 (error "Can't change metaclass of ~s to ~s." class metaclass))))) 875 861
Note:
See TracChangeset
for help on using the changeset viewer.
