X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fpcl%2Flow.lisp;h=2025da8a3355d9c1542d157e83fbefb15e5a93dc;hb=821de1a3e534e11b682475ebaf836ffa846246f4;hp=ed2d9b883658ea531ba9ad20e7305f88bc728dac;hpb=0aecc2b20142e08068c3434273500131cb13fe2d;p=sbcl.git diff --git a/src/pcl/low.lisp b/src/pcl/low.lisp index ed2d9b8..2025da8 100644 --- a/src/pcl/low.lisp +++ b/src/pcl/low.lisp @@ -67,7 +67,6 @@ ;; to find out, I just overrode the LAYOUT ;; default here. -- WHN 19991204 (invalid nil)) - (:conc-name %wrapper-) (:constructor make-wrapper-internal) (:copier nil)) (instance-slots-layout nil :type list) @@ -76,15 +75,15 @@ ;;;; PCL's view of funcallable instances -(!defstruct-with-alternate-metaclass pcl-funcallable-instance +(!defstruct-with-alternate-metaclass standard-funcallable-instance ;; KLUDGE: Note that neither of these slots is ever accessed by its ;; accessor name as of sbcl-0.pre7.63. Presumably everything works ;; by puns based on absolute locations. Fun fun fun.. -- WHN 2001-10-30 :slot-names (clos-slots name hash-code) - :boa-constructor %make-pcl-funcallable-instance + :boa-constructor %make-standard-funcallable-instance :superclass-name function - :metaclass-name random-pcl-classoid - :metaclass-constructor make-random-pcl-classoid + :metaclass-name standard-classoid + :metaclass-constructor make-standard-classoid :dd-type funcallable-structure ;; Only internal implementation code will access these, and these ;; accesses (slot readers in particular) could easily be a @@ -178,12 +177,18 @@ (declare (special *boot-state* *the-class-standard-generic-function*)) (when (valid-function-name-p fun) (setq fun (fdefinition fun))) - (when (funcallable-instance-p fun) - (if (if (eq *boot-state* 'complete) - (typep fun 'generic-function) - (eq (class-of fun) *the-class-standard-generic-function*)) - (setf (%funcallable-instance-info fun 2) new-name) - (bug "unanticipated function type"))) + (typecase fun + (%method-function (setf (%method-function-name fun) new-name)) + #+sb-eval + (sb-eval:interpreted-function + (setf (sb-eval:interpreted-function-name fun) new-name)) + (funcallable-instance ;; KLUDGE: probably a generic function... + (cond ((if (eq *boot-state* 'complete) + (typep fun 'generic-function) + (eq (class-of fun) *the-class-standard-generic-function*)) + (setf (%funcallable-instance-info fun 2) new-name)) + (t + (bug "unanticipated function type"))))) ;; Fixup name-to-function mappings in cases where the function ;; hasn't been defined by DEFUN. (FIXME: is this right? This logic ;; comes from CMUCL). -- CSR, 2004-12-31 @@ -335,7 +340,35 @@ (defun structure-slotd-init-form (slotd) (dsd-default slotd)) - + +;;; method function stuff. +;;; +;;; PCL historically included a so-called method-fast-function, which +;;; is essentially a method function but with (a) a precomputed +;;; continuation for CALL-NEXT-METHOD and (b) a permutation vector for +;;; slot access. [ FIXME: see if we can understand these two +;;; optimizations before commit. ] However, the presence of the +;;; fast-function meant that we violated AMOP and the effect of the +;;; :FUNCTION initarg, and furthermore got to potentially confusing +;;; situations where the function and the fast-function got out of +;;; sync, so that calling (method-function method) with the defined +;;; protocol would do different things from (call-method method) in +;;; method combination. +;;; +;;; So we define this internal method function structure, which we use +;;; when we create a method function ourselves. This means that we +;;; can hang the various bits of information that we want off the +;;; method function itself, and also that if a user overrides method +;;; function creation there is no danger of having the system get +;;; confused. +(!defstruct-with-alternate-metaclass %method-function + :slot-names (fast-function name) + :boa-constructor %make-method-function + :superclass-name function + :metaclass-name static-classoid + :metaclass-constructor make-static-classoid + :dd-type funcallable-structure) + ;;; WITH-PCL-LOCK is used around some forms that were previously ;;; protected by WITHOUT-INTERRUPTS, but in a threaded SBCL we don't ;;; have a useful WITHOUT-INTERRUPTS. In an unthreaded SBCL I'm not