[Openmcl-cvs-notifications] r9924 - /trunk/source/lib/setf.lisp

gz at clozure.com gz at clozure.com
Mon Jul 7 16:26:19 EDT 2008


Author: gz
Date: Mon Jul  7 16:26:19 2008
New Revision: 9924

Log:
Propagate r9603 (and followup from r9617) to trunk

Modified:
    trunk/source/lib/setf.lisp

Modified: trunk/source/lib/setf.lisp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/source/lib/setf.lisp (original)
+++ trunk/source/lib/setf.lisp Mon Jul  7 16:26:19 2008
@@ -83,10 +83,13 @@
                     (vars nil)
                     (vals nil))
                 (dolist (x (cdr form))
+                  ;; Rebinding defeats optimizations, so avoid it if can.
+                  (if (constantp x environment)
+                    (push x args)
                     (let ((var (gensym)))
                       (push var vars)
                       (push var args)
-                      (push x vals)))
+                      (push x vals))))
                 (setq args (nreverse args))
                 (values (nreverse vars) =

                         (nreverse vals) =

@@ -479,32 +482,41 @@
 		       (get-setf-expansion (cons function args) env)
     ;; Make sure the place is one that we can handle.
     ;;Mainly to insure against cases of ldb and mask-field and such creepi=
ng in.
-    (cond ((and (eq (car (last args)) (car (last vals)))
-                (eq (car (last getter)) (car (last dummies)))
-                newval
-                (null (cdr newval))
-                (eq (car (last setter)) (car newval))
-                (eq (car (last setter 2)) (car (last dummies))))
-           ; (setf (foo ... argn) bar) -> (set-foo ... argn bar)
-           (values dummies vals newval
-                   `(apply+ (function ,(car setter))
-                            ,@(butlast dummies)
-                            ,@(last dummies)
-                            ,(car newval))
-	           `(apply (function ,(car getter)) ,@(cdr getter))))
-          ((and (eq (car (last args)) (car (last vals)))
-                (eq (car (last getter)) (car (last dummies)))
-                newval
-                (null (cdr newval))
-                (eq (car setter) 'funcall)
-                (eq (third setter) (car newval))
-                (eq (car (last setter)) (car (last dummies))))
-           ; (setf (foo ... argn) bar) -> (funcall #'(setf foo) bar ... ar=
gn)  [with bindings for evaluation order]
-           (values dummies vals newval
-                   `(apply ,@(cdr setter))
-                   `(apply (function ,(car getter)) ,@(cdr getter))))
-          (t (error "Apply of ~S is not understood as a location for Setf."
-		    function)))))
+    (let* ((last-arg (car (last args)))
+           (last-val (car (last vals)))
+           (last-dummy (car (last dummies)))
+           (last-getter (car (last getter)))
+           (last2-setter (car (last setter 2)))
+           (last-setter (car (last setter))))
+      (cond ((and (or (and (eq last-arg last-val)
+                           (eq last-getter last-dummy))
+                      (eq last-arg last-getter))
+                  newval
+                  (null (cdr newval))
+                  (eq last-setter (car newval))
+                  (or (and (eq last-arg last-val)
+                           (eq last2-setter last-dummy))
+                      (eq last-arg last2-setter)))
+             ;; (setf (foo ... argn) bar) -> (set-foo ... argn bar)
+             (values dummies vals newval
+                     `(apply+ (function ,(car setter)) ,@(cdr setter))
+                     `(apply (function ,(car getter)) ,@(cdr getter))))
+            ((and (or (and (eq last-arg last-val)
+                           (eq last-getter last-dummy))
+                      (eq last-arg last-getter))
+                  newval
+                  (null (cdr newval))
+                  (eq (car setter) 'funcall)
+                  (eq (third setter) (car newval))
+                  (or (and (eq last-arg last-val)
+                           (eq last-setter last-dummy))
+                      (eq last-arg last-setter)))
+             ;; (setf (foo ... argn) bar) -> (funcall #'(setf foo) bar ...=
 argn)  [with bindings for evaluation order]
+             (values dummies vals newval
+                     `(apply ,@(cdr setter))
+                     `(apply (function ,(car getter)) ,@(cdr getter))))
+            (t (error "Apply of ~S is not understood as a location for Set=
f."
+                      function))))))
 =

 ;;These are the supporting functions for the am-style hard-cases of setf.
 (defun assoc-2-lists (list1 list2)



More information about the Openmcl-cvs-notifications mailing list