X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/blobdiff_plain/12b7df041a52d531724e41e2fcb60b07f8db71e5..73572c12ccd49c661d06287903bfa725f5fd93a5:/glib/proxy.lisp diff --git a/glib/proxy.lisp b/glib/proxy.lisp index e1131d4..6ad8b90 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.17 2004-12-26 11:40:14 espen Exp $ +;; $Id: proxy.lisp,v 1.19 2005-02-03 23:09:04 espen Exp $ (in-package "GLIB") @@ -35,7 +35,7 @@ (defclass effective-virtual-slot-definition (standard-effective-slot-definitio ((setter :reader slot-definition-setter :initarg :setter) (getter :reader slot-definition-getter :initarg :getter) (unbound :reader slot-definition-unbound :initarg :unbound) - (boundp :reader slot-definition-boundp :initarg :boundp))) + (boundp :reader slot-definition-boundp :initarg :boundp)))) (defvar *unbound-marker* (gensym "UNBOUND-MARKER-")) @@ -47,7 +47,7 @@ (default *unbound-marker*)) instances))) (if object (slot-value object slot) - default)))) + default)));) @@ -223,26 +223,26 @@ (defvar *instance-cache* (make-hash-table :test #'eql)) (defun cache-instance (instance) (setf - (gethash (system:sap-int (proxy-location instance)) *instance-cache*) - (ext:make-weak-pointer instance))) + (gethash (sap-int (proxy-location instance)) *instance-cache*) + (make-weak-pointer instance))) (defun find-cached-instance (location) - (let ((ref (gethash (system:sap-int location) *instance-cache*))) + (let ((ref (gethash (sap-int location) *instance-cache*))) (when ref - (ext:weak-pointer-value ref)))) + (weak-pointer-value ref)))) (defun instance-cached-p (location) - (gethash (system:sap-int location) *instance-cache*)) + (gethash (sap-int location) *instance-cache*)) (defun remove-cached-instance (location) - (remhash (system:sap-int location) *instance-cache*)) + (remhash (sap-int location) *instance-cache*)) ;; For debuging (defun cached-instances () (let ((instances ())) (maphash #'(lambda (location ref) (declare (ignore location)) - (push (ext:weak-pointer-value ref) instances)) + (push (weak-pointer-value ref) instances)) *instance-cache*) instances)) @@ -283,7 +283,7 @@ (defmethod initialize-instance :around ((instance proxy) &key location) (setf (slot-value instance 'location) location) (call-next-method)) (cache-instance instance) - (ext:finalize instance (instance-finalizer instance)) + (finalize instance (instance-finalizer instance)) instance) (defmethod instance-finalizer ((instance proxy)) @@ -298,6 +298,10 @@ (defmethod instance-finalizer ((instance proxy)) ;;;; Metaclass used for subclasses of proxy +(defgeneric most-specific-proxy-superclass (class)) +(defgeneric direct-proxy-superclass (class)) + + (eval-when (:compile-toplevel :load-toplevel :execute) (defclass proxy-class (virtual-slots-class) ((size :reader proxy-instance-size))) @@ -309,13 +313,12 @@ (defclass direct-alien-slot-definition (direct-virtual-slot-definition) (defclass effective-alien-slot-definition (effective-virtual-slot-definition) ((offset :reader slot-definition-offset :initarg :offset))) - (defmethod most-specific-proxy-superclass ((class proxy-class)) (find-if #'(lambda (class) (subtypep (class-name class) 'proxy)) (cdr (compute-class-precedence-list class)))) - + (defmethod direct-proxy-superclass ((class proxy-class)) (find-if #'(lambda (class) @@ -402,6 +405,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) @@ -445,7 +451,7 @@ (defmethod copy-to-alien-form (instance (class proxy-class) &rest args) `(reference-foreign ',(class-name class) (proxy-location ,instance))) (defmethod copy-to-alien-function ((class proxy-class) &rest args) - (declare (ignore class args)) + (declare (ignore args)) #'(lambda (instance) (reference-foreign class (proxy-location instance)))) @@ -470,7 +476,7 @@ (defmethod destroy-function ((class proxy-class) &rest args) (unreference-foreign class (sap-ref-sap location offset)))) (defmethod unbound-value ((class proxy-class) &rest args) - (declare (ignore type args)) + (declare (ignore args)) (values t nil)) (defgeneric ensure-proxy-instance (class location) @@ -501,7 +507,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))