X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/blobdiff_plain/933a3dfb63b5922332ff7837ac4d0f5a7f06cf13..e67c4de7fcead59aade10f8d49fb2260e7677baf:/glib/gparam.lisp diff --git a/glib/gparam.lisp b/glib/gparam.lisp index 22b71f4..a923b5d 100644 --- a/glib/gparam.lisp +++ b/glib/gparam.lisp @@ -20,7 +20,7 @@ ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -;; $Id: gparam.lisp,v 1.22 2007/02/23 12:50:54 espen Exp $ +;; $Id: gparam.lisp,v 1.25 2007/07/03 08:43:21 espen Exp $ (in-package "GLIB") @@ -33,7 +33,7 @@ (defbinding (size-of-gvalue "size_of_gvalue") () unsigned-int)) (defconstant +gvalue-size+ (size-of-gvalue)) (defconstant +gvalue-value-offset+ - (max (size-of 'type-number) (type-alignment 'type-number))) + (max (size-of 'type-number) (type-alignment '(unsigned-byte 64)))) (defbinding (%gvalue-init "g_value_init") () nil (value gvalue) @@ -61,7 +61,20 @@ (defun gvalue-free (gvalue &optional (unset-p t)) (deallocate-memory gvalue))) (defun gvalue-type (gvalue) - (type-from-number (ref-type-number gvalue))) + ;; We need to search for the for the most specific known type + ;; because internal types, unknown to Lisp, may be passed in GValues + (labels ((find-most-specific-known-type (type) + (or + (type-from-number type) + (let ((parent (type-parent type))) + (unless (zerop parent) + (find-most-specific-known-type parent)))))) + (let ((type-number (ref-type-number gvalue))) + (unless (zerop type-number) + (or + (find-most-specific-known-type type-number) + ;; This will signal an error if the type hierarchy is unknown + (type-from-number type-number t)))))) (defun gvalue-get (gvalue) (funcall (reader-function (gvalue-type gvalue))