((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
+ (and (sod-message-readonly-p message) :const)))))
+
(export 'simple-message)
(defclass simple-message (basic-message)
()
(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))
(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)
(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))))
;;;--------------------------------------------------------------------------
((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)
;; Effective method function details.
(emf-name (effective-method-function-name method))
- (ilayout-type (c-type (* (struct (ilayout-struct-tag class)))))
+ (ilayout-type (c-type (* (struct (ilayout-struct-tag class)
+ (and (sod-message-readonly-p
+ message)
+ :const)))))
(emf-type (c-type (fun (lisp return-type)
("sod__obj" (lisp ilayout-type))
. entry-args))))
(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 ~:_~
(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)