diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/insdel.c | 19 | ||||
| -rw-r--r-- | src/lisp.h | 3 | ||||
| -rw-r--r-- | src/search.c | 5 | ||||
| -rw-r--r-- | src/sqlite.c | 10 | ||||
| -rw-r--r-- | src/treesit.c | 43 | ||||
| -rw-r--r-- | src/xfaces.c | 3 |
6 files changed, 63 insertions, 20 deletions
diff --git a/src/insdel.c b/src/insdel.c index 0e1e98664b3..e459d0cfa17 100644 --- a/src/insdel.c +++ b/src/insdel.c | |||
| @@ -1101,6 +1101,10 @@ insert_from_gap_1 (ptrdiff_t nchars, ptrdiff_t nbytes, bool text_at_gap_tail) | |||
| 1101 | eassert (NILP (BVAR (current_buffer, enable_multibyte_characters)) | 1101 | eassert (NILP (BVAR (current_buffer, enable_multibyte_characters)) |
| 1102 | ? nchars == nbytes : nchars <= nbytes); | 1102 | ? nchars == nbytes : nchars <= nbytes); |
| 1103 | 1103 | ||
| 1104 | #ifdef HAVE_TREE_SITTER | ||
| 1105 | ptrdiff_t ins_bytepos = GPT_BYTE; | ||
| 1106 | #endif | ||
| 1107 | |||
| 1104 | GAP_SIZE -= nbytes; | 1108 | GAP_SIZE -= nbytes; |
| 1105 | if (! text_at_gap_tail) | 1109 | if (! text_at_gap_tail) |
| 1106 | { | 1110 | { |
| @@ -1115,6 +1119,12 @@ insert_from_gap_1 (ptrdiff_t nchars, ptrdiff_t nbytes, bool text_at_gap_tail) | |||
| 1115 | /* Put an anchor to ensure multi-byte form ends at gap. */ | 1119 | /* Put an anchor to ensure multi-byte form ends at gap. */ |
| 1116 | if (GAP_SIZE > 0) *(GPT_ADDR) = 0; | 1120 | if (GAP_SIZE > 0) *(GPT_ADDR) = 0; |
| 1117 | eassert (GPT <= GPT_BYTE); | 1121 | eassert (GPT <= GPT_BYTE); |
| 1122 | |||
| 1123 | #ifdef HAVE_TREE_SITTER | ||
| 1124 | eassert (nbytes >= 0); | ||
| 1125 | eassert (ins_bytepos >= 0); | ||
| 1126 | treesit_record_change (ins_bytepos, ins_bytepos, ins_bytepos + nbytes); | ||
| 1127 | #endif | ||
| 1118 | } | 1128 | } |
| 1119 | 1129 | ||
| 1120 | /* Insert a sequence of NCHARS chars which occupy NBYTES bytes | 1130 | /* Insert a sequence of NCHARS chars which occupy NBYTES bytes |
| @@ -1150,12 +1160,6 @@ insert_from_gap (ptrdiff_t nchars, ptrdiff_t nbytes, bool text_at_gap_tail) | |||
| 1150 | current_buffer, 0); | 1160 | current_buffer, 0); |
| 1151 | } | 1161 | } |
| 1152 | 1162 | ||
| 1153 | #ifdef HAVE_TREE_SITTER | ||
| 1154 | eassert (nbytes >= 0); | ||
| 1155 | eassert (ins_bytepos >= 0); | ||
| 1156 | treesit_record_change (ins_bytepos, ins_bytepos, ins_bytepos + nbytes); | ||
| 1157 | #endif | ||
| 1158 | |||
| 1159 | if (ins_charpos < PT) | 1163 | if (ins_charpos < PT) |
| 1160 | adjust_point (nchars, nbytes); | 1164 | adjust_point (nchars, nbytes); |
| 1161 | 1165 | ||
| @@ -1191,6 +1195,9 @@ insert_from_buffer (struct buffer *buf, | |||
| 1191 | #endif | 1195 | #endif |
| 1192 | } | 1196 | } |
| 1193 | 1197 | ||
| 1198 | /* NOTE: If we ever make insert_from_buffer_1 public, make sure to | ||
| 1199 | move the call to treesit_record_change into it. */ | ||
| 1200 | |||
| 1194 | static void | 1201 | static void |
| 1195 | insert_from_buffer_1 (struct buffer *buf, | 1202 | insert_from_buffer_1 (struct buffer *buf, |
| 1196 | ptrdiff_t from, ptrdiff_t nchars, bool inherit) | 1203 | ptrdiff_t from, ptrdiff_t nchars, bool inherit) |
diff --git a/src/lisp.h b/src/lisp.h index 6fda1e95503..b545c498173 100644 --- a/src/lisp.h +++ b/src/lisp.h | |||
| @@ -4807,6 +4807,9 @@ extern ptrdiff_t find_newline_no_quit (ptrdiff_t, ptrdiff_t, | |||
| 4807 | ptrdiff_t, ptrdiff_t *); | 4807 | ptrdiff_t, ptrdiff_t *); |
| 4808 | extern ptrdiff_t find_before_next_newline (ptrdiff_t, ptrdiff_t, | 4808 | extern ptrdiff_t find_before_next_newline (ptrdiff_t, ptrdiff_t, |
| 4809 | ptrdiff_t, ptrdiff_t *); | 4809 | ptrdiff_t, ptrdiff_t *); |
| 4810 | extern EMACS_INT search_buffer (Lisp_Object, ptrdiff_t, ptrdiff_t, | ||
| 4811 | ptrdiff_t, ptrdiff_t, EMACS_INT, | ||
| 4812 | int, Lisp_Object, Lisp_Object, bool); | ||
| 4810 | extern void syms_of_search (void); | 4813 | extern void syms_of_search (void); |
| 4811 | extern void clear_regexp_cache (void); | 4814 | extern void clear_regexp_cache (void); |
| 4812 | 4815 | ||
diff --git a/src/search.c b/src/search.c index dbc5a83946f..0bb52c03eef 100644 --- a/src/search.c +++ b/src/search.c | |||
| @@ -68,9 +68,6 @@ static EMACS_INT simple_search (EMACS_INT, unsigned char *, ptrdiff_t, | |||
| 68 | static EMACS_INT boyer_moore (EMACS_INT, unsigned char *, ptrdiff_t, | 68 | static EMACS_INT boyer_moore (EMACS_INT, unsigned char *, ptrdiff_t, |
| 69 | Lisp_Object, Lisp_Object, ptrdiff_t, | 69 | Lisp_Object, Lisp_Object, ptrdiff_t, |
| 70 | ptrdiff_t, int); | 70 | ptrdiff_t, int); |
| 71 | static EMACS_INT search_buffer (Lisp_Object, ptrdiff_t, ptrdiff_t, | ||
| 72 | ptrdiff_t, ptrdiff_t, EMACS_INT, int, | ||
| 73 | Lisp_Object, Lisp_Object, bool); | ||
| 74 | 71 | ||
| 75 | Lisp_Object re_match_object; | 72 | Lisp_Object re_match_object; |
| 76 | 73 | ||
| @@ -1510,7 +1507,7 @@ search_buffer_non_re (Lisp_Object string, ptrdiff_t pos, | |||
| 1510 | return result; | 1507 | return result; |
| 1511 | } | 1508 | } |
| 1512 | 1509 | ||
| 1513 | static EMACS_INT | 1510 | EMACS_INT |
| 1514 | search_buffer (Lisp_Object string, ptrdiff_t pos, ptrdiff_t pos_byte, | 1511 | search_buffer (Lisp_Object string, ptrdiff_t pos, ptrdiff_t pos_byte, |
| 1515 | ptrdiff_t lim, ptrdiff_t lim_byte, EMACS_INT n, | 1512 | ptrdiff_t lim, ptrdiff_t lim_byte, EMACS_INT n, |
| 1516 | int RE, Lisp_Object trt, Lisp_Object inverse_trt, bool posix) | 1513 | int RE, Lisp_Object trt, Lisp_Object inverse_trt, bool posix) |
diff --git a/src/sqlite.c b/src/sqlite.c index c96841e63f9..0361514766a 100644 --- a/src/sqlite.c +++ b/src/sqlite.c | |||
| @@ -399,7 +399,7 @@ row_to_value (sqlite3_stmt *stmt) | |||
| 399 | int len = sqlite3_column_count (stmt); | 399 | int len = sqlite3_column_count (stmt); |
| 400 | Lisp_Object values = Qnil; | 400 | Lisp_Object values = Qnil; |
| 401 | 401 | ||
| 402 | for (int i = 0; i < len; ++i) | 402 | for (int i = len - 1; i >= 0; i--) |
| 403 | { | 403 | { |
| 404 | Lisp_Object v = Qnil; | 404 | Lisp_Object v = Qnil; |
| 405 | 405 | ||
| @@ -434,7 +434,7 @@ row_to_value (sqlite3_stmt *stmt) | |||
| 434 | values = Fcons (v, values); | 434 | values = Fcons (v, values); |
| 435 | } | 435 | } |
| 436 | 436 | ||
| 437 | return Fnreverse (values); | 437 | return values; |
| 438 | } | 438 | } |
| 439 | 439 | ||
| 440 | static Lisp_Object | 440 | static Lisp_Object |
| @@ -718,11 +718,15 @@ Only modules on Emacs' list of allowed modules can be loaded. */) | |||
| 718 | #endif /* HAVE_SQLITE3_LOAD_EXTENSION */ | 718 | #endif /* HAVE_SQLITE3_LOAD_EXTENSION */ |
| 719 | 719 | ||
| 720 | DEFUN ("sqlite-next", Fsqlite_next, Ssqlite_next, 1, 1, 0, | 720 | DEFUN ("sqlite-next", Fsqlite_next, Ssqlite_next, 1, 1, 0, |
| 721 | doc: /* Return the next result set from SET. */) | 721 | doc: /* Return the next result set from SET. |
| 722 | Return nil when the statement has finished executing successfully. */) | ||
| 722 | (Lisp_Object set) | 723 | (Lisp_Object set) |
| 723 | { | 724 | { |
| 724 | check_sqlite (set, true); | 725 | check_sqlite (set, true); |
| 725 | 726 | ||
| 727 | if (XSQLITE (set)->eof) | ||
| 728 | return Qnil; | ||
| 729 | |||
| 726 | int ret = sqlite3_step (XSQLITE (set)->stmt); | 730 | int ret = sqlite3_step (XSQLITE (set)->stmt); |
| 727 | if (ret != SQLITE_ROW && ret != SQLITE_OK && ret != SQLITE_DONE) | 731 | if (ret != SQLITE_ROW && ret != SQLITE_OK && ret != SQLITE_DONE) |
| 728 | xsignal1 (Qsqlite_error, build_string (sqlite3_errmsg (XSQLITE (set)->db))); | 732 | xsignal1 (Qsqlite_error, build_string (sqlite3_errmsg (XSQLITE (set)->db))); |
diff --git a/src/treesit.c b/src/treesit.c index b163685419f..8e772523cc7 100644 --- a/src/treesit.c +++ b/src/treesit.c | |||
| @@ -72,6 +72,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 72 | #undef ts_query_cursor_set_byte_range | 72 | #undef ts_query_cursor_set_byte_range |
| 73 | #undef ts_query_delete | 73 | #undef ts_query_delete |
| 74 | #undef ts_query_new | 74 | #undef ts_query_new |
| 75 | #undef ts_query_pattern_count | ||
| 75 | #undef ts_query_predicates_for_pattern | 76 | #undef ts_query_predicates_for_pattern |
| 76 | #undef ts_query_string_value_for_id | 77 | #undef ts_query_string_value_for_id |
| 77 | #undef ts_set_allocator | 78 | #undef ts_set_allocator |
| @@ -135,6 +136,7 @@ DEF_DLL_FN (void, ts_query_cursor_set_byte_range, | |||
| 135 | DEF_DLL_FN (void, ts_query_delete, (TSQuery *)); | 136 | DEF_DLL_FN (void, ts_query_delete, (TSQuery *)); |
| 136 | DEF_DLL_FN (TSQuery *, ts_query_new, | 137 | DEF_DLL_FN (TSQuery *, ts_query_new, |
| 137 | (const TSLanguage *, const char *, uint32_t, uint32_t *, TSQueryError *)); | 138 | (const TSLanguage *, const char *, uint32_t, uint32_t *, TSQueryError *)); |
| 139 | DEF_DLL_FN (uint32_t, ts_query_pattern_count, (const TSQuery *)); | ||
| 138 | DEF_DLL_FN (const TSQueryPredicateStep *, ts_query_predicates_for_pattern, | 140 | DEF_DLL_FN (const TSQueryPredicateStep *, ts_query_predicates_for_pattern, |
| 139 | ( const TSQuery *, uint32_t, uint32_t *)); | 141 | ( const TSQuery *, uint32_t, uint32_t *)); |
| 140 | DEF_DLL_FN (const char *, ts_query_string_value_for_id, | 142 | DEF_DLL_FN (const char *, ts_query_string_value_for_id, |
| @@ -200,6 +202,7 @@ init_treesit_functions (void) | |||
| 200 | LOAD_DLL_FN (library, ts_query_cursor_set_byte_range); | 202 | LOAD_DLL_FN (library, ts_query_cursor_set_byte_range); |
| 201 | LOAD_DLL_FN (library, ts_query_delete); | 203 | LOAD_DLL_FN (library, ts_query_delete); |
| 202 | LOAD_DLL_FN (library, ts_query_new); | 204 | LOAD_DLL_FN (library, ts_query_new); |
| 205 | LOAD_DLL_FN (library, ts_query_pattern_count); | ||
| 203 | LOAD_DLL_FN (library, ts_query_predicates_for_pattern); | 206 | LOAD_DLL_FN (library, ts_query_predicates_for_pattern); |
| 204 | LOAD_DLL_FN (library, ts_query_string_value_for_id); | 207 | LOAD_DLL_FN (library, ts_query_string_value_for_id); |
| 205 | LOAD_DLL_FN (library, ts_set_allocator); | 208 | LOAD_DLL_FN (library, ts_set_allocator); |
| @@ -256,6 +259,7 @@ init_treesit_functions (void) | |||
| 256 | #define ts_query_cursor_set_byte_range fn_ts_query_cursor_set_byte_range | 259 | #define ts_query_cursor_set_byte_range fn_ts_query_cursor_set_byte_range |
| 257 | #define ts_query_delete fn_ts_query_delete | 260 | #define ts_query_delete fn_ts_query_delete |
| 258 | #define ts_query_new fn_ts_query_new | 261 | #define ts_query_new fn_ts_query_new |
| 262 | #define ts_query_pattern_count fn_ts_query_pattern_count | ||
| 259 | #define ts_query_predicates_for_pattern fn_ts_query_predicates_for_pattern | 263 | #define ts_query_predicates_for_pattern fn_ts_query_predicates_for_pattern |
| 260 | #define ts_query_string_value_for_id fn_ts_query_string_value_for_id | 264 | #define ts_query_string_value_for_id fn_ts_query_string_value_for_id |
| 261 | #define ts_set_allocator fn_ts_set_allocator | 265 | #define ts_set_allocator fn_ts_set_allocator |
| @@ -2466,13 +2470,42 @@ treesit_predicate_match (Lisp_Object args, struct capture_range captures) | |||
| 2466 | build_string ("The second argument to `match' should " | 2470 | build_string ("The second argument to `match' should " |
| 2467 | "be a capture name, not a string")); | 2471 | "be a capture name, not a string")); |
| 2468 | 2472 | ||
| 2469 | Lisp_Object text = treesit_predicate_capture_name_to_text (capture_name, | 2473 | Lisp_Object node = treesit_predicate_capture_name_to_node (capture_name, |
| 2470 | captures); | 2474 | captures); |
| 2471 | 2475 | ||
| 2472 | if (fast_string_match (regexp, text) >= 0) | 2476 | struct buffer *old_buffer = current_buffer; |
| 2473 | return true; | 2477 | struct buffer *buffer = XBUFFER (XTS_PARSER (XTS_NODE (node)->parser)->buffer); |
| 2474 | else | 2478 | set_buffer_internal (buffer); |
| 2475 | return false; | 2479 | |
| 2480 | TSNode treesit_node = XTS_NODE (node)->node; | ||
| 2481 | ptrdiff_t visible_beg = XTS_PARSER (XTS_NODE (node)->parser)->visible_beg; | ||
| 2482 | uint32_t start_byte_offset = ts_node_start_byte (treesit_node); | ||
| 2483 | uint32_t end_byte_offset = ts_node_end_byte (treesit_node); | ||
| 2484 | ptrdiff_t start_byte = visible_beg + start_byte_offset; | ||
| 2485 | ptrdiff_t end_byte = visible_beg + end_byte_offset; | ||
| 2486 | ptrdiff_t start_pos = BYTE_TO_CHAR (start_byte); | ||
| 2487 | ptrdiff_t end_pos = BYTE_TO_CHAR (end_byte); | ||
| 2488 | ptrdiff_t old_begv = BEGV; | ||
| 2489 | ptrdiff_t old_begv_byte = BEGV_BYTE; | ||
| 2490 | ptrdiff_t old_zv = ZV; | ||
| 2491 | ptrdiff_t old_zv_byte = ZV_BYTE; | ||
| 2492 | |||
| 2493 | BEGV = start_pos; | ||
| 2494 | BEGV_BYTE = start_byte; | ||
| 2495 | ZV = end_pos; | ||
| 2496 | ZV_BYTE = end_byte; | ||
| 2497 | |||
| 2498 | ptrdiff_t val = search_buffer (regexp, start_pos, start_byte, | ||
| 2499 | end_pos, end_byte, 1, 1, Qnil, Qnil, false); | ||
| 2500 | |||
| 2501 | BEGV = old_begv; | ||
| 2502 | BEGV_BYTE = old_begv_byte; | ||
| 2503 | ZV = old_zv; | ||
| 2504 | ZV_BYTE = old_zv_byte; | ||
| 2505 | |||
| 2506 | set_buffer_internal (old_buffer); | ||
| 2507 | |||
| 2508 | return (val > 0); | ||
| 2476 | } | 2509 | } |
| 2477 | 2510 | ||
| 2478 | /* Handles predicate (#pred FN ARG...). Return true if FN returns | 2511 | /* Handles predicate (#pred FN ARG...). Return true if FN returns |
diff --git a/src/xfaces.c b/src/xfaces.c index d6ffc92d20d..4207b73ee25 100644 --- a/src/xfaces.c +++ b/src/xfaces.c | |||
| @@ -2817,8 +2817,7 @@ merge_face_ref (struct window *w, | |||
| 2817 | else if (EQ (keyword, QCstipple)) | 2817 | else if (EQ (keyword, QCstipple)) |
| 2818 | { | 2818 | { |
| 2819 | #if defined (HAVE_WINDOW_SYSTEM) | 2819 | #if defined (HAVE_WINDOW_SYSTEM) |
| 2820 | Lisp_Object pixmap_p = Fbitmap_spec_p (value); | 2820 | if (NILP (value) || !NILP (Fbitmap_spec_p (value))) |
| 2821 | if (!NILP (pixmap_p)) | ||
| 2822 | to[LFACE_STIPPLE_INDEX] = value; | 2821 | to[LFACE_STIPPLE_INDEX] = value; |
| 2823 | else | 2822 | else |
| 2824 | err = true; | 2823 | err = true; |