chiark / gitweb /
Shared library component improved
[clg] / glib / gboxed.lisp
index caf5fb478d8281d41be3ae7c9fd905ea7cdd4f5d..64ea49fcbb8bfcf0a75e8df96bcd5fbfdc978514 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: gboxed.lisp,v 1.11 2004-11-06 21:39:58 espen Exp $
+;; $Id: gboxed.lisp,v 1.14 2005-02-01 15:24:52 espen Exp $
 
 (in-package "GLIB")
 
@@ -25,10 +25,17 @@ (eval-when (:compile-toplevel :load-toplevel :execute)
                          (pkg-config:pkg-variable "glib-2.0" "libdir")
                          "/libgobject-2.0.so")))
 
-(defclass boxed (proxy)
+(defclass boxed (struct)
   ()
   (:metaclass struct-class))
 
+(defmethod instance-finalizer ((instance boxed))
+  (let ((location (proxy-location instance))
+       (type-number (type-number-of instance)))
+    #'(lambda ()
+       (remove-cached-instance location)
+       (%boxed-free type-number location))))
+
 
 ;;;; Metaclass for boxed classes
 
@@ -52,26 +59,27 @@ (defmethod shared-initialize ((class boxed-class) names
     (register-type class-name type-number)))
 
 
-(defbinding %boxed-copy (type location) pointer
-  ((find-type-number type) type-number)
+(defbinding %boxed-copy () pointer
+  (type-number type-number)
   (location pointer))
 
-(defbinding %boxed-free (type location) nil
-  ((find-type-number type) type-number)
+(defbinding %boxed-free () nil
+  (type-number type-number)
   (location pointer))
 
 (defmethod reference-foreign ((class boxed-class) location)
-  (%boxed-copy (class-name class) location))
+  (%boxed-copy (find-type-number class) location))
 
 (defmethod unreference-foreign ((class boxed-class) location)
-  (%boxed-free (class-name class) location))
+  (%boxed-free (find-type-number class) location))
 
 
 ;;;; 
 
-(defun expand-boxed-type (type-number &optional slots)
+(defun expand-boxed-type (type-number forward-p slots)
   `(defclass ,(type-from-number type-number) (boxed)
-     ,slots
+     ,(unless forward-p
+       slots)
      (:metaclass boxed-class)
      (:alien-name ,(find-type-name type-number))))