(defclass g-object ()
((pointer
- :type cffi:foreign-pointer
+ :type (or null cffi:foreign-pointer)
:initarg :pointer
:accessor pointer
:initform nil)
(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))
(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))