src/class-{finalize,layout}-impl.lisp: Error checking on layout slots.
[sod] / src / class-layout-impl.lisp
index 2e66fa1..7a2d9cc 100644 (file)
@@ -68,9 +68,9 @@
     ((slot sod-class-slot) slot-names &key pset)
   (declare (ignore slot-names))
   (default-slot (slot 'initializer-function)
-    (get-property pset :initializer-function t nil))
+    (get-property pset :initializer-function :func nil))
   (default-slot (slot 'prepare-function)
-    (get-property pset :prepare-function t nil)))
+    (get-property pset :prepare-function :func nil)))
 
 (export 'sod-class-effective-slot)
 (defclass sod-class-effective-slot (effective-slot)
 
 (defmethod print-object ((entry method-entry) stream)
   (maybe-print-unreadable-object (entry stream :type t)
-    (format stream "~A:~A"
+    (format stream "~A:~A~@[ ~S~]"
            (method-entry-effective-method entry)
-           (sod-class-nickname (method-entry-chain-head entry)))))
+           (sod-class-nickname (method-entry-chain-head entry))
+           (method-entry-role entry))))
 
 (defmethod compute-sod-effective-method
     ((message sod-message) (class sod-class))
                    (sod-class-messages super)))
          (sod-class-precedence-list class)))
 
-(defmethod slot-unbound
-    (clos-class (class sod-class) (slot-name (eql 'effective-methods)))
-  (setf (slot-value class 'effective-methods)
-       (compute-effective-methods class)))
-
 ;;;--------------------------------------------------------------------------
 ;;; Instance layout.
 
                                                    (reverse chain)))
                                  (sod-class-chains class))))
 
-(defmethod slot-unbound
-    (clos-class (class sod-class) (slot-name (eql 'ilayout)))
-  (setf (slot-value class 'ilayout)
-       (compute-ilayout class)))
-
 ;;;--------------------------------------------------------------------------
 ;;; Vtable layout.
 
      (subclass sod-class)
      (chain-head sod-class)
      (chain-tail sod-class))
-  (flet ((make-entry (message)
+  (flet ((make-entries (message)
           (let ((method (find message
                               (sod-class-effective-methods subclass)
                               :key #'effective-method-message)))
-            (make-method-entry method chain-head chain-tail))))
+            (make-method-entries method chain-head chain-tail))))
     (make-instance 'vtmsgs
                   :class class
                   :subclass subclass
                   :chain-head chain-head
                   :chain-tail chain-tail
-                  :entries (mapcar #'make-entry
+                  :entries (mapcan #'make-entries
                                    (sod-class-messages class)))))
 
 ;;; class-pointer
            (compute-vtable class (reverse chain)))
          (sod-class-chains class)))
 
-(defmethod slot-unbound
-    (clos-class (class sod-class) (slot-name (eql 'vtables)))
-  (setf (slot-value class 'vtables)
-       (compute-vtables class)))
-
 ;;;----- That's all, folks --------------------------------------------------