diff --git a/lib/include/tree_sitter/api.h b/lib/include/tree_sitter/api.h index ffc108ca..f1c69dec 100644 --- a/lib/include/tree_sitter/api.h +++ b/lib/include/tree_sitter/api.h @@ -299,16 +299,7 @@ const TSRange *ts_parser_included_ranges( * are four possible reasons for failure: * 1. The parser does not have a language assigned. Check for this using the [`ts_parser_language`] function. - * 2. Parsing was cancelled due to a timeout that was set by an earlier call to - * the [`ts_parser_set_timeout_micros`] function. You can resume parsing from - * where the parser left out by calling [`ts_parser_parse`] again with the - * same arguments. Or you can start parsing from scratch by first calling - * [`ts_parser_reset`]. - * 3. Parsing was cancelled using a cancellation flag that was set by an - * earlier call to [`ts_parser_set_cancellation_flag`]. You can resume parsing - * from where the parser left out by calling [`ts_parser_parse`] again with - * the same arguments. - * 4. Parsing was cancelled due to the progress callback returning true. This callback + * 2. Parsing was cancelled due to the progress callback returning true. This callback * is passed in [`ts_parser_parse_with_options`] inside the [`TSParseOptions`] struct. * * [`read`]: TSInput::read @@ -366,7 +357,7 @@ TSTree *ts_parser_parse_string_encoding( /** * Instruct the parser to start the next parse from the beginning. * - * If the parser previously failed because of a timeout or a cancellation, then + * If the parser previously failed because of the progress callback, then * by default, it will resume where it left off on the next call to * [`ts_parser_parse`] or other parsing functions. If you don't want to resume, * and instead intend to use this parser to parse some other document, you must @@ -374,42 +365,6 @@ TSTree *ts_parser_parse_string_encoding( */ void ts_parser_reset(TSParser *self); -/** - * @deprecated use [`ts_parser_parse_with_options`] and pass in a callback instead, this will be removed in 0.26. - * - * Set the maximum duration in microseconds that parsing should be allowed to - * take before halting. - * - * If parsing takes longer than this, it will halt early, returning NULL. - * See [`ts_parser_parse`] for more information. - */ -void ts_parser_set_timeout_micros(TSParser *self, uint64_t timeout_micros); - -/** - * @deprecated use [`ts_parser_parse_with_options`] and pass in a callback instead, this will be removed in 0.26. - * - * Get the duration in microseconds that parsing is allowed to take. - */ -uint64_t ts_parser_timeout_micros(const TSParser *self); - -/** - * @deprecated use [`ts_parser_parse_with_options`] and pass in a callback instead, this will be removed in 0.26. - * - * Set the parser's current cancellation flag pointer. - * - * If a non-null pointer is assigned, then the parser will periodically read - * from this pointer during parsing. If it reads a non-zero value, it will - * halt early, returning NULL. See [`ts_parser_parse`] for more information. - */ -void ts_parser_set_cancellation_flag(TSParser *self, const size_t *flag); - -/** - * @deprecated use [`ts_parser_parse_with_options`] and pass in a callback instead, this will be removed in 0.26. - * - * Get the parser's current cancellation flag pointer. - */ -const size_t *ts_parser_cancellation_flag(const TSParser *self); - /** * Set the logger that a parser should use during parsing. * @@ -1094,26 +1049,6 @@ bool ts_query_cursor_did_exceed_match_limit(const TSQueryCursor *self); uint32_t ts_query_cursor_match_limit(const TSQueryCursor *self); void ts_query_cursor_set_match_limit(TSQueryCursor *self, uint32_t limit); -/** - * @deprecated use [`ts_query_cursor_exec_with_options`] and pass in a callback instead, this will be removed in 0.26. - * - * Set the maximum duration in microseconds that query execution should be allowed to - * take before halting. - * - * If query execution takes longer than this, it will halt early, returning NULL. - * See [`ts_query_cursor_next_match`] or [`ts_query_cursor_next_capture`] for more information. - */ -void ts_query_cursor_set_timeout_micros(TSQueryCursor *self, uint64_t timeout_micros); - -/** - * @deprecated use [`ts_query_cursor_exec_with_options`] and pass in a callback instead, this will be removed in 0.26. - * - * Get the duration in microseconds that query execution is allowed to take. - * - * This is set via [`ts_query_cursor_set_timeout_micros`]. - */ -uint64_t ts_query_cursor_timeout_micros(const TSQueryCursor *self); - /** * Set the range of bytes in which the query will be executed. * @@ -1264,17 +1199,6 @@ const char *ts_language_symbol_name(const TSLanguage *self, TSSymbol symbol); */ TSSymbolType ts_language_symbol_type(const TSLanguage *self, TSSymbol symbol); -/** - * @deprecated use [`ts_language_abi_version`] instead, this will be removed in 0.26. - * - * Get the ABI version number for this language. This version number is used - * to ensure that languages were generated by a compatible version of - * Tree-sitter. - * - * See also [`ts_parser_set_language`]. - */ -uint32_t ts_language_version(const TSLanguage *self); - /** * Get the ABI version number for this language. This version number is used * to ensure that languages were generated by a compatible version of diff --git a/lib/src/clock.h b/lib/src/clock.h deleted file mode 100644 index 7a13185e..00000000 --- a/lib/src/clock.h +++ /dev/null @@ -1,146 +0,0 @@ -#ifndef TREE_SITTER_CLOCK_H_ -#define TREE_SITTER_CLOCK_H_ - -#include -#include - -typedef uint64_t TSDuration; - -#ifdef _WIN32 - -// Windows: -// * Represent a time as a performance counter value. -// * Represent a duration as a number of performance counter ticks. - -#include -typedef uint64_t TSClock; - -static inline TSDuration duration_from_micros(uint64_t micros) { - LARGE_INTEGER frequency; - QueryPerformanceFrequency(&frequency); - return micros * (uint64_t)frequency.QuadPart / 1000000; -} - -static inline uint64_t duration_to_micros(TSDuration self) { - LARGE_INTEGER frequency; - QueryPerformanceFrequency(&frequency); - return self * 1000000 / (uint64_t)frequency.QuadPart; -} - -static inline TSClock clock_null(void) { - return 0; -} - -static inline TSClock clock_now(void) { - LARGE_INTEGER result; - QueryPerformanceCounter(&result); - return (uint64_t)result.QuadPart; -} - -static inline TSClock clock_after(TSClock base, TSDuration duration) { - return base + duration; -} - -static inline bool clock_is_null(TSClock self) { - return !self; -} - -static inline bool clock_is_gt(TSClock self, TSClock other) { - return self > other; -} - -#elif defined(CLOCK_MONOTONIC) - -// POSIX with monotonic clock support (Linux, macOS) -// * Represent a time as a monotonic (seconds, nanoseconds) pair. -// * Represent a duration as a number of microseconds. -// -// On these platforms, parse timeouts will correspond accurately to -// real time, regardless of what other processes are running. - -#include -typedef struct timespec TSClock; - -static inline TSDuration duration_from_micros(uint64_t micros) { - return micros; -} - -static inline uint64_t duration_to_micros(TSDuration self) { - return self; -} - -static inline TSClock clock_now(void) { - TSClock result; - clock_gettime(CLOCK_MONOTONIC, &result); - return result; -} - -static inline TSClock clock_null(void) { - return (TSClock) {0, 0}; -} - -static inline TSClock clock_after(TSClock base, TSDuration duration) { - TSClock result = base; - result.tv_sec += duration / 1000000; - result.tv_nsec += (duration % 1000000) * 1000; - if (result.tv_nsec >= 1000000000) { - result.tv_nsec -= 1000000000; - ++(result.tv_sec); - } - return result; -} - -static inline bool clock_is_null(TSClock self) { - return !self.tv_sec && !self.tv_nsec; -} - -static inline bool clock_is_gt(TSClock self, TSClock other) { - if (self.tv_sec > other.tv_sec) return true; - if (self.tv_sec < other.tv_sec) return false; - return self.tv_nsec > other.tv_nsec; -} - -#else - -// POSIX without monotonic clock support -// * Represent a time as a process clock value. -// * Represent a duration as a number of process clock ticks. -// -// On these platforms, parse timeouts may be affected by other processes, -// which is not ideal, but is better than using a non-monotonic time API -// like `gettimeofday`. - -#include -typedef uint64_t TSClock; - -static inline TSDuration duration_from_micros(uint64_t micros) { - return micros * (uint64_t)CLOCKS_PER_SEC / 1000000; -} - -static inline uint64_t duration_to_micros(TSDuration self) { - return self * 1000000 / (uint64_t)CLOCKS_PER_SEC; -} - -static inline TSClock clock_null(void) { - return 0; -} - -static inline TSClock clock_now(void) { - return (uint64_t)clock(); -} - -static inline TSClock clock_after(TSClock base, TSDuration duration) { - return base + duration; -} - -static inline bool clock_is_null(TSClock self) { - return !self; -} - -static inline bool clock_is_gt(TSClock self, TSClock other) { - return self > other; -} - -#endif - -#endif // TREE_SITTER_CLOCK_H_ diff --git a/lib/src/language.c b/lib/src/language.c index 2dce6998..de5e1f91 100644 --- a/lib/src/language.c +++ b/lib/src/language.c @@ -49,10 +49,6 @@ const TSSymbol *ts_language_subtypes( return &self->supertype_map_entries[slice.index]; } -uint32_t ts_language_version(const TSLanguage *self) { - return self->abi_version; -} - uint32_t ts_language_abi_version(const TSLanguage *self) { return self->abi_version; } diff --git a/lib/src/parser.c b/lib/src/parser.c index d0a2d2ca..9362dc63 100644 --- a/lib/src/parser.c +++ b/lib/src/parser.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -6,8 +5,6 @@ #include "tree_sitter/api.h" #include "./alloc.h" #include "./array.h" -#include "./atomic.h" -#include "./clock.h" #include "./error_costs.h" #include "./get_changed_ranges.h" #include "./language.h" @@ -81,7 +78,7 @@ static const unsigned MAX_VERSION_COUNT = 6; static const unsigned MAX_VERSION_COUNT_OVERFLOW = 4; static const unsigned MAX_SUMMARY_DEPTH = 16; static const unsigned MAX_COST_DIFFERENCE = 18 * ERROR_COST_PER_SKIPPED_TREE; -static const unsigned OP_COUNT_PER_PARSER_TIMEOUT_CHECK = 100; +static const unsigned OP_COUNT_PER_PARSER_CALLBACK_CHECK = 100; typedef struct { Subtree token; @@ -104,11 +101,8 @@ struct TSParser { ReusableNode reusable_node; void *external_scanner_payload; FILE *dot_graph_file; - TSClock end_clock; - TSDuration timeout_duration; unsigned accept_count; unsigned operation_count; - const volatile size_t *cancellation_flag; Subtree old_tree; TSRangeArray included_range_differences; TSParseOptions parse_options; @@ -1537,7 +1531,7 @@ static void ts_parser__handle_error( static bool ts_parser__check_progress(TSParser *self, Subtree *lookahead, const uint32_t *position, unsigned operations) { self->operation_count += operations; - if (self->operation_count >= OP_COUNT_PER_PARSER_TIMEOUT_CHECK) { + if (self->operation_count >= OP_COUNT_PER_PARSER_CALLBACK_CHECK) { self->operation_count = 0; } if (position != NULL) { @@ -1546,12 +1540,7 @@ static bool ts_parser__check_progress(TSParser *self, Subtree *lookahead, const } if ( self->operation_count == 0 && - ( - // TODO(amaanq): remove cancellation flag & clock checks before 0.26 - (self->cancellation_flag && atomic_load(self->cancellation_flag)) || - (!clock_is_null(self->end_clock) && clock_is_gt(clock_now(), self->end_clock)) || - (self->parse_options.progress_callback && self->parse_options.progress_callback(&self->parse_state)) - ) + (self->parse_options.progress_callback && self->parse_options.progress_callback(&self->parse_state)) ) { if (lookahead && lookahead->ptr) { ts_subtree_release(&self->tree_pool, *lookahead); @@ -1611,7 +1600,7 @@ static bool ts_parser__advance( } } - // If a cancellation flag, timeout, or progress callback was provided, then check every + // If a progress callback was provided, then check every // time a fixed number of parse actions has been processed. if (!ts_parser__check_progress(self, &lookahead, &position, 1)) { return false; @@ -1949,14 +1938,11 @@ TSParser *ts_parser_new(void) { self->finished_tree = NULL_SUBTREE; self->reusable_node = reusable_node_new(); self->dot_graph_file = NULL; - self->cancellation_flag = NULL; - self->timeout_duration = 0; self->language = NULL; self->has_scanner_error = false; self->has_error = false; self->canceled_balancing = false; self->external_scanner_payload = NULL; - self->end_clock = clock_null(); self->operation_count = 0; self->old_tree = NULL_SUBTREE; self->included_range_differences = (TSRangeArray) array_new(); @@ -2042,22 +2028,6 @@ void ts_parser_print_dot_graphs(TSParser *self, int fd) { } } -const size_t *ts_parser_cancellation_flag(const TSParser *self) { - return (const size_t *)self->cancellation_flag; -} - -void ts_parser_set_cancellation_flag(TSParser *self, const size_t *flag) { - self->cancellation_flag = (const volatile size_t *)flag; -} - -uint64_t ts_parser_timeout_micros(const TSParser *self) { - return duration_to_micros(self->timeout_duration); -} - -void ts_parser_set_timeout_micros(TSParser *self, uint64_t timeout_micros) { - self->timeout_duration = duration_from_micros(timeout_micros); -} - bool ts_parser_set_included_ranges( TSParser *self, const TSRange *ranges, @@ -2115,11 +2085,6 @@ TSTree *ts_parser_parse( self->included_range_difference_index = 0; self->operation_count = 0; - if (self->timeout_duration) { - self->end_clock = clock_after(clock_now(), self->timeout_duration); - } else { - self->end_clock = clock_null(); - } if (ts_parser_has_outstanding_parse(self)) { LOG("resume_parsing"); diff --git a/lib/src/query.c b/lib/src/query.c index a961fbbb..90dd30b6 100644 --- a/lib/src/query.c +++ b/lib/src/query.c @@ -10,7 +10,6 @@ #include "tree_sitter/api.h" #include "./alloc.h" #include "./array.h" -#include "./clock.h" #include "./language.h" #include "./point.h" #include "./tree_cursor.h" @@ -324,8 +323,6 @@ struct TSQueryCursor { TSPoint start_point; TSPoint end_point; uint32_t next_state_id; - TSClock end_clock; - TSDuration timeout_duration; const TSQueryCursorOptions *query_options; TSQueryCursorState query_state; unsigned operation_count; @@ -339,7 +336,7 @@ static const TSQueryError PARENT_DONE = -1; static const uint16_t PATTERN_DONE_MARKER = UINT16_MAX; static const uint16_t NONE = UINT16_MAX; static const TSSymbol WILDCARD_SYMBOL = 0; -static const unsigned OP_COUNT_PER_QUERY_TIMEOUT_CHECK = 100; +static const unsigned OP_COUNT_PER_QUERY_CALLBACK_CHECK = 100; /********** * Stream @@ -3099,8 +3096,6 @@ TSQueryCursor *ts_query_cursor_new(void) { .start_point = {0, 0}, .end_point = POINT_MAX, .max_start_depth = UINT32_MAX, - .timeout_duration = 0, - .end_clock = clock_null(), .operation_count = 0, }; array_reserve(&self->states, 8); @@ -3128,14 +3123,6 @@ void ts_query_cursor_set_match_limit(TSQueryCursor *self, uint32_t limit) { self->capture_list_pool.max_capture_list_count = limit; } -uint64_t ts_query_cursor_timeout_micros(const TSQueryCursor *self) { - return duration_to_micros(self->timeout_duration); -} - -void ts_query_cursor_set_timeout_micros(TSQueryCursor *self, uint64_t timeout_micros) { - self->timeout_duration = duration_from_micros(timeout_micros); -} - #ifdef DEBUG_EXECUTE_QUERY #define LOG(...) fprintf(stderr, __VA_ARGS__) #else @@ -3185,11 +3172,6 @@ void ts_query_cursor_exec( self->query = query; self->did_exceed_match_limit = false; self->operation_count = 0; - if (self->timeout_duration) { - self->end_clock = clock_after(clock_now(), self->timeout_duration); - } else { - self->end_clock = clock_null(); - } self->query_options = NULL; self->query_state = (TSQueryCursorState) {0}; } @@ -3614,7 +3596,7 @@ static inline bool ts_query_cursor__advance( } } - if (++self->operation_count == OP_COUNT_PER_QUERY_TIMEOUT_CHECK) { + if (++self->operation_count == OP_COUNT_PER_QUERY_CALLBACK_CHECK) { self->operation_count = 0; } @@ -3627,7 +3609,6 @@ static inline bool ts_query_cursor__advance( ( self->operation_count == 0 && ( - (!clock_is_null(self->end_clock) && clock_is_gt(clock_now(), self->end_clock)) || (self->query_options && self->query_options->progress_callback && self->query_options->progress_callback(&self->query_state)) ) )