X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/sod/blobdiff_plain/fd040f066b906ce63396b9703bc16d32bcc5204e..7aa55c1174f170016d970a3f5e86d5115f02611c:/src/builtin.lisp diff --git a/src/builtin.lisp b/src/builtin.lisp index c10e5ad..776d3a1 100644 --- a/src/builtin.lisp +++ b/src/builtin.lisp @@ -294,20 +294,30 @@ (defmethod sod-message-effective-method-class ((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) @@ -506,9 +516,11 @@ (defun bootstrap-classes (module) 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 +553,12 @@ (defun bootstrap-classes (module) ;; 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 +577,6 @@ (defun make-builtin-module () :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 +595,6 @@ (defun make-builtin-module () (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 --------------------------------------------------