Another day, another commit.
[sod] / builtin.lisp
index 21fa1e3..67c04c1 100644 (file)
 (defun output-imprint-function (class stream)
   (let ((ilayout (sod-class-ilayout class)))
     (format stream "~&~:
+/* Imprint raw memory with instance structure. */
 static void *~A__imprint(void *p)
 {
   struct ~A *sod__obj = p;
 
-  ~:{sod__obj.~A._vt = &~A;~:^~%  ~}
+  ~:{sod__obj.~A.~A._vt = &~A;~:^~%  ~}
   return (p);
 }~2%"
            class
            (ilayout-struct-tag class)
            (mapcar (lambda (ichain)
-                     (list (sod-class-nickname (ichain-head ichain))
-                           (vtable-name class (ichain-head ichain))))
+                     (let* ((head (ichain-head ichain))
+                            (tail (ichain-tail ichain)))
+                       (list (sod-class-nickname head)
+                             (sod-class-nickname tail)
+                             (vtable-name class head))))
                    (ilayout-ichains ilayout)))))
 
 (defun output-init-function (class stream)
@@ -55,8 +59,9 @@ static void *~A__init(void *p)
            class
            (ilayout-struct-tag class))
     (dolist (ichain (ilayout-ichains ilayout))
-      (let ((ich (format nil "sod__obj.~A"
-                        (sod-class-nickname (ichain-head ichain)))))
+      (let ((ich (format nil "sod__obj.~A.~A"
+                        (sod-class-nickname (ichain-head ichain))
+                        (sod-class-nickname (ichain-tail ichain)))))
        (dolist (item (ichain-body ichain))
          (etypecase item
            (vtable-pointer
@@ -73,11 +78,11 @@ static void *~A__init(void *p)
                     (ecase (sod-initializer-value-kind init)
                       (:single
                        (format stream "  ~A = ~A;~%"
-                               isl (sod-initializer-value-form slot)))
+                               isl (sod-initializer-value-form init)))
                       (:compound
                        (format stream "  ~A = (~A)~A;~%"
                                isl (sod-slot-type dslot)
-                               (sod-initializer-value-form slot)))))))))))))
+                               (sod-initializer-value-form init)))))))))))))
     (format stream "~&~:
   return (p);
 }~2%")))
@@ -86,6 +91,7 @@ static void *~A__init(void *p)
   (let ((supers (sod-class-direct-superclasses class)))
     (when supers
       (format stream "~&~:
+/* Direct superclasses. */
 static const SodClass *const ~A__supers[] = {
   ~{~A__class~^,~%  ~}
 };~2%"
@@ -93,6 +99,7 @@ static const SodClass *const ~A__supers[] = {
 
 (defun output-cpl-vector (class stream)
   (format stream "~&~:
+/* Class precedence list. */
 static const SodClass *const ~A__cpl[] = {
   ~{~A__class~^,~%  ~}
 };~2%"
@@ -101,8 +108,9 @@ static const SodClass *const ~A__cpl[] = {
 (defun output-chains-vector (class stream)
   (let ((chains (sod-class-chains class)))
     (format stream "~&~:
+/* Chain structure. */
 ~1@*~:{static const SodClass *const ~A__chain_~A[] = {
-~{  ~A__class~^,~%~}
+  ~{~A__class~^,~%  ~}
 };~:^~2%~}
 
 ~0@*static const struct sod_chain ~A__chains[] = {
@@ -137,6 +145,14 @@ static const SodClass *const ~A__cpl[] = {
    of the information (name, type, and how to initialize them) about these
    slots in one place, so that's what we do here."))
 
+(defclass sod-magic-class-initializer (sod-class-initializer)
+  ((initializer-function :initarg :initializer-function
+                        :type (or symbol function)
+                        :reader sod-initializer-function)
+   (prepare-function  :initarg :prepare-function
+                     :type (or symbol function)
+                     :reader sod-initializer-prepare-function)))
+
 (defmethod shared-initialize :after
     ((slot sod-class-slot) slot-names &key pset)
   (declare (ignore slot-names))
@@ -160,7 +176,7 @@ static const SodClass *const ~A__cpl[] = {
 
 (defmethod compute-effective-slot ((class sod-class) (slot sod-class-slot))
   (make-instance 'sod-class-effective-slot
-                :slot slot
+                :class class :slot slot
                 :initializer-function (sod-slot-initializer-function slot)
                 :prepare-function (sod-slot-prepare-function slot)
                 :initializer (find-slot-initializer class slot)))
@@ -188,12 +204,12 @@ static const SodClass *const ~A__cpl[] = {
                 (format nil "sizeof(struct ~A)"
                         (ilayout-struct-tag class))))
     ("imprint" ,(c-type (* (fun (* void) ("/*p*/" (* void)))))
-              :prepare-function 'output-imprint-function
+              :prepare-function output-imprint-function
               :initializer-function
               ,(lambda (class)
                  (format nil "~A__imprint" class)))
     ("init" ,(c-type (* (fun (* void) ("/*p*/" (* void)))))
-           :prepare-function 'output-init-function
+           :prepare-function output-init-function
            :initializer-function
            ,(lambda (class)
               (format nil "~A__init" class)))
@@ -204,7 +220,7 @@ static const SodClass *const ~A__cpl[] = {
                ,(lambda (class)
                   (length (sod-class-direct-superclasses class))))
     ("supers" ,(c-type (* (* (class "SodClass" :const) :const)))
-             :prepare-function 'output-supers-vector
+             :prepare-function output-supers-vector
              :initializer-function
              ,(lambda (class)
                 (if (sod-class-direct-superclasses class)
@@ -215,7 +231,7 @@ static const SodClass *const ~A__cpl[] = {
                ,(lambda (class)
                   (length (sod-class-precedence-list class))))
     ("cpl" ,(c-type (* (* (class "SodClass" :const) :const)))
-          :prepare-function 'output-cpl-vector
+          :prepare-function output-cpl-vector
           :initializer-function
           ,(lambda (class)
              (format nil "~A__cpl" class)))
@@ -241,7 +257,7 @@ static const SodClass *const ~A__cpl[] = {
                ,(lambda (class)
                   (length (sod-class-chains class))))
     ("chains" ,(c-type (* (struct "sod_chain" :const)))
-             :prepare-function 'output-chains-vector
+             :prepare-function output-chains-vector
              :initializer-function
              ,(lambda (class)
                 (format nil "~A__chains" class)))