From: espen Date: Thu, 2 Feb 2006 22:35:12 +0000 (+0000) Subject: Added slot allocation :special for which are internal to the proxy system X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/commitdiff_plain/e2ebafb115b201d38b16f2ee7064b8514ea6b2e3 Added slot allocation :special for which are internal to the proxy system --- diff --git a/glib/gobject.lisp b/glib/gobject.lisp index e3f91f0..43a8da7 100644 --- a/glib/gobject.lisp +++ b/glib/gobject.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: gobject.lisp,v 1.37 2006-02-02 19:51:33 espen Exp $ +;; $Id: gobject.lisp,v 1.38 2006-02-02 22:35:12 espen Exp $ (in-package "GLIB") @@ -182,7 +182,7 @@ (defmethod shared-initialize :after ((class gobject-class) names &rest initargs) (when (some #'(lambda (slotd) (and (eq (slot-definition-allocation slotd) :instance) - (not (eq (slot-definition-name slotd) 'location)))) + (not (typep slotd 'effective-special-slot-definition)))) (class-slots class)) (setf (slot-value class 'instance-slots-p) t))) diff --git a/glib/proxy.lisp b/glib/proxy.lisp index 4292fe6..927e539 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.22 2006-02-02 18:37:46 espen Exp $ +;; $Id: proxy.lisp,v 1.23 2006-02-02 22:35:14 espen Exp $ (in-package "GLIB") @@ -40,31 +40,42 @@ (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)))) - - (defvar *unbound-marker* (gensym "UNBOUND-MARKER-")) - - (defun most-specific-slot-value (instances slot &optional - (default *unbound-marker*)) - (let ((object (find-if - #'(lambda (ob) - (and (slot-exists-p ob slot) (slot-boundp ob slot))) - instances))) - (if object - (slot-value object slot) - default)));) + (boundp :reader slot-definition-boundp :initarg :boundp))) + (defclass direct-special-slot-definition (standard-direct-slot-definition) + ()) + (defclass effective-special-slot-definition (standard-effective-slot-definition) + ())) + +(defvar *unbound-marker* (gensym "UNBOUND-MARKER-")) + +(defun most-specific-slot-value (instances slot &optional (default *unbound-marker*)) + (let ((object (find-if + #'(lambda (ob) + (and (slot-exists-p ob slot) (slot-boundp ob slot))) + instances))) + (if object + (slot-value object slot) + default))) + +(defmethod initialize-instance ((slotd effective-special-slot-definition) &rest initargs) + (declare (ignore initargs)) + (call-next-method) + (setf (slot-value slotd 'allocation) :instance)) + (defmethod direct-slot-definition-class ((class virtual-slots-class) &rest initargs) - (if (eq (getf initargs :allocation) :virtual) - (find-class 'direct-virtual-slot-definition) - (call-next-method))) + (case (getf initargs :allocation) + (:virtual (find-class 'direct-virtual-slot-definition)) + (:special (find-class 'direct-special-slot-definition)) + (t (call-next-method)))) (defmethod effective-slot-definition-class ((class virtual-slots-class) &rest initargs) - (if (eq (getf initargs :allocation) :virtual) - (find-class 'effective-virtual-slot-definition) - (call-next-method))) + (case (getf initargs :allocation) + (:virtual (find-class 'effective-virtual-slot-definition)) + (:special (find-class 'effective-special-slot-definition)) + (t (call-next-method)))) (defmethod initialize-internal-slot-functions ((slotd effective-virtual-slot-definition)) @@ -260,7 +271,8 @@ (defun list-cached-instances () ;;;; Proxy for alien instances (defclass proxy () - ((location :reader proxy-location :type system-area-pointer))) + ((location :allocation :special :reader proxy-location :type system-area-pointer)) + (:metaclass virtual-slots-class)) (defgeneric instance-finalizer (object)) (defgeneric reference-foreign (class location)) @@ -341,7 +353,7 @@ (defmethod shared-initialize ((class proxy-class) names &key size) (defmethod direct-slot-definition-class ((class proxy-class) &rest initargs) (case (getf initargs :allocation) - ((nil :alien) (find-class 'direct-alien-slot-definition)) + (:alien (find-class 'direct-alien-slot-definition)) (t (call-next-method)))) (defmethod effective-slot-definition-class ((class proxy-class) &rest initargs) @@ -524,6 +536,11 @@ (defmethod initialize-instance ((struct struct) &rest initargs) (defclass struct-class (proxy-class) ()) +(defmethod direct-slot-definition-class ((class struct-class) &rest initargs) + (if (not (getf initargs :allocation)) + (find-class 'direct-alien-slot-definition) + (call-next-method))) + (defmethod reference-foreign ((class struct-class) location) (copy-memory location (proxy-instance-size class)))