X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/sod/blobdiff_plain/73eceea64f35d47eeecb808cb7bfecb6bac4299b..refs/heads/mdw/progfmt:/src/builtin.lisp diff --git a/src/builtin.lisp b/src/builtin.lisp index 5897da0..6310741 100644 --- a/src/builtin.lisp +++ b/src/builtin.lisp @@ -278,6 +278,16 @@ (default (sod-initarg-default initarg))) list)) (definst suppliedp-struct (stream) (flags var) + "Declare a `suppliedp' structure VAR containing a bit for each named FLAG. + + The output looks like this: + + struct { + unsigned FLAG: 1; + /* ... */ + } VAR; + + Note that this will not be valid C unless there is at least one flag." (format stream "~@" flags var)) @@ -294,8 +304,8 @@ (defmethod sod-message-effective-method-class ((message initialization-message)) 'initialization-effective-method) -(defmethod method-keyword-argument-lists - ((method initialization-effective-method) direct-methods state) +(defmethod sod-message-keyword-argument-lists + ((message initialization-message) (class sod-class) direct-methods state) (append (call-next-method) (mapcan (lambda (class) (let* ((initargs (sod-class-initargs class)) @@ -317,8 +327,7 @@ (defmethod method-keyword-argument-lists (report-inheritance-path state class)) arglist))))) - (sod-class-precedence-list - (effective-method-class method))))) + (sod-class-precedence-list class)))) (defmethod lifecycle-method-kernel ((method initialization-effective-method) codegen target) @@ -423,19 +432,20 @@ (default (argument-default arg)) (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)