From: Eli Zaretskii <eliz@gnu.org>
Date: Sat, 30 Jun 2018 08:17:25 +0000 (+0300)
Subject: Speed-up let-binding of automatically-local variables
X-Git-Tag: emacs-27.0.90~4745
X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=3b4e65e797e15668345cf606c7d822cce11f17b2;p=emacs.git

Speed-up let-binding of automatically-local variables

* 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)
---

diff --git a/src/data.c b/src/data.c
index 605a5f43af7..c8beeda7208 100644
--- a/src/data.c
+++ b/src/data.c
@@ -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