chiark / gitweb /
Added slot allocation :special for which are internal to the proxy system
authorespen <espen>
Thu, 2 Feb 2006 22:35:12 +0000 (22:35 +0000)
committerespen <espen>
Thu, 2 Feb 2006 22:35:12 +0000 (22:35 +0000)
glib/gobject.lisp
glib/proxy.lisp

index e3f91f0b051fd2c031708b12bd8d90a07a9d0e0e..43a8da7e9015b85265763024996f2a50b6713ef5 100644 (file)
@@ -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)))
 
index 4292fe6e2646f389631f637750354b370b1a9fe9..927e539a85111bf788fccd0455a9863ff38bb14a 100644 (file)
@@ -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)))