aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/insdel.c19
-rw-r--r--src/lisp.h3
-rw-r--r--src/search.c5
-rw-r--r--src/sqlite.c10
-rw-r--r--src/treesit.c43
-rw-r--r--src/xfaces.c3
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
1194static void 1201static void
1195insert_from_buffer_1 (struct buffer *buf, 1202insert_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 *);
4808extern ptrdiff_t find_before_next_newline (ptrdiff_t, ptrdiff_t, 4808extern ptrdiff_t find_before_next_newline (ptrdiff_t, ptrdiff_t,
4809 ptrdiff_t, ptrdiff_t *); 4809 ptrdiff_t, ptrdiff_t *);
4810extern EMACS_INT search_buffer (Lisp_Object, ptrdiff_t, ptrdiff_t,
4811 ptrdiff_t, ptrdiff_t, EMACS_INT,
4812 int, Lisp_Object, Lisp_Object, bool);
4810extern void syms_of_search (void); 4813extern void syms_of_search (void);
4811extern void clear_regexp_cache (void); 4814extern 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,
68static EMACS_INT boyer_moore (EMACS_INT, unsigned char *, ptrdiff_t, 68static 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);
71static 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
75Lisp_Object re_match_object; 72Lisp_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
1513static EMACS_INT 1510EMACS_INT
1514search_buffer (Lisp_Object string, ptrdiff_t pos, ptrdiff_t pos_byte, 1511search_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
440static Lisp_Object 440static 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
720DEFUN ("sqlite-next", Fsqlite_next, Ssqlite_next, 1, 1, 0, 720DEFUN ("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.
722Return 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,
135DEF_DLL_FN (void, ts_query_delete, (TSQuery *)); 136DEF_DLL_FN (void, ts_query_delete, (TSQuery *));
136DEF_DLL_FN (TSQuery *, ts_query_new, 137DEF_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 *));
139DEF_DLL_FN (uint32_t, ts_query_pattern_count, (const TSQuery *));
138DEF_DLL_FN (const TSQueryPredicateStep *, ts_query_predicates_for_pattern, 140DEF_DLL_FN (const TSQueryPredicateStep *, ts_query_predicates_for_pattern,
139 ( const TSQuery *, uint32_t, uint32_t *)); 141 ( const TSQuery *, uint32_t, uint32_t *));
140DEF_DLL_FN (const char *, ts_query_string_value_for_id, 142DEF_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;