Changeset 161
- Timestamp:
- Dec 31, 2003, 3:02:11 AM (21 years ago)
- File:
-
- 1 edited
-
trunk/ccl/examples/objc-runtime.lisp (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ccl/examples/objc-runtime.lisp
r158 r161 19 19 20 20 21 (defun show-uvector (u) 22 (dotimes (i (uvsize u) (values)) 23 (format t "~&~d : ~s" i (uvref u i)) 24 (force-output))) 25 21 26 ;;; Utilities for interacting with the Apple/GNU Objective-C runtime 22 27 ;;; systems. … … 47 52 (use-interface-dir :gnustep)) 48 53 54 (defpackage "OBJC" 55 (:use) 56 (:export "OBJC-OBJECT" "OBJC-CLASS-OBJECT" "OBJC-CLASS" "OBJC-METACLASS")) 57 49 58 (eval-when (:compile-toplevel :load-toplevel :execute) 50 59 (require "SPLAY-TREE") 51 60 (require "NAME-TRANSLATION") 52 (require "PROCESS-OBJC-MODULES")) 61 (require "PROCESS-OBJC-MODULES") 62 (require "OBJC-CLOS")) 53 63 54 64 (defloadvar *NSApp* nil ) … … 119 129 (defun (setf id->objc-class-slots-vector) (new i) 120 130 (setf (svref csv i) new)) 121 (defun id-> metaclass-slot-vector (i)131 (defun id->objc-metaclass-slots-vector (i) 122 132 (svref msv i)) 123 (defun (setf id-> metaclass-slot-vector) (new i)133 (defun (setf id->objc-metaclass-slots-vector) (new i) 124 134 (setf (svref msv i) new)) 125 135 … … 137 147 (splay-tree-count objc-metaclass-map) 0 138 148 next-objc-class-id 0))) 139 (defun map-objc-class (class )149 (defun map-objc-class (class &optional foreign) 140 150 "ensure that the class (and metaclass) are mapped to a small integer" 141 151 (with-lock-grabbed (objc-class-lock) 142 (or (splay-tree-get objc-class-map class) 143 (let* ((id (assign-next-class-id)) 144 (class (%inc-ptr class 0)) 145 (meta (pref class #+apple-objc :objc_class.isa #+gnu-objc :objc_class.class_pointer))) 146 (ensure-objc-classptr-resolved class) 147 (splay-tree-put objc-class-map class id) 148 (splay-tree-put objc-metaclass-map meta id) 149 (setf (svref c id) class 150 (svref m id) meta) 151 id)))) 152 (labels ((ensure-mapped-class (class) 153 (with-macptrs ((super (pref class :objc_class.super_class))) 154 (unless (%null-ptr-p super) 155 (ensure-mapped-class super))) 156 (or (splay-tree-get objc-class-map class) 157 (let* ((id (assign-next-class-id)) 158 (class (%inc-ptr class 0)) 159 (meta (pref class #+apple-objc :objc_class.isa #+gnu-objc :objc_class.class_pointer))) 160 (ensure-objc-classptr-resolved class) 161 (splay-tree-put objc-class-map class id) 162 (splay-tree-put objc-metaclass-map meta id) 163 (setf (svref c id) class 164 (svref m id) meta) 165 (let* ((class-name (objc-to-lisp-classname 166 (%get-cstring 167 (pref class :objc_class.name)) 168 "NS")) 169 (metaclass-name (intern (concatenate 'string "+" (string class-name)) (symbol-package class-name))) 170 (class-wrapper (%cons-wrapper class)) 171 (meta-wrapper (%cons-wrapper meta)) 172 (class-slot-vector 173 (initialize-objc-class-slots class 174 class-name 175 class-wrapper 176 foreign)) 177 (meta-slot-vector 178 (initialize-objc-metaclass-slots 179 meta 180 metaclass-name 181 meta-wrapper 182 foreign 183 class))) 184 (when (eq (find-package "NS") 185 (symbol-package class-name)) 186 (export class-name "NS") 187 (export metaclass-name "NS")) 188 (setf (svref cw id) class-wrapper 189 (svref mw id) meta-wrapper 190 (svref csv id) class-slot-vector 191 (svref msv id) meta-slot-vector 192 (find-class class-name) class 193 (find-class metaclass-name) meta) 194 ) 195 id)))) 196 (ensure-mapped-class class)))) 152 197 (defun objc-class-id (class) 153 198 (with-lock-grabbed (objc-class-lock) … … 162 207 :key #'function-name) 163 208 164 (defun map-objc-classes (f)209 (defun do-all-objc-classes (f) 165 210 (map-splay-tree (objc-class-map) #'(lambda (id) 166 211 (funcall f (id->objc-class id))))) … … 980 1025 ) 981 1026 1027 (defun %objc-metaclass-p (class) 1028 (logtest (pref class :objc_class.info) 1029 #+apple-objc #$CLS_META 1030 #+gnu-objc #$_CLS_META)) 1031 982 1032 (defun %add-objc-class (class) 983 1033 #+apple-objc … … 1023 1073 (eval-when (:load-toplevel :execute) 1024 1074 (%define-objc-class (note-objc-class ,class-name ,superclass-name ',instance-vars)))))) 1025 1075 1026 1076 1027 1077 ;;; If P is an ObjC class (or metaclass), return the class & metaclass, … … 1517 1567 (error (ns-exception->lisp-condition (%inc-ptr exception 0)))))) 1518 1568 1569 #+apple-objc 1570 (progn 1571 (let* ((class-count 0)) 1572 (declare (fixnum class-count)) 1573 (defun reset-objc-class-count () (setq class-count 0)) 1574 (defun map-objc-classes () 1575 (let* ((n (#_objc_getClassList (%null-ptr) 0))) 1576 (declare (fixnum n)) 1577 (if (> n class-count) 1578 (%stack-block ((buffer (the fixnum (ash n ppc32::word-shift)))) 1579 (#_objc_getClassList buffer n) 1580 (do* ((i class-count (1+ i))) 1581 ((= i n (setq class-count i))) 1582 (declare (fixnum i)) 1583 (map-objc-class 1584 (%get-ptr buffer (the fixnum (ash i ppc32::word-shift))) 1585 t))))))) 1586 (def-ccl-pointers revive-objc-classes () 1587 (reset-objc-class-count) 1588 (map-objc-classes))) 1589
Note:
See TracChangeset
for help on using the changeset viewer.
