diff options
| author | Mattias EngdegÄrd | 2020-07-08 11:22:19 +0200 |
|---|---|---|
| committer | Mattias EngdegÄrd | 2020-07-08 18:13:47 +0200 |
| commit | b7058f95f599ede703cb1c2af58d3af103048841 (patch) | |
| tree | 2a303b8a8230ac472102119353d84f2abea43a4f /src | |
| parent | 384fa1095871f55587487dc0107be07ba684c41d (diff) | |
| download | emacs-b7058f95f599ede703cb1c2af58d3af103048841.tar.gz 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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/fns.c | 14 |
1 files changed, 14 insertions, 0 deletions
| @@ -1530,11 +1530,21 @@ same_float (Lisp_Object x, Lisp_Object y) | |||
| 1530 | return !neql; | 1530 | return !neql; |
| 1531 | } | 1531 | } |
| 1532 | 1532 | ||
| 1533 | /* True if X can be compared using `eq'. | ||
| 1534 | This predicate is approximative, for maximum speed. */ | ||
| 1535 | static bool | ||
| 1536 | eq_comparable_value (Lisp_Object x) | ||
| 1537 | { | ||
| 1538 | return SYMBOLP (x) || FIXNUMP (x); | ||
| 1539 | } | ||
| 1540 | |||
| 1533 | DEFUN ("member", Fmember, Smember, 2, 2, 0, | 1541 | DEFUN ("member", Fmember, Smember, 2, 2, 0, |
| 1534 | doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `equal'. | 1542 | doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `equal'. |
| 1535 | The value is actually the tail of LIST whose car is ELT. */) | 1543 | The value is actually the tail of LIST whose car is ELT. */) |
| 1536 | (Lisp_Object elt, Lisp_Object list) | 1544 | (Lisp_Object elt, Lisp_Object list) |
| 1537 | { | 1545 | { |
| 1546 | if (eq_comparable_value (elt)) | ||
| 1547 | return Fmemq (elt, list); | ||
| 1538 | Lisp_Object tail = list; | 1548 | Lisp_Object tail = list; |
| 1539 | FOR_EACH_TAIL (tail) | 1549 | FOR_EACH_TAIL (tail) |
| 1540 | if (! NILP (Fequal (elt, XCAR (tail)))) | 1550 | if (! NILP (Fequal (elt, XCAR (tail)))) |
| @@ -1622,6 +1632,8 @@ The value is actually the first element of ALIST whose car equals KEY. | |||
| 1622 | Equality is defined by TESTFN if non-nil or by `equal' if nil. */) | 1632 | Equality is defined by TESTFN if non-nil or by `equal' if nil. */) |
| 1623 | (Lisp_Object key, Lisp_Object alist, Lisp_Object testfn) | 1633 | (Lisp_Object key, Lisp_Object alist, Lisp_Object testfn) |
| 1624 | { | 1634 | { |
| 1635 | if (eq_comparable_value (key) && NILP (testfn)) | ||
| 1636 | return Fassq (key, alist); | ||
| 1625 | Lisp_Object tail = alist; | 1637 | Lisp_Object tail = alist; |
| 1626 | FOR_EACH_TAIL (tail) | 1638 | FOR_EACH_TAIL (tail) |
| 1627 | { | 1639 | { |
| @@ -1672,6 +1684,8 @@ DEFUN ("rassoc", Frassoc, Srassoc, 2, 2, 0, | |||
| 1672 | The value is actually the first element of ALIST whose cdr equals KEY. */) | 1684 | The value is actually the first element of ALIST whose cdr equals KEY. */) |
| 1673 | (Lisp_Object key, Lisp_Object alist) | 1685 | (Lisp_Object key, Lisp_Object alist) |
| 1674 | { | 1686 | { |
| 1687 | if (eq_comparable_value (key)) | ||
| 1688 | return Frassq (key, alist); | ||
| 1675 | Lisp_Object tail = alist; | 1689 | Lisp_Object tail = alist; |
| 1676 | FOR_EACH_TAIL (tail) | 1690 | FOR_EACH_TAIL (tail) |
| 1677 | { | 1691 | { |