Changeset 161


Ignore:
Timestamp:
Dec 31, 2003, 3:02:11 AM (21 years ago)
Author:
Gary Byers
Message:

Start to integrate CLOS & ObjC.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ccl/examples/objc-runtime.lisp

    r158 r161  
    1919
    2020
     21(defun show-uvector (u)
     22  (dotimes (i (uvsize u) (values))
     23    (format t "~&~d : ~s" i (uvref u i))
     24    (force-output)))
     25
    2126;;; Utilities for interacting with the Apple/GNU Objective-C runtime
    2227;;; systems.
     
    4752  (use-interface-dir :gnustep))
    4853
     54(defpackage "OBJC"
     55  (:use)
     56  (:export "OBJC-OBJECT" "OBJC-CLASS-OBJECT" "OBJC-CLASS" "OBJC-METACLASS"))
     57
    4958(eval-when (:compile-toplevel :load-toplevel :execute)
    5059  (require "SPLAY-TREE")
    5160  (require "NAME-TRANSLATION")
    52   (require "PROCESS-OBJC-MODULES"))
     61  (require "PROCESS-OBJC-MODULES")
     62  (require "OBJC-CLOS"))
    5363
    5464(defloadvar *NSApp* nil )
     
    119129    (defun (setf id->objc-class-slots-vector) (new i)
    120130      (setf (svref csv i) new))
    121     (defun id->metaclass-slot-vector (i)
     131    (defun id->objc-metaclass-slots-vector (i)
    122132      (svref msv i))
    123     (defun (setf id->metaclass-slot-vector) (new i)
     133    (defun (setf id->objc-metaclass-slots-vector) (new i)
    124134      (setf (svref msv i) new))
    125135   
     
    137147              (splay-tree-count objc-metaclass-map) 0
    138148              next-objc-class-id 0)))
    139     (defun map-objc-class (class)
     149    (defun map-objc-class (class &optional foreign)
    140150      "ensure that the class (and metaclass) are mapped to a small integer"
    141151      (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))))
    152197    (defun objc-class-id (class)
    153198      (with-lock-grabbed (objc-class-lock)
     
    162207         :key #'function-name)
    163208
    164 (defun map-objc-classes (f)
     209(defun do-all-objc-classes (f)
    165210  (map-splay-tree (objc-class-map) #'(lambda (id)
    166211                                       (funcall f (id->objc-class id)))))
     
    9801025)
    9811026
     1027(defun %objc-metaclass-p (class)
     1028  (logtest (pref class :objc_class.info)
     1029           #+apple-objc #$CLS_META
     1030           #+gnu-objc #$_CLS_META))
     1031           
    9821032(defun %add-objc-class (class)
    9831033  #+apple-objc
     
    10231073      (eval-when (:load-toplevel :execute)
    10241074        (%define-objc-class (note-objc-class ,class-name ,superclass-name ',instance-vars))))))
    1025  
     1075
    10261076
    10271077;;; If P is an ObjC class (or metaclass), return the class & metaclass,
     
    15171567      (error (ns-exception->lisp-condition (%inc-ptr exception 0))))))
    15181568
     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.