(let* ((pv-wrappers (when pv-table
(pv-wrappers-from-all-wrappers
pv-table wrappers)))
- (pv-cell (when (and pv-table pv-wrappers)
- (pv-table-lookup pv-table pv-wrappers))))
- (values mf t fmf pv-cell))
+ (pv (when (and pv-table pv-wrappers)
+ (pv-table-lookup pv-table pv-wrappers))))
+ (values mf t fmf pv))
(values
(or mf (if (listp method)
(bug "early method with no method-function")
;; or aren't to prevent the leaky next methods bug.
(let* ((cm-args (cdr form))
(fmf-p (and (null no-fmf-p)
- (or (not (eq *boot-state* 'complete))
+ (or (not (eq **boot-state** 'complete))
(gf-fast-method-function-p generic-function))
(null (cddr cm-args))))
(method (car cm-args))
(defun make-emf-from-method
(method cm-args &optional gf fmf-p method-alist wrappers)
- (multiple-value-bind (mf real-mf-p fmf pv-cell)
+ (multiple-value-bind (mf real-mf-p fmf pv)
(get-method-function method method-alist wrappers)
(if fmf
(let* ((next-methods (car cm-args))
(default (cons nil nil))
(value (method-plist-value method :constant-value default)))
(if (eq value default)
- (make-fast-method-call :function fmf :pv-cell pv-cell
+ (make-fast-method-call :function fmf :pv pv
:next-method-call next :arg-info arg-info)
(make-constant-fast-method-call
- :function fmf :pv-cell pv-cell :next-method-call next
+ :function fmf :pv pv :next-method-call next
:arg-info arg-info :value value)))
(if real-mf-p
(flet ((frob-cm-arg (arg)
(defun expand-effective-method-function (gf effective-method &optional env)
(declare (ignore env))
- (multiple-value-bind (nreq applyp metatypes nkeys arg-info)
+ (multiple-value-bind (nreq applyp)
(get-generic-fun-info gf)
- (declare (ignore nreq nkeys arg-info))
- (let ((ll (make-fast-method-call-lambda-list metatypes applyp))
+ (let ((ll (make-fast-method-call-lambda-list nreq applyp))
(check-applicable-keywords
(when (and applyp (gf-requires-emf-keyword-checks gf))
'((check-applicable-keywords))))
(error-p (or (eq (first effective-method) '%no-primary-method)
(eq (first effective-method) '%invalid-qualifiers)))
(mc-args-p
- (when (eq *boot-state* 'complete)
+ (when (eq **boot-state** 'complete)
;; Otherwise the METHOD-COMBINATION slot is not bound.
(let ((combin (generic-function-method-combination gf)))
(and (long-method-combination-p combin)
- (long-method-combination-args-lambda-list combin))))))
+ (long-method-combination-args-lambda-list combin)))))
+ (name `(emf ,(generic-function-name gf))))
(cond
(error-p
- `(lambda (.pv-cell. .next-method-call. &rest .args.)
- (declare (ignore .pv-cell. .next-method-call.))
- (declare (ignorable .args.))
- (flet ((%no-primary-method (gf args)
- (apply #'no-primary-method gf args))
- (%invalid-qualifiers (gf combin method)
- (invalid-qualifiers gf combin method)))
- (declare (ignorable #'%no-primary-method #'%invalid-qualifiers))
- ,effective-method)))
+ `(named-lambda ,name (.pv. .next-method-call. &rest .args.)
+ (declare (ignore .pv. .next-method-call.))
+ (declare (ignorable .args.))
+ (flet ((%no-primary-method (gf args)
+ (call-no-primary-method gf args))
+ (%invalid-qualifiers (gf combin method)
+ (invalid-qualifiers gf combin method)))
+ (declare (ignorable #'%no-primary-method #'%invalid-qualifiers))
+ ,effective-method)))
(mc-args-p
- (let* ((required (make-dfun-required-args metatypes))
+ (let* ((required (make-dfun-required-args nreq))
(gf-args (if applyp
`(list* ,@required
(sb-c::%listify-rest-args
(the (and unsigned-byte fixnum)
.dfun-more-count.)))
`(list ,@required))))
- `(lambda ,ll
- (declare (ignore .pv-cell. .next-method-call.))
- (let ((.gf-args. ,gf-args))
- (declare (ignorable .gf-args.))
- ,@check-applicable-keywords
- ,effective-method))))
+ `(named-lambda ,name ,ll
+ (declare (ignore .pv. .next-method-call.))
+ (let ((.gf-args. ,gf-args))
+ (declare (ignorable .gf-args.))
+ ,@check-applicable-keywords
+ ,effective-method))))
(t
- `(lambda ,ll
- (declare (ignore ,@(if error-p ll '(.pv-cell. .next-method-call.))))
- ,@check-applicable-keywords
- ,effective-method))))))
+ `(named-lambda ,name ,ll
+ (declare (ignore ,@(if error-p ll '(.pv. .next-method-call.))))
+ ,@check-applicable-keywords
+ ,effective-method))))))
(defun expand-emf-call-method (gf form metatypes applyp env)
(declare (ignore gf metatypes applyp env))
(call-method
(let ((gensym (get-effective-method-gensym)))
(values (make-emf-call
- metatypes applyp gensym
+ (length metatypes) applyp gensym
(make-effective-method-fun-type
generic-function form method-alist-p wrappers-p))
(list gensym))))
(type (make-effective-method-list-fun-type
generic-function form method-alist-p wrappers-p)))
(values `(dolist (emf ,gensym nil)
- ,(make-emf-call metatypes applyp 'emf type))
+ ,(make-emf-call (length metatypes) applyp 'emf type))
(list gensym))))
(check-applicable-keywords
(values `(check-applicable-keywords .keyargs-start.
(defun gf-requires-emf-keyword-checks (generic-function)
(member '&key (gf-lambda-list generic-function)))
-(defvar *in-precompute-effective-methods-p* nil)
-
(defun standard-compute-effective-method
(generic-function combin applicable-methods)
(collect ((before) (primary) (after) (around))
- (flet ((invalid (gf combin m)
- (if *in-precompute-effective-methods-p*
- (return-from standard-compute-effective-method
- `(%invalid-qualifiers ',gf ',combin ',m))
- (invalid-qualifiers gf combin m))))
+ (flet ((invalid (gf combin m) (invalid-qualifiers gf combin m)))
(dolist (m applicable-methods)
(let ((qualifiers (if (listp m)
(early-method-qualifiers m)
- (method-qualifiers m))))
+ (safe-method-qualifiers m))))
(cond
((null qualifiers) (primary m))
((cdr qualifiers) (invalid generic-function combin m))