Check the libraries' versions requirement and throw compile-time error; add libraries...
[cl-gtk2.git] / glib / gobject.object.high.lisp
index 099bf5f..f1cca2e 100644 (file)
@@ -2,7 +2,7 @@
 
 (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))