Changeset 5733


Ignore:
Timestamp:
Jan 18, 2007, 3:17:16 AM (18 years ago)
Author:
Gary Byers
Message:

Some word-size conditionalization. Will need more work to handle
struct return/asssignment correctly on all platforms.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ccl/examples/bridge.lisp

    r2132 r5733  
    7878           ;; (STRING-with-N-colons ARG1 ... ARGN {LIST})
    7979           (let* ((n (count #\: (the simple-string f)))
    80                   (message-info (get-objc-message-info f))
     80                  (message-info (need-objc-message-info f))
    8181                  (args (rest args))
    8282                  (nargs (length args)))
     
    9292           (let ((nargs (length args)))
    9393             (cond ((and (= nargs 2) (consp l)
    94                          (let* ((info (get-objc-message-info
     94                         (let* ((info (need-objc-message-info
    9595                                       (lisp-to-objc-message (list f)))))
    9696                           (getf (objc-message-info-flags info)
     
    218218  (if (numberp rspec)
    219219    (> rspec 1)
    220     (> (ensure-foreign-type-bits (parse-foreign-type rspec)) 32)))
     220    (> (ensure-foreign-type-bits (parse-foreign-type rspec)) target::nbits-in-word)))
    221221
    222222
     
    375375                                     (objc-method-info-arglist m)))))))
    376376      (let* ((methods (objc-message-info-methods message-info))
     377             (signatures ())
     378             (protocol-methods)
    377379             (signature-alist ()))
    378380        (dolist (m methods)
    379           (let* ((signature (ensure-method-signature m))
    380                  (pair (assoc signature signature-alist :test #'equal)))
    381             (if pair
    382               (push m (cdr pair))
    383               (push (cons signature (list m)) signature-alist))))
     381          (let* ((signature (ensure-method-signature m)))
     382            (pushnew signature signatures :test #'equal)
     383            (if (getf (objc-method-info-flags m) :protocol)
     384              (push m protocol-methods)
     385              (let* ((pair (assoc signature signature-alist :test #'equal)))
     386                (if pair
     387                  (push m (cdr pair))
     388                  (push (cons signature (list m)) signature-alist))))))
    384389        (setf (objc-message-info-ambiguous-methods message-info)
    385390              (mapcar #'cdr
     
    389394                                   (length (cdr y)))))))
    390395        (setf (objc-message-info-flags message-info) nil)
    391         (when (cdr (objc-message-info-ambiguous-methods message-info))
     396        (setf (objc-message-info-protocol-methods message-info)
     397              protocol-methods)
     398        (when (cdr signatures)
    392399          (setf (getf (objc-message-info-flags message-info) :ambiguous) t))
    393400        (let* ((first-method (car methods))
     
    438445          info))))
    439446
     447(defun need-objc-message-info (message-name)
     448  (or (get-objc-message-info message-name)
     449      (error "Undeclared message: ~s" message-name)))
     450
    440451;;; Should be called after using new interfaces that may define
    441452;;; new methods on existing messages.
     
    558569             (if (and (consp translated) (eq (first translated) :record))
    559570               #+apple-objc
    560                (/ (second translated) 32)
     571               (ceiling (second translated) target::nbits-in-word)
    561572               #+gnu-objc `(:* ,ftype)
    562573               translated))))
     
    615626               (methods (objc-message-info-methods message-info))
    616627               (method (if (not ambiguous) (car methods))))
    617           (if ambiguous
     628          (when ambiguous
    618629            (let* ((class (if sclassname
    619630                            (find-objc-class sclassname)
     
    621632              (if class
    622633                (dolist (m methods)
    623                   (let* ((mclass (or (get-objc-method-info-class m)
    624                                      (error "Can't find ObjC class named ~s"
    625                                             (objc-method-info-class-name m)))))
    626                     (when (and class (subtypep class mclass))
    627                       (return (setq method m))))))))
     634                  (unless (getf (objc-method-info-flags m) :protocol)
     635                    (let* ((mclass (or (get-objc-method-info-class m)
     636                                       (error "Can't find ObjC class named ~s"
     637                                              (objc-method-info-class-name m)))))
     638                      (when (and class (subtypep class mclass))
     639                        (return (setq method m)))))))))
    628640          (if method
    629641            (build-call-from-method-info method
     
    746758                        msg
    747759                        s
    748                         super)
     760                        super
     761                        protocol-methods)
    749762  (flet ((method-class-name (m)
    750763           (let* ((mclass (get-objc-method-info-class m)))
     
    754767             (class-name mclass))))
    755768    (collect ((clauses))
     769      (let* ((protocol (gensym)))
     770        (dolist (method protocol-methods)
     771          (let* ((protocol-name (objc-method-info-class-name method)))
     772            (clauses `((let* ((,protocol (lookup-objc-protocol ,protocol-name)))
     773                         (and ,protocol
     774                              (not (zerop (objc-message-send ,receiver
     775                                                             "conformsToProtocol:"
     776                                                             :address ,protocol
     777                                                             :<BOOL>)))))
     778                       ,(build-internal-call-from-method-info
     779                         method args vargs receiver msg s super))))))
    756780      (do* ((methods ambiguous-methods (cdr methods)))
    757781           ((null (cdr methods))
     782            (when ambiguous-methods
    758783            (clauses `(t
    759784                       ,(build-internal-call-from-method-info
    760                          (caar methods) args vargs receiver msg s super))))
     785                         (caar methods) args vargs receiver msg s super)))))
    761786        (clauses `(,(if (cdar methods)
    762787                        `(or ,@(mapcar #'(lambda (m)
     
    780805                    msg
    781806                    s
    782                     super)))
     807                    super
     808                    (objc-message-info-protocol-methods message-info))))
    783809    `(with-ns-exceptions-as-errors
    784810      (rlet ,svarforms
Note: See TracChangeset for help on using the changeset viewer.