]> git.eshelyaron.com Git - emacs.git/commitdiff
Internal function for obarray performance analysis (bug#68244)
authorMattias EngdegÄrd <mattiase@acm.org>
Wed, 7 Feb 2024 20:50:03 +0000 (21:50 +0100)
committerEshel Yaron <me@eshelyaron.com>
Tue, 13 Feb 2024 13:10:09 +0000 (14:10 +0100)
* src/lread.c (Finternal__obarray_buckets): New function.

(cherry picked from commit 79cfc1eaa0b93f49559d74b6f7a76bf97e70ad2a)

src/lread.c

index 5aa7466cc123b81cb188b91be86f581dd0968c2c..8f355547268b97ff8fd43c4f66f9dc0e3fe1b9b3 100644 (file)
@@ -5296,6 +5296,32 @@ OBARRAY defaults to the value of `obarray'.  */)
   return Qnil;
 }
 
+DEFUN ("internal--obarray-buckets",
+       Finternal__obarray_buckets, Sinternal__obarray_buckets, 1, 1, 0,
+       doc: /* Symbols in each bucket of OBARRAY.  Internal use only.  */)
+    (Lisp_Object obarray)
+{
+  obarray = check_obarray (obarray);
+  ptrdiff_t size = ASIZE (obarray);
+  Lisp_Object ret = Qnil;
+  for (ptrdiff_t i = 0; i < size; i++)
+    {
+      Lisp_Object bucket = Qnil;
+      Lisp_Object sym = AREF (obarray, i);
+      if (BARE_SYMBOL_P (sym))
+       while (1)
+         {
+           bucket = Fcons (sym, bucket);
+           struct Lisp_Symbol *s = XBARE_SYMBOL(sym)->u.s.next;
+           if (!s)
+             break;
+           sym = make_lisp_symbol (s);
+         }
+      ret = Fcons (Fnreverse (bucket), ret);
+    }
+  return Fnreverse (ret);
+}
+
 #define OBARRAY_SIZE 15121
 
 void
@@ -5693,6 +5719,7 @@ syms_of_lread (void)
   defsubr (&Sget_file_char);
   defsubr (&Smapatoms);
   defsubr (&Slocate_file_internal);
+  defsubr (&Sinternal__obarray_buckets);
 
   DEFVAR_LISP ("obarray", Vobarray,
               doc: /* Symbol table for use by `intern' and `read'.