chiark / gitweb /
Bug fix
[clg] / glib / gboxed.lisp
index 41f62431216d2206d661fd7b980b0b3e7b23727a..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.12 2004-11-07 21:41:35 espen Exp $
+;; $Id: gboxed.lisp,v 1.14 2005-02-01 15:24:52 espen Exp $
 
 (in-package "GLIB")
 
@@ -29,6 +29,13 @@ (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))))