X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/2c6153373f927d948a74b283ebb16330af8ee49a..d5fdd49e70b734b791eb907706f92da5775e2a8b:/src/method-impl.lisp diff --git a/src/method-impl.lisp b/src/method-impl.lisp index f2d71aa..be33ecd 100644 --- a/src/method-impl.lisp +++ b/src/method-impl.lisp @@ -60,6 +60,10 @@ ((nil) (error "How odd: a primary method slipped through the net")) (t (error "Unknown method role ~A" role))))) +(defmethod sod-message-receiver-type ((message sod-message) + (class sod-class)) + (c-type (* (class class)))) + (export 'simple-message) (defclass simple-message (basic-message) () @@ -149,7 +153,8 @@ (when (keyword-message-p message) (setf method-args (fix-up-keyword-method-args method method-args))) (c-type (fun (lisp (c-type-subtype type)) - ("me" (* (class (sod-method-class method)))) + ("me" (lisp (sod-message-receiver-type + message (sod-method-class method)))) . method-args)))) (defmethod sod-method-description ((method basic-direct-method)) @@ -218,7 +223,8 @@ (t msgargs)))) (c-type (fun (lisp return-type) - ("me" (* (class (sod-method-class method)))) + ("me" (lisp (sod-message-receiver-type + message (sod-method-class method)))) . arguments)))) (define-on-demand-slot delegating-direct-method function-type (method) @@ -243,7 +249,8 @@ (t (push next-method-arg method-args))) (c-type (fun (lisp (c-type-subtype type)) - ("me" (* (class (sod-method-class method)))) + ("me" (lisp (sod-message-receiver-type + message (sod-method-class method)))) . method-args)))) ;;;-------------------------------------------------------------------------- @@ -443,7 +450,8 @@ ((nil) raw-tail) (:valist (reify-variable-argument-tail raw-tail))))) (c-type (fun (lisp (c-type-subtype type)) - ("me" (* (class (method-entry-chain-tail entry)))) + ("me" (lisp (sod-message-receiver-type + message (method-entry-chain-tail entry)))) . tail)))) (defgeneric effective-method-keyword-parser-function-name (method) @@ -690,10 +698,11 @@ (deliver-call codegen :void "SOD__IGNORE" "sod__obj"))) (finish-entry (tail) (let* ((head (sod-class-chain-head tail)) + (my-type (sod-message-receiver-type message tail)) (role (if parm-n :valist nil)) (name (method-entry-function-name method head role)) (type (c-type (fun (lisp return-type) - ("me" (* (class tail))) + ("me" (lisp my-type)) . entry-args)))) (codegen-pop-function codegen name type "~@(~@[~A ~]entry~) function ~:_~ @@ -712,7 +721,7 @@ (mapcar #'argument-name entry-args))) (main (method-entry-function-name method head nil)) (main-type (c-type (fun (lisp return-type) - ("me" (* (class tail))) + ("me" (lisp my-type)) . raw-entry-args)))) (codegen-push codegen) (ensure-var codegen *sod-ap* c-type-va-list)