X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/sod/blobdiff_plain/cf7f1f46737b81d24253e49ec546fa0cc6c0d7c6..284f1fa2ace3e276052ff1bd7d66442500e693da:/src/method-proto.lisp diff --git a/src/method-proto.lisp b/src/method-proto.lisp index 41e6354..60a10eb 100644 --- a/src/method-proto.lisp +++ b/src/method-proto.lisp @@ -292,15 +292,13 @@ (defun invoke-method (codegen target arguments-tail direct-method) (convert-stmts codegen target (c-type-subtype (sod-method-type direct-method)) (lambda (var) - (ensure-var codegen *sod-tmp-ap* (c-type va-list)) - (emit-inst codegen - (make-va-copy-inst *sod-tmp-ap* - *sod-ap*)) - (deliver-expr codegen var - (make-call-inst function arguments)) - (emit-inst codegen - (make-va-end-inst *sod-tmp-ap*)))) - (deliver-expr codegen target (make-call-inst function arguments))))) + (ensure-var codegen *sod-tmp-ap* c-type-va-list) + (deliver-call codegen :void "va_copy" + *sod-tmp-ap* *sod-ap*) + (apply #'deliver-call codegen var + function arguments) + (deliver-call codegen :void "va_end" *sod-tmp-ap*))) + (apply #'deliver-call codegen target function arguments)))) (export 'ensure-ilayout-var) (defun ensure-ilayout-var (codegen super) @@ -338,8 +336,7 @@ (defun make-trampoline (codegen super body) (return-type (c-type-subtype message-type)) (raw-args (sod-message-argument-tail message)) (arguments (if (varargs-message-p message) - (cons (make-argument *sod-ap* - (c-type va-list)) + (cons (make-argument *sod-ap* c-type-va-list) (butlast raw-args)) raw-args))) (codegen-push codegen) @@ -410,7 +407,7 @@ (defun invoke-delegation-chain (codegen target basic-tail chain kernel) (make-trampoline codegen (sod-method-class method) (lambda (target) (invoke chain target))) - 0)) + *null-pointer*)) (invoke (chain target) (if (null chain) (funcall kernel target)