Skip to content

Commit

Permalink
New helper function assq_no_signal
Browse files Browse the repository at this point in the history
* 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.
  • Loading branch information
casouri committed Apr 17, 2023
1 parent 6c81ef4 commit d005e68
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 13 deletions.
14 changes: 14 additions & 0 deletions src/fns.c
Expand Up @@ -1966,6 +1966,20 @@ assq_no_quit (Lisp_Object key, Lisp_Object alist)
return Qnil;
}

/* Assq but doesn't signal. Unlike assq_no_quit, this function still
detect circular lists; like assq_no_quit, this function does not
allow quits and never signals. If anything goes wrong, it returns
Qnil. */
Lisp_Object
assq_no_signal (Lisp_Object key, Lisp_Object alist)
{
Lisp_Object tail = alist;
FOR_EACH_TAIL_SAFE (tail)
if (CONSP (XCAR (tail)) && EQ (XCAR (XCAR (tail)), key))
return XCAR (tail);
return Qnil;
}

DEFUN ("assoc", Fassoc, Sassoc, 2, 3, 0,
doc: /* Return non-nil if KEY is equal to the car of an element of ALIST.
The value is actually the first element of ALIST whose car equals KEY.
Expand Down
1 change: 1 addition & 0 deletions src/lisp.h
Expand Up @@ -4031,6 +4031,7 @@ extern Lisp_Object concat3 (Lisp_Object, Lisp_Object, Lisp_Object);
extern bool equal_no_quit (Lisp_Object, Lisp_Object);
extern Lisp_Object nconc2 (Lisp_Object, Lisp_Object);
extern Lisp_Object assq_no_quit (Lisp_Object, Lisp_Object);
extern Lisp_Object assq_no_signal (Lisp_Object, Lisp_Object);
extern Lisp_Object assoc_no_quit (Lisp_Object, Lisp_Object);
extern void clear_string_char_byte_cache (void);
extern ptrdiff_t string_char_to_byte (Lisp_Object, ptrdiff_t);
Expand Down
15 changes: 2 additions & 13 deletions src/treesit.c
Expand Up @@ -3153,17 +3153,6 @@ treesit_traverse_child_helper (TSTreeCursor *cursor,
}
}

/* Assq but doesn't signal. */
static Lisp_Object
safe_assq (Lisp_Object key, Lisp_Object alist)
{
Lisp_Object tail = alist;
FOR_EACH_TAIL_SAFE (tail)
if (CONSP (XCAR (tail)) && EQ (XCAR (XCAR (tail)), key))
return XCAR (tail);
return Qnil;
}

/* Given a symbol THING, and a language symbol LANGUAGE, find the
corresponding predicate definition in treesit-things-settings.
Don't check for the type of THING and LANGUAGE.
Expand All @@ -3172,11 +3161,11 @@ safe_assq (Lisp_Object key, Lisp_Object alist)
static Lisp_Object
treesit_traverse_get_predicate (Lisp_Object thing, Lisp_Object language)
{
Lisp_Object cons = safe_assq (language, Vtreesit_thing_settings);
Lisp_Object cons = assq_no_quit (language, Vtreesit_thing_settings);
if (NILP (cons))
return Qnil;
Lisp_Object definitions = XCDR (cons);
Lisp_Object entry = safe_assq (thing, definitions);
Lisp_Object entry = assq_no_quit (thing, definitions);
if (NILP (entry))
return Qnil;
/* ENTRY looks like (THING PRED). */
Expand Down

0 comments on commit d005e68

Please sign in to comment.