X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=glib%2Fgobject.foreign.lisp;h=65e08b833312dba5ecf24a22409ae21aac44ae10;hb=c56a43f28a86b1972dcde923318f856f75f65cd5;hp=79d010ff22a1e793ad3cfa80175063e60f314995;hpb=0d03b82a77743d2ea5ef69bea08735fa12857d92;p=cl-gtk2.git diff --git a/glib/gobject.foreign.lisp b/glib/gobject.foreign.lisp index 79d010f..65e08b8 100644 --- a/glib/gobject.foreign.lisp +++ b/glib/gobject.foreign.lisp @@ -1,14 +1,22 @@ (in-package :gobject) -(defgeneric release (object)) +(defgeneric release (object) + (:documentation "Manually frees the Lisp reference to the @code{object}. Probably should not be called. + +@arg[object]{an instance of @class{g-object}}")) + +(defmethod release ((object null))) (defun release* (&rest objects) + "Calls @fun{release} on all objects in @code{objects} + +@arg[objects]{a list of instances of @class{g-object}}" (declare (dynamic-extent objects)) (loop for object in objects do (release object))) -(defmacro using ((var expr) &body body) +(defmacro using ((var &optional (expr var)) &body body) `(let ((,var ,expr)) (unwind-protect (progn ,@body) @@ -16,7 +24,7 @@ (defun using-expand (bindings body) (if bindings - (destructuring-bind (var expr) (first bindings) + (destructuring-bind (var &optional (expr var)) (ensure-list (first bindings)) `(let ((,var ,expr)) (unwind-protect ,(using-expand (rest bindings) body) @@ -25,27 +33,3 @@ (defmacro using* ((&rest bindings) &body body) (using-expand bindings body)) - -(defvar *registered-stable-pointers* (make-array 0 :adjustable t :fill-pointer t)) - -(defun allocate-stable-pointer (thing) - (let ((id (find-fresh-id))) - (setf (aref *registered-stable-pointers* id) thing) - (make-pointer id))) - -(defun free-stable-pointer (stable-pointer) - (setf (aref *registered-stable-pointers* (pointer-address stable-pointer)) nil)) - -(defun get-stable-pointer-value (stable-pointer) - (aref *registered-stable-pointers* (pointer-address stable-pointer))) - -(defun find-fresh-id () - (or (position nil *registered-stable-pointers*) - (progn (vector-push-extend nil *registered-stable-pointers*) - (1- (length *registered-stable-pointers*))))) - -(defmacro with-stable-pointer ((ptr expr) &body body) - `(let ((,ptr (allocate-stable-pointer ,expr))) - (unwind-protect - (progn ,@body) - (free-stable-pointer ,ptr)))) \ No newline at end of file