(c-function-arguments (sod-message-type message)))))
(define-on-demand-slot basic-message no-varargs-tail (message)
- (mapcar (lambda (arg)
- (if (eq arg :ellipsis)
- (make-argument *sod-ap* c-type-va-list)
- arg))
- (sod-message-argument-tail message)))
+ (reify-variable-argument-tail (sod-message-argument-tail message)))
(defmethod sod-message-method-class
((message basic-message) (class sod-class) pset)
(message sod-message)
(type c-function-type))
(with-slots ((msgtype %type)) message
- (unless (c-type-equal-p (c-type-subtype type) c-type-void)
- (error "Method return type ~A must be `void'" (c-type-subtype type)))
- (unless (argument-lists-compatible-p (c-function-arguments msgtype)
- (c-function-arguments type))
- (error "Method arguments ~A don't match message ~A" type msgtype))))
+ (check-method-return-type type c-type-void)
+ (check-method-argument-lists type msgtype)))
(export 'delegating-direct-method)
(defclass delegating-direct-method (basic-direct-method)
;; Effective method function details.
(emf-name (effective-method-function-name method))
(ilayout-type (c-type (* (struct (ilayout-struct-tag class)))))
- (emf-arg-tail (sod-message-no-varargs-tail message))
(emf-type (c-type (fun (lisp return-type)
("sod__obj" (lisp ilayout-type))
- . emf-arg-tail))))
+ . entry-args))))
(flet ((setup-entry (tail)
(let ((head (sod-class-chain-head tail)))
(effective-method-class method))
(let ((call (apply #'make-call-inst emf-name "sod__obj"
- (mapcar #'argument-name emf-arg-tail))))
+ (mapcar #'argument-name entry-args))))
(dolist (tail chain-tails)
(setup-entry tail)
(deliver-expr codegen entry-target call)