X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/blobdiff_plain/eeda1c2da2663832d114329d58e92f77c86cf2fa..a00ba56aaff960675ed216a015ee9577a7c68cb8:/glib/proxy.lisp diff --git a/glib/proxy.lisp b/glib/proxy.lisp index 72f201f..2e47394 100644 --- a/glib/proxy.lisp +++ b/glib/proxy.lisp @@ -15,7 +15,7 @@ ;; License along with this library; if not, write to the Free Software ;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -;; $Id: proxy.lisp,v 1.15 2004-12-16 23:19:17 espen Exp $ +;; $Id: proxy.lisp,v 1.18 2005-01-12 13:35:19 espen Exp $ (in-package "GLIB") @@ -84,23 +84,20 @@ (defmethod initialize-internal-slot-functions ((slotd effective-virtual-slot-def (setf (slot-value slotd 'reader-function) #'(lambda (object) (unless reader - (setq reader - (mkbinding getter - (slot-definition-type slotd) 'pointer))) + (setq reader + (mkbinding getter + (slot-definition-type slotd) 'pointer))) (funcall reader (proxy-location object)))))))))) (setf (slot-value slotd 'boundp-function) (cond - ((and - (not (slot-boundp slotd 'unbound)) - (not (slot-boundp slotd 'boundp))) - #'(lambda (object) (declare (ignore object)) t)) ((slot-boundp slotd 'unbound) (let ((unbound-value (slot-value slotd 'unbound))) - (lambda (object) - (not (eq (funcall getter-function object) unbound-value))))) - ((let ((boundp (slot-value slotd 'boundp))) + #'(lambda (object) + (not (eq (funcall getter-function object) unbound-value))))) + ((slot-boundp slotd 'boundp) + (let ((boundp (slot-value slotd 'boundp))) (etypecase boundp (function boundp) (symbol #'(lambda (object) @@ -111,7 +108,13 @@ (defmethod initialize-internal-slot-functions ((slotd effective-virtual-slot-def (setq reader (mkbinding boundp (slot-definition-type slotd) 'pointer))) - (funcall reader (proxy-location object)))))))))) + (funcall reader (proxy-location object)))))))) + ((multiple-value-bind (unbound-p unbound-value) + (unbound-value (slot-definition-type slotd)) + (when unbound-p + #'(lambda (object) + (not (eq (funcall getter-function object) unbound-value)))))) + (#'(lambda (object) (declare (ignore object)) t)))) (setf (slot-value slotd 'reader-function) @@ -119,17 +122,26 @@ (defmethod initialize-internal-slot-functions ((slotd effective-virtual-slot-def ((slot-boundp slotd 'unbound) (let ((unbound (slot-value slotd 'unbound)) (slot-name (slot-definition-name slotd))) - (lambda (object) - (let ((value (funcall getter-function object))) - (if (eq value unbound) - (slot-unbound (class-of object) object slot-name) - value))))) + #'(lambda (object) + (let ((value (funcall getter-function object))) + (if (eq value unbound) + (slot-unbound (class-of object) object slot-name) + value))))) ((slot-boundp slotd 'boundp) (let ((boundp-function (slot-value slotd 'boundp-function))) - (lambda (object) - (and - (funcall boundp-function object) - (funcall getter-function object))))) + #'(lambda (object) + (and + (funcall boundp-function object) + (funcall getter-function object))))) + ((multiple-value-bind (unbound-p unbound-value) + (unbound-value (slot-definition-type slotd)) + (let ((slot-name (slot-definition-name slotd))) + (when unbound-p + #'(lambda (object) + (let ((value (funcall getter-function object))) + (if (eq value unbound-value) + (slot-unbound (class-of object) object slot-name) + value))))))) (getter-function))))) (setf @@ -246,6 +258,12 @@ (defgeneric instance-finalizer (object)) (defgeneric reference-foreign (class location)) (defgeneric unreference-foreign (class location)) +(defmethod reference-foreign ((name symbol) location) + (reference-foreign (find-class name) location)) + +(defmethod unreference-foreign ((name symbol) location) + (unreference-foreign (find-class name) location)) + (defmethod unreference-foreign :around ((class class) location) (unless (null-pointer-p location) ;; (format t "Unreferencing ~A at ~A" (class-name class) location) @@ -357,7 +375,11 @@ (defconstant +struct-alignmen+ 4) (defmethod compute-slots ((class proxy-class)) (loop - with offset = (proxy-instance-size (most-specific-proxy-superclass class)) + with offset = (let ((size-of-super-classes + (proxy-instance-size + (most-specific-proxy-superclass class)))) + (+ size-of-super-classes + (mod size-of-super-classes +struct-alignmen+))) with size = offset for slotd in (class-direct-slots class) when (eq (slot-definition-allocation slotd) :alien) @@ -380,6 +402,9 @@ (defmethod validate-superclass ((class proxy-class) (super standard-class)) (defmethod proxy-instance-size (class) (declare (ignore class)) 0) + + (defmethod proxy-instance-size ((class-name symbol)) + (proxy-instance-size (find-class class-name))) ) (defmethod alien-type ((class proxy-class) &rest args) @@ -447,6 +472,9 @@ (defmethod destroy-function ((class proxy-class) &rest args) #'(lambda (location &optional (offset 0)) (unreference-foreign class (sap-ref-sap location offset)))) +(defmethod unbound-value ((class proxy-class) &rest args) + (declare (ignore args)) + (values t nil)) (defgeneric ensure-proxy-instance (class location) (:documentation "Returns a proxy object representing the foreign object at the give location.")) @@ -476,7 +504,7 @@ (defmethod initialize-instance ((struct struct) &rest initargs) (let ((size (proxy-instance-size (class-of struct)))) (if (zerop size) (error "~A has zero size" (class-of struct)) - (setf (slot-value struct 'location) (allocate-memory size))))) + (setf (slot-value struct 'location) (allocate-memory size))))) (call-next-method))