X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/blobdiff_plain/09f6e23711ab7b3b8f713f0cabdaeffcc7c4ac20..4a64c16d900f59a4e6b1ac57fc8658f6faabbcfc:/glib/gtype.lisp diff --git a/glib/gtype.lisp b/glib/gtype.lisp index 2a746e2..2498302 100644 --- a/glib/gtype.lisp +++ b/glib/gtype.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: gtype.lisp,v 1.38 2006-02-04 12:15:32 espen Exp $ +;; $Id: gtype.lisp,v 1.40 2006-02-06 11:52:24 espen Exp $ (in-package "GLIB") @@ -302,7 +302,6 @@ (default-alien-type-name class-name))) (warn "~A is the super type for ~A in the gobject type system." (supertype type-number) class-name)))) - (defmethod validate-superclass ((class ginstance-class) (super standard-class)) (subtypep (class-name super) 'ginstance)) @@ -320,7 +319,7 @@ (defun %type-number-of-ginstance (location) (let ((class (sap-ref-sap location 0))) (sap-ref-32 class 0))) -(defmethod ensure-proxy-instance ((class ginstance-class) location) +(defmethod make-proxy-instance :around ((class ginstance-class) location &rest initargs) (declare (ignore class)) (let ((class (labels ((find-known-class (type-number) (or @@ -328,10 +327,26 @@ (defmethod ensure-proxy-instance ((class ginstance-class) location) (unless (zerop type-number) (find-known-class (type-parent type-number)))))) (find-known-class (%type-number-of-ginstance location))))) + ;; Note that chancing the class argument must not alter "the + ;; ordered set of applicable methods" as specified in the + ;; Hyperspec (if class - (make-instance class :location (reference-foreign class location)) - (error "Object at ~A has an unkown type number: ~A" - location (%type-number-of-ginstance location))))) + (apply #'call-next-method class location initargs) + (error "Object at ~A has an unkown type number: ~A" + location (%type-number-of-ginstance location))))) + +(defmethod make-proxy-instance ((class ginstance-class) location &rest initargs) + (declare (ignore initargs)) + (reference-foreign class location) + ;; Since we make an explicit reference to the foreign object, we + ;; always have to release it when the proxy is garbage collected + ;; and therefor ignore the weak-p argument. + (call-next-method class location :weak nil)) + +(defmethod invalidate-instance ((instance ginstance)) + (declare (ignore instance)) + ;; A ginstance should never be invalidated since it is ref counted + nil) (defmethod copy-from-alien-form (location (class ginstance-class) &rest args) (declare (ignore location class args))