X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/blobdiff_plain/112ac1d33aa8f9b7f3d2f9542d15431f152b1d35..982a215a2ef5b2f35a0f4430ff9a6836e0317f75:/glib/proxy.lisp diff --git a/glib/proxy.lisp b/glib/proxy.lisp index 21ac887..4292fe6 100644 --- a/glib/proxy.lisp +++ b/glib/proxy.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: proxy.lisp,v 1.20 2005-04-23 16:48:51 espen Exp $ +;; $Id: proxy.lisp,v 1.22 2006-02-02 18:37:46 espen Exp $ (in-package "GLIB") @@ -226,15 +226,19 @@ (defmethod validate-superclass (internal *instance-cache*) (defvar *instance-cache* (make-hash-table :test #'eql)) -(defun cache-instance (instance) +(defun cache-instance (instance &optional (weak-ref t)) (setf (gethash (sap-int (proxy-location instance)) *instance-cache*) - (make-weak-pointer instance))) + (if weak-ref + (make-weak-pointer instance) + instance))) (defun find-cached-instance (location) (let ((ref (gethash (sap-int location) *instance-cache*))) (when ref - (weak-pointer-value ref)))) + (if (weak-pointer-p ref) + (weak-pointer-value ref) + ref)))) (defun instance-cached-p (location) (gethash (sap-int location) *instance-cache*)) @@ -243,11 +247,11 @@ (defun remove-cached-instance (location) (remhash (sap-int location) *instance-cache*)) ;; For debuging -(defun cached-instances () +(defun list-cached-instances () (let ((instances ())) (maphash #'(lambda (location ref) (declare (ignore location)) - (push (weak-pointer-value ref) instances)) + (push ref instances)) *instance-cache*) instances)) @@ -258,7 +262,6 @@ (defun cached-instances () (defclass proxy () ((location :reader proxy-location :type system-area-pointer))) -(defgeneric initialize-proxy (object &rest initargs)) (defgeneric instance-finalizer (object)) (defgeneric reference-foreign (class location)) (defgeneric unreference-foreign (class location)) @@ -538,3 +541,24 @@ (defmethod reference-foreign ((class static-struct-class) location) (defmethod unreference-foreign ((class static-struct-class) location) (declare (ignore class location)) nil) + + +;;; Pseudo type for structs which are inlined in other objects + +(defmethod size-of ((type (eql 'inlined)) &rest args) + (declare (ignore type)) + (proxy-instance-size (first args))) + +(defmethod reader-function ((type (eql 'inlined)) &rest args) + (declare (ignore type)) + (destructuring-bind (class) args + #'(lambda (location &optional (offset 0)) + (ensure-proxy-instance class + (reference-foreign class (sap+ location offset)))))) + +(defmethod destroy-function ((type (eql 'inlined)) &rest args) + (declare (ignore args)) + #'(lambda (location &optional (offset 0)) + (declare (ignore location offset)))) + +(export 'inlined)