diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2019-01-31 10:29:50 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2019-01-31 10:31:43 -0800 |
commit | 05d2fc7170fb66a87601b1c76ddae2c1b7b4b934 (patch) | |
tree | 217ddd3a45ea611069d85ac13e22e525bb965996 /src/insdel.c | |
parent | a68eee50eb515b28b448894299334afced26ef78 (diff) | |
download | emacs-05d2fc7170fb66a87601b1c76ddae2c1b7b4b934.tar.gz |
Widen modiff counts to avoid wraparound
Widen modification counts to at least 64 bits, to make
wraparound practically impossible.
* doc/lispref/buffers.texi (Buffer Modification):
Don’t say the modification-count can wrap around.
* src/buffer.c (Frestore_buffer_modified_p, Fbuffer_swap_text)
(modify_overlay):
* src/insdel.c (insert_1_both, insert_from_string_1)
(insert_from_gap, insert_from_buffer_1)
(adjust_after_replace, replace_range, replace_range_2)
(del_range_2, modify_text):
* src/textprop.c (modify_text_properties):
Use modiff_incr instead of incrementing directly.
(Fbuffer_modified_tick, Fbuffer_chars_modified_tick):
Don’t assume modification counts fit into fixnums.
* src/buffer.h (struct buffer_text, struct buffer):
* src/cmds.c (internal_self_insert):
* src/fileio.c (Finsert_file_contents):
* src/indent.c (last_known_column_modified):
* src/keyboard.c (command_loop_1):
* src/marker.c (cached_modiff):
* src/syntax.c (find_start_modiff, parse_sexp_propertize)
(find_defun_start):
* src/window.h (struct window):
Use modiff_count for modification counts.
* src/editfns.c (Fsubst_char_in_region):
Copy instead of incrementing modification counts,
since integer overflow checking is not needed here.
* src/lisp.h (modiff_count): New type.
(modiff_incr, modiff_to_integer): New inline functions.
* src/pdumper.c (dump_buffer): Update hash.
Diffstat (limited to 'src/insdel.c')
-rw-r--r-- | src/insdel.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/src/insdel.c b/src/insdel.c index a6f006a521d..fd725ac8785 100644 --- a/src/insdel.c +++ b/src/insdel.c @@ -903,7 +903,7 @@ insert_1_both (const char *string, the insertion. This, together with recording the insertion, will add up to the right stuff in the undo list. */ record_insert (PT, nchars); - MODIFF++; + modiff_incr (&MODIFF); CHARS_MODIFF = MODIFF; memcpy (GPT_ADDR, string, nbytes); @@ -1031,7 +1031,7 @@ insert_from_string_1 (Lisp_Object string, ptrdiff_t pos, ptrdiff_t pos_byte, #endif record_insert (PT, nchars); - MODIFF++; + modiff_incr (&MODIFF); CHARS_MODIFF = MODIFF; GAP_SIZE -= outgoing_nbytes; @@ -1088,7 +1088,7 @@ insert_from_gap (ptrdiff_t nchars, ptrdiff_t nbytes, bool text_at_gap_tail) of this dance. */ invalidate_buffer_caches (current_buffer, GPT, GPT); record_insert (GPT, nchars); - MODIFF++; + modiff_incr (&MODIFF); GAP_SIZE -= nbytes; if (! text_at_gap_tail) @@ -1228,7 +1228,7 @@ insert_from_buffer_1 (struct buffer *buf, #endif record_insert (PT, nchars); - MODIFF++; + modiff_incr (&MODIFF); CHARS_MODIFF = MODIFF; GAP_SIZE -= outgoing_nbytes; @@ -1329,7 +1329,7 @@ adjust_after_replace (ptrdiff_t from, ptrdiff_t from_byte, if (len == 0) evaporate_overlays (from); - MODIFF++; + modiff_incr (&MODIFF); CHARS_MODIFF = MODIFF; } @@ -1524,7 +1524,7 @@ replace_range (ptrdiff_t from, ptrdiff_t to, Lisp_Object new, check_markers (); - MODIFF++; + modiff_incr (&MODIFF); CHARS_MODIFF = MODIFF; if (adjust_match_data) @@ -1655,7 +1655,7 @@ replace_range_2 (ptrdiff_t from, ptrdiff_t from_byte, check_markers (); - MODIFF++; + modiff_incr (&MODIFF); CHARS_MODIFF = MODIFF; } @@ -1830,7 +1830,7 @@ del_range_2 (ptrdiff_t from, ptrdiff_t from_byte, at the end of the text before the gap. */ adjust_markers_for_delete (from, from_byte, to, to_byte); - MODIFF++; + modiff_incr (&MODIFF); CHARS_MODIFF = MODIFF; /* Relocate point as if it were a marker. */ @@ -1884,7 +1884,7 @@ modify_text (ptrdiff_t start, ptrdiff_t end) BUF_COMPUTE_UNCHANGED (current_buffer, start - 1, end); if (MODIFF <= SAVE_MODIFF) record_first_change (); - MODIFF++; + modiff_incr (&MODIFF); CHARS_MODIFF = MODIFF; bset_point_before_scroll (current_buffer, Qnil); |