diff --git a/src/buffer.c b/src/buffer.c index a69a9a3bbd8..09423e8592a 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -2078,6 +2078,7 @@ cleaning up all windows currently displaying the buffer to be killed. */) if (m->buffer == b) igc_remove_marker (b, m); } + END_DO_MARKERS; #else struct Lisp_Marker **mp = &BUF_MARKERS (b); struct Lisp_Marker *m; @@ -2649,6 +2650,7 @@ results, see Info node `(elisp)Swapping Text'. */) BUF_MARKERS(buf) should either be for `buf' or dead. */ eassert (!m->buffer); } + END_DO_MARKERS; DO_MARKERS (other_buffer, m) { if (m->buffer == current_buffer) @@ -2658,6 +2660,7 @@ results, see Info node `(elisp)Swapping Text'. */) BUF_MARKERS(buf) should either be for `buf' or dead. */ eassert (!m->buffer); } + END_DO_MARKERS; } { /* Some of the C code expects that both window markers of a live window points to that window's buffer. So since we @@ -2775,6 +2778,7 @@ current buffer is cleared. */) { tail->charpos = tail->bytepos; } + END_DO_MARKERS; /* Convert multibyte form of 8-bit characters to unibyte. */ pos = BEG; @@ -2933,6 +2937,7 @@ current buffer is cleared. */) tail->charpos = BYTE_TO_CHAR (tail->bytepos); BUF_MARKERS (current_buffer) = buf_markers; } + END_DO_MARKERS; #else tail = markers = BUF_MARKERS (current_buffer); diff --git a/src/buffer.h b/src/buffer.h index 9e616693222..05af3de7dfc 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -792,10 +792,13 @@ marker_it_marker (struct marker_it *it) # endif -# define DO_MARKERS(b, m) \ +# define DO_MARKERS(b, m) \ for (struct marker_it it_ = marker_it_init (b); marker_it_valid (&it_); \ - marker_it_next (&it_)) \ - for (struct Lisp_Marker *m = marker_it_marker (&it_); m; m = NULL) + marker_it_next (&it_)) \ + { \ + struct Lisp_Marker *m = marker_it_marker (&it_); + +# define END_DO_MARKERS } struct sortvec { diff --git a/src/coding.c b/src/coding.c index c6c01af4ee7..71aee2f7008 100644 --- a/src/coding.c +++ b/src/coding.c @@ -8120,6 +8120,7 @@ decode_coding_object (struct coding_system *coding, = tail->charpos == (tail->insertion_type ? from : to); need_marker_adjustment |= tail->need_adjustment; } + END_DO_MARKERS; saved_pt = PT, saved_pt_byte = PT_BYTE; TEMP_SET_PT_BOTH (from, from_byte); current_buffer->text->inhibit_shrinking = true; @@ -8245,22 +8246,25 @@ decode_coding_object (struct coding_system *coding, if (need_marker_adjustment) { DO_MARKERS (current_buffer, tail) - if (tail->need_adjustment) - { - tail->need_adjustment = 0; - if (tail->insertion_type) - { - tail->bytepos = from_byte; - tail->charpos = from; - } - else - { - tail->bytepos = from_byte + coding->produced; - tail->charpos - = (NILP (BVAR (current_buffer, enable_multibyte_characters)) - ? tail->bytepos : from + coding->produced_char); - } - } + { + if (tail->need_adjustment) + { + tail->need_adjustment = 0; + if (tail->insertion_type) + { + tail->bytepos = from_byte; + tail->charpos = from; + } + else + { + tail->bytepos = from_byte + coding->produced; + tail->charpos + = (NILP (BVAR (current_buffer, enable_multibyte_characters)) + ? tail->bytepos : from + coding->produced_char); + } + } + } + END_DO_MARKERS; } } @@ -8337,6 +8341,7 @@ encode_coding_object (struct coding_system *coding, = tail->charpos == (tail->insertion_type ? from : to); need_marker_adjustment |= tail->need_adjustment; } + END_DO_MARKERS; } if (! NILP (CODING_ATTR_PRE_WRITE (attrs))) @@ -8495,22 +8500,25 @@ encode_coding_object (struct coding_system *coding, if (need_marker_adjustment) { DO_MARKERS (current_buffer, tail) - if (tail->need_adjustment) - { - tail->need_adjustment = 0; - if (tail->insertion_type) - { - tail->bytepos = from_byte; - tail->charpos = from; - } - else - { - tail->bytepos = from_byte + coding->produced; - tail->charpos - = (NILP (BVAR (current_buffer, enable_multibyte_characters)) - ? tail->bytepos : from + coding->produced_char); - } - } + { + if (tail->need_adjustment) + { + tail->need_adjustment = 0; + if (tail->insertion_type) + { + tail->bytepos = from_byte; + tail->charpos = from; + } + else + { + tail->bytepos = from_byte + coding->produced; + tail->charpos + = (NILP (BVAR (current_buffer, enable_multibyte_characters)) + ? tail->bytepos : from + coding->produced_char); + } + } + } + END_DO_MARKERS; } } diff --git a/src/editfns.c b/src/editfns.c index 6f4078d3d8a..74c7d54086b 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -4445,6 +4445,7 @@ transpose_markers (ptrdiff_t start1, ptrdiff_t end1, } marker->charpos = mpos; } + END_DO_MARKERS; } DEFUN ("transpose-regions", Ftranspose_regions, Stranspose_regions, 4, 5, diff --git a/src/insdel.c b/src/insdel.c index a3fb943e3d5..db3d946327e 100644 --- a/src/insdel.c +++ b/src/insdel.c @@ -271,6 +271,7 @@ adjust_markers_for_delete (ptrdiff_t from, ptrdiff_t from_byte, m->bytepos = from_byte; } } + END_DO_MARKERS; adjust_overlays_for_delete (from, to - from); } @@ -310,6 +311,7 @@ adjust_markers_for_insert (ptrdiff_t from, ptrdiff_t from_byte, m->charpos += nchars; } } + END_DO_MARKERS; adjust_overlays_for_insert (from, to - from, before_markers); } @@ -364,6 +366,7 @@ adjust_markers_for_replace (ptrdiff_t from, ptrdiff_t from_byte, m->bytepos = from_byte; } } + END_DO_MARKERS; check_markers (); @@ -417,6 +420,7 @@ adjust_markers_bytepos (ptrdiff_t from, ptrdiff_t from_byte, && (to_z || m->bytepos <= to_byte)) m->bytepos = m->charpos; } + END_DO_MARKERS; } else { @@ -437,6 +441,7 @@ adjust_markers_bytepos (ptrdiff_t from, ptrdiff_t from_byte, begbyte = m->bytepos; } } + END_DO_MARKERS; } /* Make sure cached charpos/bytepos is invalid. */ diff --git a/src/marker.c b/src/marker.c index 6fe200485c5..3290917b268 100644 --- a/src/marker.c +++ b/src/marker.c @@ -211,11 +211,11 @@ buf_charpos_to_bytepos (struct buffer *b, ptrdiff_t charpos) scan the intervening chars directly now. */ if (best_above - charpos < distance || charpos - best_below < distance) - goto out; + break; distance += BYTECHAR_DISTANCE_INCREMENT; } - out:; + END_DO_MARKERS; /* We get here if we did not exactly hit one of the known places. We have one known above and one known below. @@ -367,6 +367,7 @@ buf_bytepos_to_charpos (struct buffer *b, ptrdiff_t bytepos) else distance += BYTECHAR_DISTANCE_INCREMENT; } + END_DO_MARKERS; /* We get here if we did not exactly hit one of the known places. We have one known above and one known below. diff --git a/src/undo.c b/src/undo.c index 41b6c7c19f0..d5395bd8c38 100644 --- a/src/undo.c +++ b/src/undo.c @@ -154,6 +154,7 @@ record_marker_adjustments (ptrdiff_t from, ptrdiff_t to) } } } + END_DO_MARKERS; } /* Record that a deletion is about to take place, of the characters in