will be a list of applicable methods sorted in most-to-least specific
order."))
+(export 'sod-message-receiver-type)
+(defgeneric sod-message-receiver-type (message class)
+ (:documentation
+ "Return the type of the `me' argument in a MESSAGE received by CLASS.
+
+ Typically this will just be `CLASS *' or `const CLASS *'."))
+
(export 'sod-message-applicable-methods)
(defgeneric sod-message-applicable-methods (message class)
(:documentation
(:documentation
"Returns true if the effective METHOD is live.
- An effective method is `live' if it should actually have proper method entry
- functions associated with it and stored in the class vtable. The other
- possibility is that the method is `dead', in which case the function
+ An effective method is `live' if it should actually have proper method
+ entry functions associated with it and stored in the class vtable. The
+ other possibility is that the method is `dead', in which case the function
pointers in the vtable are left null."))
;;;--------------------------------------------------------------------------
;;; Additional instructions.
-;; HACK: use gensyms for the `class' and `expr' slots to avoid leaking the
-;; slot names, because `expr' is exported by our package, and `class' is
-;; actually from the `common-lisp' package.
(definst convert-to-ilayout (stream :export t)
- (#1=#:class chain-head #2=#:expr)
+ (%class chain-head %expr)
(format stream "SOD_ILAYOUT(~@<~A, ~_~A, ~_~A~:>)"
- #1# (sod-class-nickname chain-head) #2#))
+ class (sod-class-nickname chain-head) expr))
;;; Utilities.
((keyword-message-p message)
(cons (make-argument *sod-key-pointer*
(c-type (* (void :const))))
- raw-args))))
+ raw-args))
+ (t raw-args)))
(*keyword-struct-disposition* (if (effective-method-keywords method)
:pointer :null)))
(codegen-push codegen)
(ensure-ilayout-var codegen super)
+ (deliver-call codegen :void "SOD__IGNORE" "sod__obj")
(when (keyword-message-p message)
(if (eq *keyword-struct-disposition* :null)
(deliver-call codegen :void "SOD__IGNORE" *sod-key-pointer*)