X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/blobdiff_plain/7479d92c2e0ee576d0d376bbbbb72a9dcb948e4b..ac60c4d4c929172db12c2aa41b0c4b530639208f:/glib/gforeign.lisp diff --git a/glib/gforeign.lisp b/glib/gforeign.lisp index f70dfad..5b2c8cb 100644 --- a/glib/gforeign.lisp +++ b/glib/gforeign.lisp @@ -15,7 +15,7 @@ ;; License along with this library; if not, write to the Free Software ;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -;; $Id: gforeign.lisp,v 1.7 2001-04-30 11:25:25 espen Exp $ +;; $Id: gforeign.lisp,v 1.11 2001-10-21 16:50:43 espen Exp $ (in-package "GLIB") @@ -53,7 +53,9 @@ (defun find-type-method (type fname) (defun find-applicable-type-method (type-spec fname &optional (error t)) (flet ((find-superclass-method (class) - (when class + (when (and class (class-finalized-p class)) +; (unless (class-finalized-p class) +; (finalize-inheritance class)) (dolist (super (cdr (pcl::class-precedence-list class))) (return-if (find-type-method super fname))))) (find-expanded-type-method (type-spec) @@ -287,10 +289,11 @@ (defun default-type-name (alien-name) (defmacro defbinding (name lambda-list return-type-spec &rest docs/args) - (multiple-value-bind (c-name lisp-name) + (multiple-value-bind (lisp-name c-name) (if (atom name) - (values (default-alien-fname name) name) - (values-list name)) + (values name (default-alien-fname name)) + (values-list name)) + (let ((supplied-lambda-list lambda-list) (docs nil) (args nil)) @@ -312,11 +315,6 @@ (defmacro defbinding (name lambda-list return-type-spec &rest docs/args) c-name lisp-name (or supplied-lambda-list (nreverse lambda-list)) return-type-spec (reverse docs) (reverse args))))) -;; For backward compatibility -(defmacro define-foreign (&rest args) - `(defbinding ,@args)) - - #+cmu (defun %defbinding (foreign-name lisp-name lambda-list return-type-spec docs args) @@ -325,7 +323,7 @@ (defun %defbinding (foreign-name lisp-name lambda-list (dolist (arg args) (destructuring-bind (var expr type-spec style) arg (let ((declaration (translate-type-spec type-spec)) - (deallocation (cleanup-alien type-spec expr t))) + (deallocation (cleanup-alien type-spec var t))) (cond ((member style '(:out :in-out)) (alien-types `(* ,declaration)) @@ -365,18 +363,20 @@ (defun %defbinding (foreign-name lisp-name lambda-list (values ,@(alien-values))))))))) -(defun mkbinding (name rettype &rest types) - (declare (optimize (ext:inhibit-warnings 3))) - (let* ((ftype - `(function ,@(mapcar #'translate-type-spec (cons rettype types)))) +(defun mkbinding (name return-type &rest arg-types) + (declare (optimize (ext:inhibit-warnings 3))) + (let* ((ftype + `(function + ,@(mapcar #'translate-type-spec (cons return-type arg-types)))) (alien (alien::%heap-alien (alien::make-heap-alien-info :type (alien::parse-alien-type ftype) :sap-form (system:foreign-symbol-address name)))) - (translate-arguments (mapcar #'intern-return-value-translator types)) - (translate-return-value (intern-return-value-translator rettype)) - (cleanup-arguments (mapcar #'intern-cleanup-function types))) + (translate-arguments + (mapcar #'intern-return-value-translator arg-types)) + (translate-return-value (intern-return-value-translator return-type)) + (cleanup-arguments (mapcar #'intern-cleanup-function arg-types))) #'(lambda (&rest args) (map-into args #'funcall translate-arguments args) @@ -386,6 +386,31 @@ (defun mkbinding (name rettype &rest types) (mapc #'funcall cleanup-arguments args))))) +(defun type-translateable-p (type-spec) + (find-applicable-type-method type-spec 'translate-type-spec nil)) + +(defun every-type-translateable-p (type-specs) + (every #'type-translateable-p type-specs)) + +(defun mkbinding-late (name return-type &rest arg-types) + (if (every-type-translateable-p (cons return-type arg-types)) + (apply #'mkbinding name return-type arg-types) + (let* ((binding + #'(lambda (&rest args) + (cond + ((every-type-translateable-p (cons return-type arg-types)) + (setq binding (apply #'mkbinding name return-type arg-types)) + (apply binding args)) + (t + (dolist (type-spec (cons return-type arg-types)) + (unless (type-translateable-p type-spec) + (error "Can't translate type ~A" type-spec)))))))) + #'(lambda (&rest args) + (apply binding args))))) + + + + ;;;; Definitons and translations of fundamental types (deftype long (&optional (min '*) (max '*)) `(integer ,min ,max)) @@ -401,7 +426,6 @@ (deftype pointer () 'system-area-pointer) (deftype boolean (&optional (size '*)) (declare (ignore size)) `(member t nil)) -(deftype static (type) type) (deftype invalid () nil) (defun atomic-type-p (type-spec) @@ -621,7 +645,6 @@ (deftype-method translate-from-alien string )))) (deftype-method cleanup-alien string (type-spec c-string &optional weak-ref) - (declare (ignore type-spec)) (when weak-ref (unreference-alien type-spec c-string)))