]> git.eshelyaron.com Git - emacs.git/commitdiff
Speed-up let-binding of automatically-local variables
authorEli Zaretskii <eliz@gnu.org>
Sat, 30 Jun 2018 08:17:25 +0000 (11:17 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 30 Jun 2018 08:17:25 +0000 (11:17 +0300)
* src/data.c (set_default_internal): Use FOR_EACH_LIVE_BUFFER
when binding variables that don't nominally have a local
value, to avoid slowing down due to a large number of dead
buffers.  (Bug#18522) (Bug#31853)

src/data.c

index 605a5f43af7675d8b2ac443bf3c5376ca6e270c9..c8beeda7208195efd46c146e0ffd59c7e28ddaf5 100644 (file)
@@ -1713,11 +1713,21 @@ set_default_internal (Lisp_Object symbol, Lisp_Object value,
               set it in the buffers that don't nominally have a local value.  */
            if (idx > 0)
              {
-               struct buffer *b;
+               Lisp_Object buf, tail;
+
+               /* Do this only in live buffers, so that if there are
+                  a lot of buffers which are dead, that doesn't slow
+                  down let-binding of variables that are
+                  automatically local when set, like
+                  case-fold-search.  This is for Lisp programs that
+                  let-bind such variables in their inner loops.  */
+               FOR_EACH_LIVE_BUFFER (tail, buf)
+                 {
+                   struct buffer *b = XBUFFER (buf);
 
-               FOR_EACH_BUFFER (b)
-                 if (!PER_BUFFER_VALUE_P (b, idx))
-                   set_per_buffer_value (b, offset, value);
+                   if (!PER_BUFFER_VALUE_P (b, idx))
+                     set_per_buffer_value (b, offset, value);
+                 }
              }
          }
        else