;; We need each message's method entry type for this, so we need to dig it
;; out of the vtmsgs structure. Indeed, the vtmsgs for this class contains
;; entries for precisely the messages we want to make macros for.
+ (when (some #'varargs-message-p (sod-class-messages class))
+ (one-off-output 'varargs-macros sequencer :early-decls
+ (lambda (stream)
+ (format stream
+ "~%SOD__VARARGS_MACROS_PREAMBLE~%"))))
(when (sod-class-messages class)
(sequence-output (stream sequencer)
((class :message-macros)
(push name in-names)
(push name out-names)))))
(when varargsp
- (format stream "#if __STDC_VERSION__ >= 199901~%"))
+ (format stream "#ifdef SOD__HAVE_VARARGS_MACROS~%"))
(format stream "#define ~A(~{~A~^, ~}) ~
~A->_vt->~A.~A(~{~A~^, ~})~%"
(message-macro-name class entry)
(defmethod hook-output progn
((method sod-method) (reason (eql :c)) sequencer)
- (with-slots ((class %class) body) method
+ (with-slots ((class %class) role body message) method
(unless body
(return-from hook-output))
(sequence-output (stream sequencer)
:constraint ((class :direct-methods :start)
+ (class :direct-method method :banner)
(class :direct-method method :start)
(class :direct-method method :body)
(class :direct-method method :end)
(class :direct-methods :end))
+ ((class :direct-method method :banner)
+ (format-banner-comment stream "Direct ~@[~(~A~) ~]method ~:_~
+ on `~A.~A' ~:_defined by `~A'."
+ role
+ (sod-class-nickname
+ (sod-message-class message))
+ (sod-message-name message)
+ class)
+ (fresh-line stream))
((class :direct-method method :body)
(pprint-c-type (sod-method-function-type method)
stream