chiark / gitweb /
Added GET-ALL and PLIST-REMOVE to manipulate plists
[clg] / glib / gforeign.lisp
index 3ff5755c6253827c4de319113e20bfe121c57733..5b2c8cbdc9d13bf367d320f4d8104907780c2c6d 100644 (file)
@@ -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.8 2001-05-04 17:00:37 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))
@@ -620,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)))