aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYuan Fu2023-04-16 20:33:51 -0700
committerYuan Fu2023-04-16 20:33:51 -0700
commitd005e685e1df7692085378633348db39a5190374 (patch)
treec12c2472fe53402ba341b0b518866aad34d6dc42 /src
parent6c81ef4cf985dad908fc473f31c0daf662fd2dad (diff)
downloademacs-d005e685e1df7692085378633348db39a5190374.tar.gz
emacs-d005e685e1df7692085378633348db39a5190374.zip
New helper function assq_no_signal
* src/fns.c (assq_no_signal): New function. * src/lisp.h (assoc_no_signal): Declare it. * src/treesit.c (safe_assq): Remove function. (treesit_traverse_get_predicate): Change safe_assq to assq_no_signal.
Diffstat (limited to 'src')
-rw-r--r--src/fns.c14
-rw-r--r--src/lisp.h1
-rw-r--r--src/treesit.c15
3 files changed, 17 insertions, 13 deletions
diff --git a/src/fns.c b/src/fns.c
index e92ef7e4c81..75acb6f4598 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -1966,6 +1966,20 @@ assq_no_quit (Lisp_Object key, Lisp_Object alist)
1966 return Qnil; 1966 return Qnil;
1967} 1967}
1968 1968
1969/* Assq but doesn't signal. Unlike assq_no_quit, this function still
1970 detect circular lists; like assq_no_quit, this function does not
1971 allow quits and never signals. If anything goes wrong, it returns
1972 Qnil. */
1973Lisp_Object
1974assq_no_signal (Lisp_Object key, Lisp_Object alist)
1975{
1976 Lisp_Object tail = alist;
1977 FOR_EACH_TAIL_SAFE (tail)
1978 if (CONSP (XCAR (tail)) && EQ (XCAR (XCAR (tail)), key))
1979 return XCAR (tail);
1980 return Qnil;
1981}
1982
1969DEFUN ("assoc", Fassoc, Sassoc, 2, 3, 0, 1983DEFUN ("assoc", Fassoc, Sassoc, 2, 3, 0,
1970 doc: /* Return non-nil if KEY is equal to the car of an element of ALIST. 1984 doc: /* Return non-nil if KEY is equal to the car of an element of ALIST.
1971The value is actually the first element of ALIST whose car equals KEY. 1985The value is actually the first element of ALIST whose car equals KEY.
diff --git a/src/lisp.h b/src/lisp.h
index 4e17e369312..ab66109d5df 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -4031,6 +4031,7 @@ extern Lisp_Object concat3 (Lisp_Object, Lisp_Object, Lisp_Object);
4031extern bool equal_no_quit (Lisp_Object, Lisp_Object); 4031extern bool equal_no_quit (Lisp_Object, Lisp_Object);
4032extern Lisp_Object nconc2 (Lisp_Object, Lisp_Object); 4032extern Lisp_Object nconc2 (Lisp_Object, Lisp_Object);
4033extern Lisp_Object assq_no_quit (Lisp_Object, Lisp_Object); 4033extern Lisp_Object assq_no_quit (Lisp_Object, Lisp_Object);
4034extern Lisp_Object assq_no_signal (Lisp_Object, Lisp_Object);
4034extern Lisp_Object assoc_no_quit (Lisp_Object, Lisp_Object); 4035extern Lisp_Object assoc_no_quit (Lisp_Object, Lisp_Object);
4035extern void clear_string_char_byte_cache (void); 4036extern void clear_string_char_byte_cache (void);
4036extern ptrdiff_t string_char_to_byte (Lisp_Object, ptrdiff_t); 4037extern ptrdiff_t string_char_to_byte (Lisp_Object, ptrdiff_t);
diff --git a/src/treesit.c b/src/treesit.c
index d2dd83b29fe..48abbc5fb4e 100644
--- a/src/treesit.c
+++ b/src/treesit.c
@@ -3153,17 +3153,6 @@ treesit_traverse_child_helper (TSTreeCursor *cursor,
3153 } 3153 }
3154} 3154}
3155 3155
3156/* Assq but doesn't signal. */
3157static Lisp_Object
3158safe_assq (Lisp_Object key, Lisp_Object alist)
3159{
3160 Lisp_Object tail = alist;
3161 FOR_EACH_TAIL_SAFE (tail)
3162 if (CONSP (XCAR (tail)) && EQ (XCAR (XCAR (tail)), key))
3163 return XCAR (tail);
3164 return Qnil;
3165}
3166
3167/* Given a symbol THING, and a language symbol LANGUAGE, find the 3156/* Given a symbol THING, and a language symbol LANGUAGE, find the
3168 corresponding predicate definition in treesit-things-settings. 3157 corresponding predicate definition in treesit-things-settings.
3169 Don't check for the type of THING and LANGUAGE. 3158 Don't check for the type of THING and LANGUAGE.
@@ -3172,11 +3161,11 @@ safe_assq (Lisp_Object key, Lisp_Object alist)
3172static Lisp_Object 3161static Lisp_Object
3173treesit_traverse_get_predicate (Lisp_Object thing, Lisp_Object language) 3162treesit_traverse_get_predicate (Lisp_Object thing, Lisp_Object language)
3174{ 3163{
3175 Lisp_Object cons = safe_assq (language, Vtreesit_thing_settings); 3164 Lisp_Object cons = assq_no_quit (language, Vtreesit_thing_settings);
3176 if (NILP (cons)) 3165 if (NILP (cons))
3177 return Qnil; 3166 return Qnil;
3178 Lisp_Object definitions = XCDR (cons); 3167 Lisp_Object definitions = XCDR (cons);
3179 Lisp_Object entry = safe_assq (thing, definitions); 3168 Lisp_Object entry = assq_no_quit (thing, definitions);
3180 if (NILP (entry)) 3169 if (NILP (entry))
3181 return Qnil; 3170 return Qnil;
3182 /* ENTRY looks like (THING PRED). */ 3171 /* ENTRY looks like (THING PRED). */