]> git.eshelyaron.com Git - emacs.git/commitdiff
Non-recursive marking of buffer-local variables
authorMattias Engdegård <mattiase@acm.org>
Wed, 1 Nov 2023 13:34:30 +0000 (14:34 +0100)
committerMattias Engdegård <mattiase@acm.org>
Wed, 1 Nov 2023 15:07:20 +0000 (16:07 +0100)
* src/alloc.c (mark_localized_symbol): Inline into...
(process_mark_stack): ...this code and do don't use recursion.

src/alloc.c

index 45a950c4f8129ced3b171e4346baf7a4e84d149e..cda8ba1ad46970ff93537b0fd3c32fde4e2959be 100644 (file)
@@ -6962,20 +6962,6 @@ mark_face_cache (struct face_cache *c)
     }
 }
 
-NO_INLINE /* To reduce stack depth in mark_object.  */
-static void
-mark_localized_symbol (struct Lisp_Symbol *ptr)
-{
-  struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (ptr);
-  Lisp_Object where = blv->where;
-  /* If the value is set up for a killed buffer restore its global binding.  */
-  if ((BUFFERP (where) && !BUFFER_LIVE_P (XBUFFER (where))))
-    swap_in_global_binding (ptr);
-  mark_object (blv->where);
-  mark_object (blv->valcell);
-  mark_object (blv->defcell);
-}
-
 /* Remove killed buffers or items whose car is a killed buffer from
    LIST, and mark other items.  Return changed LIST, which is marked.  */
 
@@ -7377,7 +7363,17 @@ process_mark_stack (ptrdiff_t base_sp)
                  break;
                }
              case SYMBOL_LOCALIZED:
-               mark_localized_symbol (ptr);
+               {
+                 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (ptr);
+                 Lisp_Object where = blv->where;
+                 /* If the value is set up for a killed buffer,
+                    restore its global binding.  */
+                 if (BUFFERP (where) && !BUFFER_LIVE_P (XBUFFER (where)))
+                   swap_in_global_binding (ptr);
+                 mark_stack_push_value (blv->where);
+                 mark_stack_push_value (blv->valcell);
+                 mark_stack_push_value (blv->defcell);
+               }
                break;
              case SYMBOL_FORWARDED:
                /* If the value is forwarded to a buffer or keyboard field,