[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 79cfc1eaa0b 1/3: Internal function for obarray performance analys
From: |
Mattias Engdegård |
Subject: |
master 79cfc1eaa0b 1/3: Internal function for obarray performance analysis (bug#68244) |
Date: |
Mon, 12 Feb 2024 13:00:48 -0500 (EST) |
branch: master
commit 79cfc1eaa0b93f49559d74b6f7a76bf97e70ad2a
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 5aa7466cc12..8f355547268 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -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'.