Update of /cvsroot/sbcl/sbcl/src/compiler/generic
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6766/src/compiler/generic
Fix bug 343: No more need for INSTANCE-LAMBDA. What happened
to four-line patches?
... port to all architectures;
... remove use of INSTANCE-LAMBDA from pcl;
... give a deprecation warning for uses of INSTANCE-LAMBDA;
... write long explanatory comment;
... add test cases.
RCS file: /cvsroot/sbcl/sbcl/src/compiler/generic/objdef.lisp,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -d -r1.34 -r1.35
--- objdef.lisp 14 Jul 2005 18:35:35 -0000 1.34
+++ objdef.lisp 6 Aug 2005 11:31:18 -0000 1.35
@@ -221,6 +221,49 @@
(define-primitive-object (closure :lowtag fun-pointer-lowtag
(fun :init :arg :ref-trans %closure-fun)
+ ;; 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)
(info :rest-p t))