X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=glib%2Fgobject.object.high.lisp;h=f1cca2ed331c5814fc35ce2db7625ea1823d7cf7;hb=bcc0750a3031ca5bfb5d1084f56e60e1ab991973;hp=099bf5f6b7acffeb156cbea7d103277d288408e5;hpb=9a3426bbcb6d7baf71211658a83d18914f73dc04;p=cl-gtk2.git diff --git a/glib/gobject.object.high.lisp b/glib/gobject.object.high.lisp index 099bf5f..f1cca2e 100644 --- a/glib/gobject.object.high.lisp +++ b/glib/gobject.object.high.lisp @@ -2,7 +2,7 @@ (defclass g-object () ((pointer - :type cffi:foreign-pointer + :type (or null cffi:foreign-pointer) :initarg :pointer :accessor pointer :initform nil) @@ -23,9 +23,22 @@ (defvar *current-object-from-pointer* nil) (defvar *currently-making-object-p* nil) +(at-finalize () + (clrhash *foreign-gobjects-weak*) + (clrhash *foreign-gobjects-strong*) + (setf *current-creating-object* nil + *current-object-from-pointer* nil + *currently-making-object-p* nil)) + (defun ref-count (pointer) (foreign-slot-value (if (pointerp pointer) pointer (pointer pointer)) 'g-object-struct :ref-count)) +(defmethod release ((obj g-object)) + (cancel-finalization obj) + (let ((p (pointer obj))) + (setf (pointer obj) nil) + (g-object-dispose-carefully p))) + (defmethod initialize-instance :around ((obj g-object) &key) (when *currently-making-object-p* (setf *currently-making-object-p* t)) @@ -198,7 +211,7 @@ (defmethod translate-from-foreign (pointer (type foreign-g-object-type)) (let ((object (get-g-object-for-pointer pointer))) - (when (foreign-g-object-type-already-referenced type) + (when (and object (foreign-g-object-type-already-referenced type)) (g-object-unref (pointer object))) object))