From 4b7985db11c0fd3a3346a05f271eff9ad687851b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mattias=20Engdeg=C3=A5rd?= Date: Thu, 30 Nov 2023 14:57:51 +0100 Subject: [PATCH] ; * src/fns.c (Fmake_hash_table): ensure `test` is a bare symbol --- src/fns.c | 25 +++++++++++-------------- src/lisp.h | 2 +- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/fns.c b/src/fns.c index d8da8992ce9..b1d152a15a9 100644 --- a/src/fns.c +++ b/src/fns.c @@ -5299,10 +5299,6 @@ in an error. usage: (make-hash-table &rest KEYWORD-ARGS) */) (ptrdiff_t nargs, Lisp_Object *args) { - Lisp_Object test, weak; - bool purecopy; - struct hash_table_test testdesc; - ptrdiff_t i; USE_SAFE_ALLOCA; /* The vector `used' is used to keep track of arguments that @@ -5311,20 +5307,21 @@ usage: (make-hash-table &rest KEYWORD-ARGS) */) memset (used, 0, nargs * sizeof *used); /* See if there's a `:test TEST' among the arguments. */ - i = get_key_arg (QCtest, nargs, args, used); - test = i ? args[i] : Qeql; - if (EQ (test, Qeq)) + ptrdiff_t i = get_key_arg (QCtest, nargs, args, used); + Lisp_Object test = i ? args[i] : Qeql; + if (symbols_with_pos_enabled && SYMBOL_WITH_POS_P (test)) + test = SYMBOL_WITH_POS_SYM (test); + struct hash_table_test testdesc; + if (BASE_EQ (test, Qeq)) testdesc = hashtest_eq; - else if (EQ (test, Qeql)) + else if (BASE_EQ (test, Qeql)) testdesc = hashtest_eql; - else if (EQ (test, Qequal)) + else if (BASE_EQ (test, Qequal)) testdesc = hashtest_equal; else { /* See if it is a user-defined test. */ - Lisp_Object prop; - - prop = Fget (test, Qhash_table_test); + Lisp_Object prop = Fget (test, Qhash_table_test); if (!CONSP (prop) || !CONSP (XCDR (prop))) signal_error ("Invalid hash table test", test); testdesc.name = test; @@ -5336,7 +5333,7 @@ usage: (make-hash-table &rest KEYWORD-ARGS) */) /* See if there's a `:purecopy PURECOPY' argument. */ i = get_key_arg (QCpurecopy, nargs, args, used); - purecopy = i && !NILP (args[i]); + bool purecopy = i && !NILP (args[i]); /* See if there's a `:size SIZE' argument. */ i = get_key_arg (QCsize, nargs, args, used); Lisp_Object size_arg = i ? args[i] : Qnil; @@ -5370,7 +5367,7 @@ usage: (make-hash-table &rest KEYWORD-ARGS) */) /* Look for `:weakness WEAK'. */ i = get_key_arg (QCweakness, nargs, args, used); - weak = i ? args[i] : Qnil; + Lisp_Object weak = i ? args[i] : Qnil; if (EQ (weak, Qt)) weak = Qkey_and_value; if (!NILP (weak) diff --git a/src/lisp.h b/src/lisp.h index 549b51d3f7f..0421cb68c10 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -2387,7 +2387,7 @@ struct Lisp_Hash_Table; struct hash_table_test { - /* Name of the function used to compare keys. */ + /* Function used to compare keys; always a bare symbol. */ Lisp_Object name; /* User-supplied hash function, or nil. */ -- 2.39.5