X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fpcl%2Fdfun.lisp;h=bcce170e2f98f8bc606348fca01534c527a15594;hb=eed9254936fe91e36dd4dbca02c342021917eeb1;hp=6337b611b68f8bba06b61d99f4b147b962af1ab6;hpb=2912f5f6c2acb2da3b9fcc0f5afd1ca89782a9f8;p=sbcl.git diff --git a/src/pcl/dfun.lisp b/src/pcl/dfun.lisp index 6337b61..bcce170 100644 --- a/src/pcl/dfun.lisp +++ b/src/pcl/dfun.lisp @@ -769,11 +769,14 @@ Except see also BREAK-VICIOUS-METACIRCLE. -- CSR, 2003-05-28 ;;; considered as state transitions. (defvar *lazy-dfun-compute-p* t) (defvar *early-p* nil) -(defvar *max-emf-precomputation-methods* 10) + +(declaim (type (or null unsigned-byte) *max-emf-precomputation-methods*)) +(defvar *max-emf-precomputation-methods* nil) (defun finalize-specializers (gf) (let ((methods (generic-function-methods gf))) - (when (<= (length methods) *max-emf-precomputation-methods*) + (when (or (null *max-emf-precomputation-methods*) + (<= (length methods) *max-emf-precomputation-methods*)) (let ((all-finalized t)) (dolist (method methods all-finalized) (dolist (specializer (method-specializers method)) @@ -1212,15 +1215,22 @@ Except see also BREAK-VICIOUS-METACIRCLE. -- CSR, 2003-05-28 ;;; function GF which reads/writes instances of class CLASS. ;;; TYPE is one of the symbols READER or WRITER. (defun find-standard-class-accessor-method (gf class type) - (dolist (method (standard-slot-value/gf gf 'methods)) - (let ((specializers (standard-slot-value/method method 'specializers)) - (qualifiers (plist-value method 'qualifiers))) - (when (and (null qualifiers) - (eq (ecase type - (reader (car specializers)) - (writer (cadr specializers))) - class)) - (return method))))) + (let ((cpl (standard-slot-value/class class 'class-precedence-list)) + (found-specializer *the-class-t*) + (found-method nil)) + (dolist (method (standard-slot-value/gf gf 'methods) found-method) + (let ((specializers (standard-slot-value/method method 'specializers)) + (qualifiers (plist-value method 'qualifiers))) + (when (and (null qualifiers) + (let ((subcpl (member (ecase type + (reader (car specializers)) + (writer (cadr specializers))) + cpl))) + (and subcpl (member found-specializer subcpl)))) + (setf found-specializer (ecase type + (reader (car specializers)) + (writer (cadr specializers)))) + (setf found-method method)))))) (defun accessor-values (gf arg-info classes methods) (declare (ignore gf))