emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

scratch/obarray 0a1c9810065 1/9: Internal function for obarray performan


From: Mattias Engdegård
Subject: scratch/obarray 0a1c9810065 1/9: Internal function for obarray performance analysis (bug#68244)
Date: Mon, 12 Feb 2024 09:10:53 -0500 (EST)

branch: scratch/obarray
commit 0a1c98100653a21b7093e56f32b311148348fa96
Author: Mattias Engdegård <mattiase@acm.org>
Commit: Mattias Engdegård <mattiase@acm.org>

    Internal function for obarray performance analysis (bug#68244)
    
    * src/lread.c (Finternal__obarray_buckets): New function.
---
 src/lread.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/src/lread.c b/src/lread.c
index b5eeb55bb70..5277932f255 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -5294,6 +5294,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
@@ -5691,6 +5717,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'.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]