3 ;; Low level (dangerous utils at the level of objc-include)
5 (defun %instancep
(objc-class)
6 ;; parameter -must- be a pointer to either an objc_class or an objc_object
7 ;; or this function will almost def. crash
9 ;; Is this an instance or a class?
10 ;; pass in either an instance, or an object
11 (assert (cffi:pointerp objc-class
))
12 (cls-get-info (cffi:foreign-slot-value
13 (cffi:foreign-slot-value objc-class
'objc_object
'isa
)
17 (defun %list-ivars
(objc-class)
18 ;; returns an alist like ((id "ivarName") (:float "anotherIvar") ...)
19 (assert (cffi:pointerp objc-class
))
20 (let* ((ivars (cffi:foreign-slot-value objc-class
'objc_class
'ivars
)))
21 (if (cffi:null-pointer-p ivars
) nil
22 (let* ((ivar-count (cffi:foreign-slot-value ivars
'objc_ivar_list
'ivar_count
))
23 (ivar (cffi:inc-pointer ivars
(cffi:foreign-slot-offset
'objc_ivar_list
'ivar_list
))))
26 collect
(list (decode-type (cffi:foreign-slot-value ivar
'objc_ivar
'ivar_type
))
27 (cffi:foreign-slot-value ivar
'objc_ivar
'ivar_name
))
28 do
(cffi:incf-pointer ivar
(cffi:foreign-type-size
'objc_ivar
)))))))
30 ;;; (%list-ivars (%objc_getClass "NSApplication"))