- ;; This SELF slot needs explanation.
- ;;
- ;; Ordinary closures did not need this slot before version 0.9.3.xx,
- ;; as the closure object was already in some dedicated register --
- ;; EAX/RAX on x86(-64), reg_LEXENV on register-rich platforms -- and
- ;; consequently setting up the environment (from the INFO slot,
- ;; below) was easy.
- ;;
- ;; However, it is not easy to support calling FUNCALLABLE-INSTANCEs
- ;; in the same way; in a FUNCALLABLE-INSTANCE, there are
- ;; conceptually two variable-length data areas: the closure
- ;; environment, if any, and the slots of the instance.
- ;;
- ;; Until sbcl-0.9.3.xx, it was required that closures to be set as a
- ;; FUNCALLABLE-INSTANCE-FUNCTION be defined using the magical
- ;; keyword SB-KERNEL:INSTANCE-LAMBDA, rather than ordinary LAMBDA;
- ;; this caused an extra indirection to be compiled into the closure
- ;; code to load the closure from the FUNCALLABLE-INSTANCE-LEXENV
- ;; slot before setting up the environment for the function body.
- ;; Failure to obey this protocol yielded confusing error messages as
- ;; either INSTANCE-LAMBDAs tried to dereference environments that
- ;; weren't there, or ordinary LAMBDAs got hold of the LAYOUT and
- ;; LEXENV slots of a FUNCALLABLE-INSTANCE.
- ;;
- ;; By adding this SELF slot, which is at the same offset in a
- ;; regular CLOSURE as the LEXENV slot is in a FUNCALLABLE-INSTANCE,
- ;; we enable the extra indirection (VOP FUNCALLABLE-INSTANCE-LEXENV,
- ;; in src/compiler/ir2tran.lisp) to be compiled unconditionally
- ;; (provided that we set this slot to the closure object itself).
- ;; Relative to the code before, this adds a word to the space
- ;; requirements of a closure, and one instruction (a memory fetch)
- ;; to the body of a closure function.
- ;;
- ;; There are potentially other implementation strategies which would
- ;; remove the need for this extra indirection in regular closures,
- ;; such as setting up a trampoline for funcallable instances (though
- ;; it was not clear to me that there are enough registers free in
- ;; the x86 backend to permit this). This indirection should not be
- ;; too disastrous, given that for regular closures the fetch is from
- ;; memory which is known to be active.
- ;;
- ;; CSR, 2005-08-05
- (self) ; KLUDGE (see above comment)