~mdw
/
sod
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
src/method-{proto,impl}.lisp: Abstract out the receiver type.
[sod]
/
src
/
method-proto.lisp
diff --git
a/src/method-proto.lisp
b/src/method-proto.lisp
index
5687802
..
ed15ff2
100644
(file)
--- a/
src/method-proto.lisp
+++ b/
src/method-proto.lisp
@@
-49,6
+49,13
@@
will be a list of applicable methods sorted in most-to-least specific
order."))
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 *'."))
+
(export 'sod-message-applicable-methods)
(defgeneric sod-message-applicable-methods (message class)
(:documentation
(export 'sod-message-applicable-methods)
(defgeneric sod-message-applicable-methods (message class)
(:documentation
@@
-135,7
+142,8
@@
The list needn't be in any particular order."))
(export '(method-entry method-entry-effective-method
The list needn't be in any particular order."))
(export '(method-entry method-entry-effective-method
- method-entry-chain-head method-entry-chain-tail))
+ method-entry-chain-head method-entry-chain-tail
+ method-entry-role))
(defclass method-entry ()
((%method :initarg :method :type effective-method
:reader method-entry-effective-method)
(defclass method-entry ()
((%method :initarg :method :type effective-method
:reader method-entry-effective-method)
@@
-263,6
+271,7
@@
The default method indirects through `method-entry-slot-name-by-role'."))
The default method indirects through `method-entry-slot-name-by-role'."))
+(export 'method-entry-slot-name-by-role)
(defgeneric method-entry-slot-name-by-role (entry role name)
(:documentation "Easier implementation for `method-entry-slot-name'.")
(:method ((entry method-entry) (role (eql nil)) name) name)
(defgeneric method-entry-slot-name-by-role (entry role name)
(:documentation "Easier implementation for `method-entry-slot-name'.")
(:method ((entry method-entry) (role (eql nil)) name) name)
@@
-286,9
+295,9
@@
(:documentation
"Returns true if the effective METHOD is live.
(: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."))
;;;--------------------------------------------------------------------------
pointers in the vtable are left null."))
;;;--------------------------------------------------------------------------
@@
-336,13
+345,10
@@
;;; Additional instructions.
;;; 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)
(definst convert-to-ilayout (stream :export t)
- (
#1=#:class chain-head #2=#:
expr)
+ (
%class chain-head %
expr)
(format stream "SOD_ILAYOUT(~@<~A, ~_~A, ~_~A~:>)"
(format stream "SOD_ILAYOUT(~@<~A, ~_~A, ~_~A~:>)"
-
#1# (sod-class-nickname chain-head) #2#
))
+
class (sod-class-nickname chain-head) expr
))
;;; Utilities.
;;; Utilities.
@@
-479,11
+485,13
@@
((keyword-message-p message)
(cons (make-argument *sod-key-pointer*
(c-type (* (void :const))))
((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)
(*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*)
(when (keyword-message-p message)
(if (eq *keyword-struct-disposition* :null)
(deliver-call codegen :void "SOD__IGNORE" *sod-key-pointer*)