diff options
author | Mattias EngdegÄrd <mattiase@acm.org> | 2020-07-08 11:22:19 +0200 |
---|---|---|
committer | Mattias EngdegÄrd <mattiase@acm.org> | 2020-07-08 18:13:47 +0200 |
commit | b7058f95f599ede703cb1c2af58d3af103048841 (patch) | |
tree | 2a303b8a8230ac472102119353d84f2abea43a4f | |
parent | 384fa1095871f55587487dc0107be07ba684c41d (diff) | |
download | emacs-b7058f95f599ede703cb1c2af58d3af103048841.tar.gz emacs-b7058f95f599ede703cb1c2af58d3af103048841.tar.bz2 emacs-b7058f95f599ede703cb1c2af58d3af103048841.zip |
Special-case symbol and fixnum keys in member, assoc and rassoc
* src/fns.c (Fmember, Fassoc, Frassoc): Delegate to the cheaper Fmemq,
Fassq and Frassq for arguments of the appropriate types.
(eq_comparable_value): New function.
-rw-r--r-- | src/fns.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/fns.c b/src/fns.c index a95a4b6e678..811d6e82001 100644 --- a/src/fns.c +++ b/src/fns.c @@ -1530,11 +1530,21 @@ same_float (Lisp_Object x, Lisp_Object y) return !neql; } +/* True if X can be compared using `eq'. + This predicate is approximative, for maximum speed. */ +static bool +eq_comparable_value (Lisp_Object x) +{ + return SYMBOLP (x) || FIXNUMP (x); +} + DEFUN ("member", Fmember, Smember, 2, 2, 0, doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `equal'. The value is actually the tail of LIST whose car is ELT. */) (Lisp_Object elt, Lisp_Object list) { + if (eq_comparable_value (elt)) + return Fmemq (elt, list); Lisp_Object tail = list; FOR_EACH_TAIL (tail) if (! NILP (Fequal (elt, XCAR (tail)))) @@ -1622,6 +1632,8 @@ The value is actually the first element of ALIST whose car equals KEY. Equality is defined by TESTFN if non-nil or by `equal' if nil. */) (Lisp_Object key, Lisp_Object alist, Lisp_Object testfn) { + if (eq_comparable_value (key) && NILP (testfn)) + return Fassq (key, alist); Lisp_Object tail = alist; FOR_EACH_TAIL (tail) { @@ -1672,6 +1684,8 @@ DEFUN ("rassoc", Frassoc, Srassoc, 2, 2, 0, The value is actually the first element of ALIST whose cdr equals KEY. */) (Lisp_Object key, Lisp_Object alist) { + if (eq_comparable_value (key)) + return Frassq (key, alist); Lisp_Object tail = alist; FOR_EACH_TAIL (tail) { |