chiark / gitweb /
Updated for CMUCL 19a and glib-2.4
[clg] / glib / gtype.lisp
index 8f8e3c044cf6e4c0db35fa81bc9fa034c188bae4..02f967760cd29ce52b037caa2dd2838ee7098486 100644 (file)
 ;; 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: gtype.lisp,v 1.15 2002-01-20 14:09:52 espen Exp $
+;; $Id: gtype.lisp,v 1.17 2004-10-27 14:59:00 espen Exp $
 
 (in-package "GLIB")
 
 (use-prefix "g")
 
+;(load-shared-library "libgobject-2.0" :init "g_type_init")
+
 ;;;; 
 
 (deftype type-number () '(unsigned 32))
@@ -68,9 +70,11 @@ (defun register-type (type id)
   (let ((type-number
         (etypecase id
           (integer id)
-          (string (find-type-number id t)))))
+          (string (find-type-number id t))
+          (symbol (gethash id *type-to-number-hash*)))))
     (setf (gethash type *type-to-number-hash*) type-number)
-    (setf (gethash type-number *number-to-type-hash*) type)
+    (unless (symbolp id)
+      (setf (gethash type-number *number-to-type-hash*) type))
     type-number))
 
 (defbinding %type-from-name () type-number
@@ -167,21 +171,23 @@ (deftype-method translate-from-alien
 ;;;; Metaclass for subclasses of ginstance
 
 (eval-when (:compile-toplevel :load-toplevel :execute)
-  (defclass ginstance-class (proxy-class)))
+  (defclass ginstance-class (proxy-class)
+    ()))
 
 
 (defmethod shared-initialize ((class ginstance-class) names
                              &rest initargs &key name alien-name
-                             size ref unref)
+                             ref unref)
   (declare (ignore initargs names))
   (let* ((class-name (or name (class-name class)))
         (type-number
          (find-type-number
           (or (first alien-name) (default-alien-type-name class-name)) t)))
     (register-type class-name type-number)
-    (let ((size (or size (type-instance-size type-number))))
-      (declare (special size))
-      (call-next-method)))
+    (if (getf initargs :size)
+       (call-next-method)
+      (let ((size (type-instance-size type-number)))
+       (apply #'call-next-method class names :size (list size) initargs))))
 
   (when ref
     (let ((ref (mkbinding (first ref) 'pointer 'pointer)))
@@ -189,7 +195,7 @@ (defmethod shared-initialize ((class ginstance-class) names
        (slot-value class 'copy)
        #'(lambda (type location)
           (declare (ignore type))
-          (funcall ref location)))))     
+          (funcall ref location)))))
   (when unref
     (let ((unref (mkbinding (first unref) 'nil 'pointer)))
       (setf
@@ -332,7 +338,11 @@ (defun expand-type-definitions (prefix &optional args)
                   #'(lambda (options)
                       (and
                        (string-prefix-p (first options) name)
-                       (getf (cdr options) :ignore-prefix)))
+                       (getf (cdr options) :ignore-prefix)
+                       (not (some
+                             #'(lambda (exception)
+                                 (string= name exception))
+                             (getf (cdr options) :except)))))
                   args))))
           (find-types prefix))))