diff options
| author | Yuan Fu | 2023-04-16 20:33:51 -0700 |
|---|---|---|
| committer | Yuan Fu | 2023-04-16 20:33:51 -0700 |
| commit | d005e685e1df7692085378633348db39a5190374 (patch) | |
| tree | c12c2472fe53402ba341b0b518866aad34d6dc42 /src | |
| parent | 6c81ef4cf985dad908fc473f31c0daf662fd2dad (diff) | |
| download | emacs-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.c | 14 | ||||
| -rw-r--r-- | src/lisp.h | 1 | ||||
| -rw-r--r-- | src/treesit.c | 15 |
3 files changed, 17 insertions, 13 deletions
| @@ -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. */ | ||
| 1973 | Lisp_Object | ||
| 1974 | assq_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 | |||
| 1969 | DEFUN ("assoc", Fassoc, Sassoc, 2, 3, 0, | 1983 | DEFUN ("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. |
| 1971 | The value is actually the first element of ALIST whose car equals KEY. | 1985 | The 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); | |||
| 4031 | extern bool equal_no_quit (Lisp_Object, Lisp_Object); | 4031 | extern bool equal_no_quit (Lisp_Object, Lisp_Object); |
| 4032 | extern Lisp_Object nconc2 (Lisp_Object, Lisp_Object); | 4032 | extern Lisp_Object nconc2 (Lisp_Object, Lisp_Object); |
| 4033 | extern Lisp_Object assq_no_quit (Lisp_Object, Lisp_Object); | 4033 | extern Lisp_Object assq_no_quit (Lisp_Object, Lisp_Object); |
| 4034 | extern Lisp_Object assq_no_signal (Lisp_Object, Lisp_Object); | ||
| 4034 | extern Lisp_Object assoc_no_quit (Lisp_Object, Lisp_Object); | 4035 | extern Lisp_Object assoc_no_quit (Lisp_Object, Lisp_Object); |
| 4035 | extern void clear_string_char_byte_cache (void); | 4036 | extern void clear_string_char_byte_cache (void); |
| 4036 | extern ptrdiff_t string_char_to_byte (Lisp_Object, ptrdiff_t); | 4037 | extern 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. */ | ||
| 3157 | static Lisp_Object | ||
| 3158 | safe_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) | |||
| 3172 | static Lisp_Object | 3161 | static Lisp_Object |
| 3173 | treesit_traverse_get_predicate (Lisp_Object thing, Lisp_Object language) | 3162 | treesit_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). */ |