0.9.3.32:
[sbcl.git] / src / compiler / generic / objdef.lisp
index 7bfbb4c..dd3105f 100644 (file)
 (define-primitive-object (closure :lowtag fun-pointer-lowtag
                                   :widetag closure-header-widetag)
   (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))
 
 (define-primitive-object (funcallable-instance