Update of /project/lgtk/cvsroot/lgtk/src
In directory common-lisp.net:/tmp/cvs-serv24672
Modified Files:
bindings.lisp dynaslot.lisp gtkclasshierarchy.lisp
gtklisp.lisp nexus.lisp
Log Message:
This change makes sure that (gtk) objects which are members of other
(gtk) objects do not get destroyed explicitly at gc time. Usually,
objects destroy their own members.
Date: Mon Nov 10 15:44:47 2003
Author: mmommer
Index: lgtk/src/bindings.lisp
diff -u lgtk/src/bindings.lisp:1.3 lgtk/src/bindings.lisp:1.4
--- lgtk/src/bindings.lisp:1.3 Wed Nov 5 16:20:41 2003
+++ lgtk/src/bindings.lisp Mon Nov 10 15:44:47 2003
@@ -9,7 +9,7 @@
(defpackage #:defbinding
(:export #:def-binding #:def-bindings-types #:def-raw-binding
#:set-aliens-package #:def-binding-type
- #:in-filter #:out-filter #:alien-type #:buildform)
+ #:in-filter #:out-filter #:alien-type #:buildform #:_2-)
(:use :common-lisp :clnexus-port))
(in-package #:defbinding)
@@ -46,11 +46,27 @@
(defun alien-type (symbol)
(port-alien-type (binding-type-alien (get symbol 'binding-type))))
-(defun in-filter (symbol)
- (binding-type-in (get symbol 'binding-type)))
-
-(defun out-filter (symbol)
- (binding-type-out (get symbol 'binding-type)))
+(defun in-filter (symbol &rest args)
+ (let ((bto (binding-type-in (get symbol 'binding-type)))
+ (x (gensym "out-filter")))
+ (if bto
+ (if args
+ `(lambda (,x)
+ (,bto ,x ,@args))
+ bto)
+ (if args
+ (error "filter NIL does not accept parameters (obviously).")))))
+
+(defun out-filter (symbol &rest args)
+ (let ((bto (binding-type-out (get symbol 'binding-type)))
+ (x (gensym "out-filter")))
+ (if bto
+ (if args
+ `(lambda (,x)
+ (,bto ,x ,@args))
+ bto)
+ (if args
+ (error "filter NIL does not accept parameters (obviously).")))))
(defun buildform (func arg)
(if func (list func arg)
Index: lgtk/src/dynaslot.lisp
diff -u lgtk/src/dynaslot.lisp:1.1 lgtk/src/dynaslot.lisp:1.2
--- lgtk/src/dynaslot.lisp:1.1 Wed Nov 5 16:16:51 2003
+++ lgtk/src/dynaslot.lisp Mon Nov 10 15:44:47 2003
@@ -58,7 +58,8 @@
&key
(reader t)
(writer t)
- (export t))
+ (export t)
+ (destroy nil))
req
(let ((sname (intern (format nil "~A-~A" oname
(map 'string
@@ -67,7 +68,7 @@
`(
,(if reader
`(defmethod ,sname ((x ,oname))
- ,(buildform (out-filter type)
+ ,(buildform (out-filter type :destroy destroy)
`(peek (contents x) ,offs
,(alien-type type)))))
,(if writer
Index: lgtk/src/gtkclasshierarchy.lisp
diff -u lgtk/src/gtkclasshierarchy.lisp:1.3 lgtk/src/gtkclasshierarchy.lisp:1.4
--- lgtk/src/gtkclasshierarchy.lisp:1.3 Wed Nov 5 12:49:56 2003
+++ lgtk/src/gtkclasshierarchy.lisp Mon Nov 10 15:44:47 2003
@@ -55,7 +55,8 @@
(contents x)))))
(defmacro def-encapsulator (name type)
- `(defun ,name (x) (alien-encapsulate x ',type)))
+ `(defun ,name (x &key (destroy t))
+ (alien-encapsulate x ',type :destroy destroy)))
(defun gencap (symb)
(intern (format nil "~A-ENCAP" symb)))
Index: lgtk/src/gtklisp.lisp
diff -u lgtk/src/gtklisp.lisp:1.3 lgtk/src/gtklisp.lisp:1.4
--- lgtk/src/gtklisp.lisp:1.3 Wed Nov 5 12:49:56 2003
+++ lgtk/src/gtklisp.lisp Mon Nov 10 15:44:47 2003
@@ -106,7 +106,7 @@
it))))))
-(defun alien-encapsulate (realw capsule)
+(defun alien-encapsulate (realw capsule &key (destroy t))
(let ((addrnum (alien-address realw)))
(if (zerop addrnum) nil
(let ((isit (gethash (alien-address realw)
@@ -114,7 +114,8 @@
(if isit (capsule isit)
(let ((it (make-instance capsule
:contents realw
- :nexus *gtkobjects*)))
+ :nexus *gtkobjects*
+ :destroy-real-object destroy)))
it))))))
;; We need at least one destroy call to know it's over and remove
Index: lgtk/src/nexus.lisp
diff -u lgtk/src/nexus.lisp:1.3 lgtk/src/nexus.lisp:1.4
--- lgtk/src/nexus.lisp:1.3 Sun Nov 9 12:32:46 2003
+++ lgtk/src/nexus.lisp Mon Nov 10 15:44:47 2003
@@ -79,7 +79,8 @@
;; Do we destroy this on GC? Good question. On by default.
(destroy-real-object :accessor destroy-real-object
- :initform T)
+ :initarg :destroy-real-object
+ :initform T)
;; The nexus keeps a reference to it. Needed for bookkeeping.
(nexus :accessor nexus
@@ -105,12 +106,13 @@
(format t "~S ~S~%" a b))
(defmethod initialize-instance :after ((c capsule)
- &key contents nexus)
+ &key contents nexus destroy-real-object)
(setf (meta c)
(make-instance (meta c)
:contents contents
:capsule c
- :nexus nexus)))
+ :nexus nexus
+ :destroy-real-object destroy-real-object)))
;; Only defined on metas, but the user is king.
(defmethod destroy ((c capsule))