From 644a1ff36dd578321fd0592aa47748e8af741542 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Fri, 4 Feb 2005 17:23:03 +0000 Subject: [PATCH] 0.8.19.15: Maybe speed up PCL a tiny bit more ... make the slot positioning a little less confusing, so that the 'same' slot tends to be in the same location; ... this should help the clever DFUN mechanism to keep neat ones like ONE-INDEX around; ... (also this puts slots in objects in the 'expected' order -- frob sb-aclrepl's dealing with the unexpected --- contrib/sb-aclrepl/inspect.lisp | 2 +- src/pcl/std-class.lisp | 14 +++++++++++--- version.lisp-expr | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/contrib/sb-aclrepl/inspect.lisp b/contrib/sb-aclrepl/inspect.lisp index c2378b6..8611d9d 100644 --- a/contrib/sb-aclrepl/inspect.lisp +++ b/contrib/sb-aclrepl/inspect.lisp @@ -791,7 +791,7 @@ cons cells and LIST-TYPE is :normal, :dotted, or :cyclic" (defun inspected-standard-object-parts (object) (let ((components nil) (class-slots (sb-pcl::class-slots (class-of object)))) - (dolist (class-slot class-slots components) + (dolist (class-slot class-slots (nreverse components)) (let* ((slot-name (slot-value class-slot 'sb-pcl::name)) (slot-value (if (slot-boundp object slot-name) (slot-value object slot-name) diff --git a/src/pcl/std-class.lisp b/src/pcl/std-class.lisp index 3a6b3b9..261941d 100644 --- a/src/pcl/std-class.lisp +++ b/src/pcl/std-class.lisp @@ -943,13 +943,21 @@ :class class initargs)) +;;; I (CSR) am not sure, but I believe that the particular order of +;;; slots is quite important: it is ideal to attempt to have a +;;; constant slot location for the same notional slots as much as +;;; possible, so that clever discriminating functions (ONE-INDEX et +;;; al.) have a chance of working. The below at least walks through +;;; the slots predictably, but maybe it would be good to compute some +;;; kind of optimal slot layout by looking at locations of slots in +;;; superclasses? (defmethod compute-slots ((class std-class)) ;; As specified, we must call COMPUTE-EFFECTIVE-SLOT-DEFINITION once ;; for each different slot name we find in our superclasses. Each ;; call receives the class and a list of the dslotds with that name. ;; The list is in most-specific-first order. (let ((name-dslotds-alist ())) - (dolist (c (class-precedence-list class)) + (dolist (c (reverse (class-precedence-list class))) (dolist (slot (class-direct-slots c)) (let* ((name (slot-definition-name slot)) (entry (assq name name-dslotds-alist))) @@ -959,8 +967,8 @@ (mapcar (lambda (direct) (compute-effective-slot-definition class (car direct) - (nreverse (cdr direct)))) - name-dslotds-alist))) + (cdr direct))) + (nreverse name-dslotds-alist)))) (defmethod compute-slots ((class standard-class)) (call-next-method)) diff --git a/version.lisp-expr b/version.lisp-expr index 030c40b..b2bb4e6 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -17,4 +17,4 @@ ;;; checkins which aren't released. (And occasionally for internal ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"0.8.19.14" +"0.8.19.15" -- 1.7.10.4