lib/sod-hosted.c (sod_makev): Use two statements rather than tricky expression.
[sod] / src / builtin.lisp
index 0787b8d..d07f539 100644 (file)
@@ -279,7 +279,7 @@ static const SodClass *const ~A__cpl[] = {
 
 (definst suppliedp-struct (stream) (flags var)
   (format stream
-         "~@<struct { ~2I~_~{unsigned ~A : 1;~^ ~_~} ~I~_} ~A;~:>"
+         "~@<struct { ~2I~_~{unsigned ~A: 1;~^ ~_~} ~I~_} ~A;~:>"
          flags var))
 
 ;; Initialization.
@@ -294,20 +294,30 @@ static const SodClass *const ~A__cpl[] = {
     ((message initialization-message))
   'initialization-effective-method)
 
-(defmethod method-keyword-argument-lists
-    ((method initialization-effective-method) direct-methods)
+(defmethod sod-message-keyword-argument-lists
+    ((message initialization-message) (class sod-class) direct-methods state)
   (append (call-next-method)
-         (delete-duplicates
-          (mapcan (lambda (class)
-                    (let ((initargs (sod-class-initargs class)))
-                      (and initargs
-                           (list (cons (mapcar #'sod-initarg-argument
-                                               initargs)
-                                       (format nil "initargs for ~A"
-                                               class))))))
-                  (sod-class-precedence-list
-                   (effective-method-class method)))
-          :key #'argument-name)))
+         (mapcan (lambda (class)
+                   (let* ((initargs (sod-class-initargs class))
+                          (map (make-hash-table))
+                          (arglist (mapcar
+                                    (lambda (initarg)
+                                      (let ((arg (sod-initarg-argument
+                                                  initarg)))
+                                        (setf (gethash arg map) initarg)
+                                        arg))
+                                    initargs)))
+                     (and initargs
+                          (list (cons (lambda (arg)
+                                        (info-with-location
+                                         (gethash arg map)
+                                         "Type `~A' from initarg ~
+                                          in class `~A' (here)"
+                                         (argument-type arg) class)
+                                        (report-inheritance-path
+                                         state class))
+                                      arglist)))))
+                 (sod-class-precedence-list class))))
 
 (defmethod lifecycle-method-kernel
     ((method initialization-effective-method) codegen target)
@@ -412,19 +422,20 @@ static const SodClass *const ~A__cpl[] = {
                (when (or init initargs)
                  (focus-this-class)
                  (let* ((slot-type (sod-slot-type dslot))
-                        (slot-default (sod-initializer-value init))
                         (target (format nil "~A.~A"
                                         isl (sod-slot-name dslot)))
-                        (initinst (set-from-initializer target
-                                                        slot-type
-                                                        slot-default)))
+                        (initinst (and init
+                                       (set-from-initializer
+                                        target slot-type
+                                        (sod-initializer-value init)))))
 
                    ;; If there are applicable initialization arguments,
                    ;; check to see whether they were supplied.
                    (dolist (initarg (reverse (remove-duplicates
                                               initargs
                                               :key #'sod-initarg-name
-                                              :test #'string=)))
+                                              :test #'string=
+                                              :from-end t)))
                      (let ((arg-name (sod-initarg-name initarg)))
                        (setf initinst (make-if-inst
                                        (format nil "suppliedp.~A" arg-name)
@@ -506,9 +517,11 @@ static const SodClass *const ~A__cpl[] = {
    instance of `SodClass', and `SodClass' is a subclass of `SodObject' (and
    an instance of itself)."
   (let* ((sod-object (make-sod-class "SodObject" nil
-                                    (make-property-set :nick 'obj)))
+                                    (make-property-set :nick 'obj
+                                                       :%bootstrapping t)))
         (sod-class (make-sod-class "SodClass" (list sod-object)
-                                   (make-property-set :nick 'cls)))
+                                   (make-property-set :nick 'cls
+                                                      :%bootstrapping t)))
         (classes (list sod-object sod-class)))
 
     ;; Attach the built-in messages.
@@ -541,11 +554,12 @@ static const SodClass *const ~A__cpl[] = {
 
     ;; Done.
     (dolist (class classes)
-      (finalize-sod-class class)
+      (unless (finalize-sod-class class)
+       (error "Failed to finalize built-in class"))
       (add-to-module module class))))
 
 (export '*builtin-module*)
-(defvar *builtin-module* nil
+(defvar-unbound *builtin-module*
   "The builtin module.")
 
 (export 'make-builtin-module)
@@ -564,8 +578,6 @@ static const SodClass *const ~A__cpl[] = {
                                                    :case :common)
                               :state nil)))
     (with-module-environment (module)
-      (dolist (name '("va_list" "size_t" "ptrdiff_t" "wchar_t"))
-       (add-to-module module (make-instance 'type-item :name name)))
       (flet ((header-name (name)
               (concatenate 'string "\"" (string-downcase name) ".h\""))
             (add-includes (reason &rest names)
@@ -584,6 +596,6 @@ static const SodClass *const ~A__cpl[] = {
     (setf *builtin-module* module)))
 
 (define-clear-the-decks builtin-module
-  (unless *builtin-module* (make-builtin-module)))
+  (unless (boundp '*builtin-module*) (make-builtin-module)))
 
 ;;;----- That's all, folks --------------------------------------------------