aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChong Yidong2011-03-19 12:42:53 -0400
committerChong Yidong2011-03-19 12:42:53 -0400
commit20f5695598d3137257e24802479d003ea82eb5f9 (patch)
treedbd65b250aa1d524b0a0864bfda2e99465a0c9a4 /src
parent576bce32675146e772183647c4750c1f5f9b7de7 (diff)
downloademacs-20f5695598d3137257e24802479d003ea82eb5f9.tar.gz
emacs-20f5695598d3137257e24802479d003ea82eb5f9.zip
Backport fix for Bug#8219 from trunk.
* buffer.h (BUF_BEGV, BUF_BEGV_BYTE, BUF_ZV, BUF_ZV_BYTE, BUF_PT) (BUF_PT_BYTE): Rewrite to handle indirect buffers (Bug#8219). These macros can no longer be used for assignment. * buffer.c (Fget_buffer_create, Fmake_indirect_buffer): Assign struct members directly, instead of using BUF_BEGV etc. (record_buffer_markers, fetch_buffer_markers): New functions for recording and fetching special buffer markers. (set_buffer_internal_1, set_buffer_temp): Use them. * lread.c (unreadchar): Use SET_BUF_PT_BOTH. * insdel.c (adjust_point): Use SET_BUF_PT_BOTH. * intervals.c (temp_set_point_both): Use SET_BUF_PT_BOTH. (get_local_map): Use SET_BUF_BEGV_BOTH and SET_BUF_ZV_BOTH. * xdisp.c (hscroll_window_tree): (reconsider_clip_changes): Use PT instead of BUF_PT.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog22
-rw-r--r--src/buffer.c187
-rw-r--r--src/buffer.h42
-rw-r--r--src/insdel.c4
-rw-r--r--src/intervals.c16
-rw-r--r--src/lread.c6
-rw-r--r--src/xdisp.c4
7 files changed, 148 insertions, 133 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 49b37a843b6..be81dd27584 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,25 @@
12011-03-19 Chong Yidong <cyd@stupidchicken.com>
2
3 * buffer.h (BUF_BEGV, BUF_BEGV_BYTE, BUF_ZV, BUF_ZV_BYTE, BUF_PT)
4 (BUF_PT_BYTE): Rewrite to handle indirect buffers (Bug#8219).
5 These macros can no longer be used for assignment.
6
7 * buffer.c (Fget_buffer_create, Fmake_indirect_buffer): Assign
8 struct members directly, instead of using BUF_BEGV etc.
9 (record_buffer_markers, fetch_buffer_markers): New functions for
10 recording and fetching special buffer markers.
11 (set_buffer_internal_1, set_buffer_temp): Use them.
12
13 * lread.c (unreadchar): Use SET_BUF_PT_BOTH.
14
15 * insdel.c (adjust_point): Use SET_BUF_PT_BOTH.
16
17 * intervals.c (temp_set_point_both): Use SET_BUF_PT_BOTH.
18 (get_local_map): Use SET_BUF_BEGV_BOTH and SET_BUF_ZV_BOTH.
19
20 * xdisp.c (hscroll_window_tree):
21 (reconsider_clip_changes): Use PT instead of BUF_PT.
22
12011-03-17 Juanma Barranquero <lekktu@gmail.com> 232011-03-17 Juanma Barranquero <lekktu@gmail.com>
2 24
3 * xfaces.c (Fx_load_color_file): 25 * xfaces.c (Fx_load_color_file):
diff --git a/src/buffer.c b/src/buffer.c
index 9220527313d..e7759cb5255 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -371,15 +371,17 @@ even if it is dead. The return value is never nil. */)
371 if (! BUF_BEG_ADDR (b)) 371 if (! BUF_BEG_ADDR (b))
372 buffer_memory_full (); 372 buffer_memory_full ();
373 373
374 BUF_PT (b) = BEG; 374 b->pt = BEG;
375 b->begv = BEG;
376 b->zv = BEG;
377 b->pt_byte = BEG_BYTE;
378 b->begv_byte = BEG_BYTE;
379 b->zv_byte = BEG_BYTE;
380
375 BUF_GPT (b) = BEG; 381 BUF_GPT (b) = BEG;
376 BUF_BEGV (b) = BEG;
377 BUF_ZV (b) = BEG;
378 BUF_Z (b) = BEG;
379 BUF_PT_BYTE (b) = BEG_BYTE;
380 BUF_GPT_BYTE (b) = BEG_BYTE; 382 BUF_GPT_BYTE (b) = BEG_BYTE;
381 BUF_BEGV_BYTE (b) = BEG_BYTE; 383
382 BUF_ZV_BYTE (b) = BEG_BYTE; 384 BUF_Z (b) = BEG;
383 BUF_Z_BYTE (b) = BEG_BYTE; 385 BUF_Z_BYTE (b) = BEG_BYTE;
384 BUF_MODIFF (b) = 1; 386 BUF_MODIFF (b) = 1;
385 BUF_CHARS_MODIFF (b) = 1; 387 BUF_CHARS_MODIFF (b) = 1;
@@ -533,6 +535,53 @@ clone_per_buffer_values (from, to)
533 to->local_var_alist = buffer_lisp_local_variables (from); 535 to->local_var_alist = buffer_lisp_local_variables (from);
534} 536}
535 537
538
539/* If buffer B has markers to record PT, BEGV and ZV when it is not
540 current, update these markers. */
541
542static void
543record_buffer_markers (struct buffer *b)
544{
545 if (! NILP (b->pt_marker))
546 {
547 Lisp_Object buffer;
548
549 eassert (!NILP (b->begv_marker));
550 eassert (!NILP (b->zv_marker));
551
552 XSETBUFFER (buffer, b);
553 set_marker_both (b->pt_marker, buffer, b->pt, b->pt_byte);
554 set_marker_both (b->begv_marker, buffer, b->begv, b->begv_byte);
555 set_marker_both (b->zv_marker, buffer, b->zv, b->zv_byte);
556 }
557}
558
559
560/* If buffer B has markers to record PT, BEGV and ZV when it is not
561 current, fetch these values into B->begv etc. */
562
563static void
564fetch_buffer_markers (struct buffer *b)
565{
566 if (! NILP (b->pt_marker))
567 {
568 Lisp_Object m;
569
570 eassert (!NILP (b->begv_marker));
571 eassert (!NILP (b->zv_marker));
572
573 m = b->pt_marker;
574 SET_BUF_PT_BOTH (b, marker_position (m), marker_byte_position (m));
575
576 m = b->begv_marker;
577 SET_BUF_BEGV_BOTH (b, marker_position (m), marker_byte_position (m));
578
579 m = b->zv_marker;
580 SET_BUF_ZV_BOTH (b, marker_position (m), marker_byte_position (m));
581 }
582}
583
584
536DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, Smake_indirect_buffer, 585DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, Smake_indirect_buffer,
537 2, 3, 586 2, 3,
538 "bMake indirect buffer (to buffer): \nBName of indirect buffer: ", 587 "bMake indirect buffer (to buffer): \nBName of indirect buffer: ",
@@ -572,12 +621,12 @@ CLONE nil means the indirect buffer's state is reset to default values. */)
572 /* Use the base buffer's text object. */ 621 /* Use the base buffer's text object. */
573 b->text = b->base_buffer->text; 622 b->text = b->base_buffer->text;
574 623
575 BUF_BEGV (b) = BUF_BEGV (b->base_buffer); 624 b->pt = b->base_buffer->pt;
576 BUF_ZV (b) = BUF_ZV (b->base_buffer); 625 b->begv = b->base_buffer->begv;
577 BUF_PT (b) = BUF_PT (b->base_buffer); 626 b->zv = b->base_buffer->zv;
578 BUF_BEGV_BYTE (b) = BUF_BEGV_BYTE (b->base_buffer); 627 b->pt_byte = b->base_buffer->pt_byte;
579 BUF_ZV_BYTE (b) = BUF_ZV_BYTE (b->base_buffer); 628 b->begv_byte = b->base_buffer->begv_byte;
580 BUF_PT_BYTE (b) = BUF_PT_BYTE (b->base_buffer); 629 b->zv_byte = b->base_buffer->zv_byte;
581 630
582 b->newline_cache = 0; 631 b->newline_cache = 0;
583 b->width_run_cache = 0; 632 b->width_run_cache = 0;
@@ -607,24 +656,23 @@ CLONE nil means the indirect buffer's state is reset to default values. */)
607 /* Make sure the base buffer has markers for its narrowing. */ 656 /* Make sure the base buffer has markers for its narrowing. */
608 if (NILP (b->base_buffer->pt_marker)) 657 if (NILP (b->base_buffer->pt_marker))
609 { 658 {
659 eassert (NILP (b->base_buffer->begv_marker));
660 eassert (NILP (b->base_buffer->zv_marker));
661
610 b->base_buffer->pt_marker = Fmake_marker (); 662 b->base_buffer->pt_marker = Fmake_marker ();
611 set_marker_both (b->base_buffer->pt_marker, base_buffer, 663 set_marker_both (b->base_buffer->pt_marker, base_buffer,
612 BUF_PT (b->base_buffer), 664 b->base_buffer->pt,
613 BUF_PT_BYTE (b->base_buffer)); 665 b->base_buffer->pt_byte);
614 } 666
615 if (NILP (b->base_buffer->begv_marker))
616 {
617 b->base_buffer->begv_marker = Fmake_marker (); 667 b->base_buffer->begv_marker = Fmake_marker ();
618 set_marker_both (b->base_buffer->begv_marker, base_buffer, 668 set_marker_both (b->base_buffer->begv_marker, base_buffer,
619 BUF_BEGV (b->base_buffer), 669 b->base_buffer->begv,
620 BUF_BEGV_BYTE (b->base_buffer)); 670 b->base_buffer->begv_byte);
621 } 671
622 if (NILP (b->base_buffer->zv_marker))
623 {
624 b->base_buffer->zv_marker = Fmake_marker (); 672 b->base_buffer->zv_marker = Fmake_marker ();
625 set_marker_both (b->base_buffer->zv_marker, base_buffer, 673 set_marker_both (b->base_buffer->zv_marker, base_buffer,
626 BUF_ZV (b->base_buffer), 674 b->base_buffer->zv,
627 BUF_ZV_BYTE (b->base_buffer)); 675 b->base_buffer->zv_byte);
628 XMARKER (b->base_buffer->zv_marker)->insertion_type = 1; 676 XMARKER (b->base_buffer->zv_marker)->insertion_type = 1;
629 } 677 }
630 678
@@ -632,11 +680,11 @@ CLONE nil means the indirect buffer's state is reset to default values. */)
632 { 680 {
633 /* Give the indirect buffer markers for its narrowing. */ 681 /* Give the indirect buffer markers for its narrowing. */
634 b->pt_marker = Fmake_marker (); 682 b->pt_marker = Fmake_marker ();
635 set_marker_both (b->pt_marker, buf, BUF_PT (b), BUF_PT_BYTE (b)); 683 set_marker_both (b->pt_marker, buf, b->pt, b->pt_byte);
636 b->begv_marker = Fmake_marker (); 684 b->begv_marker = Fmake_marker ();
637 set_marker_both (b->begv_marker, buf, BUF_BEGV (b), BUF_BEGV_BYTE (b)); 685 set_marker_both (b->begv_marker, buf, b->begv, b->begv_byte);
638 b->zv_marker = Fmake_marker (); 686 b->zv_marker = Fmake_marker ();
639 set_marker_both (b->zv_marker, buf, BUF_ZV (b), BUF_ZV_BYTE (b)); 687 set_marker_both (b->zv_marker, buf, b->zv, b->zv_byte);
640 XMARKER (b->zv_marker)->insertion_type = 1; 688 XMARKER (b->zv_marker)->insertion_type = 1;
641 } 689 }
642 else 690 else
@@ -1890,27 +1938,7 @@ set_buffer_internal_1 (b)
1890 1938
1891 /* If the old current buffer has markers to record PT, BEGV and ZV 1939 /* If the old current buffer has markers to record PT, BEGV and ZV
1892 when it is not current, update them now. */ 1940 when it is not current, update them now. */
1893 if (! NILP (old_buf->pt_marker)) 1941 record_buffer_markers (old_buf);
1894 {
1895 Lisp_Object obuf;
1896 XSETBUFFER (obuf, old_buf);
1897 set_marker_both (old_buf->pt_marker, obuf,
1898 BUF_PT (old_buf), BUF_PT_BYTE (old_buf));
1899 }
1900 if (! NILP (old_buf->begv_marker))
1901 {
1902 Lisp_Object obuf;
1903 XSETBUFFER (obuf, old_buf);
1904 set_marker_both (old_buf->begv_marker, obuf,
1905 BUF_BEGV (old_buf), BUF_BEGV_BYTE (old_buf));
1906 }
1907 if (! NILP (old_buf->zv_marker))
1908 {
1909 Lisp_Object obuf;
1910 XSETBUFFER (obuf, old_buf);
1911 set_marker_both (old_buf->zv_marker, obuf,
1912 BUF_ZV (old_buf), BUF_ZV_BYTE (old_buf));
1913 }
1914 } 1942 }
1915 1943
1916 /* Get the undo list from the base buffer, so that it appears 1944 /* Get the undo list from the base buffer, so that it appears
@@ -1920,21 +1948,7 @@ set_buffer_internal_1 (b)
1920 1948
1921 /* If the new current buffer has markers to record PT, BEGV and ZV 1949 /* If the new current buffer has markers to record PT, BEGV and ZV
1922 when it is not current, fetch them now. */ 1950 when it is not current, fetch them now. */
1923 if (! NILP (b->pt_marker)) 1951 fetch_buffer_markers (b);
1924 {
1925 BUF_PT (b) = marker_position (b->pt_marker);
1926 BUF_PT_BYTE (b) = marker_byte_position (b->pt_marker);
1927 }
1928 if (! NILP (b->begv_marker))
1929 {
1930 BUF_BEGV (b) = marker_position (b->begv_marker);
1931 BUF_BEGV_BYTE (b) = marker_byte_position (b->begv_marker);
1932 }
1933 if (! NILP (b->zv_marker))
1934 {
1935 BUF_ZV (b) = marker_position (b->zv_marker);
1936 BUF_ZV_BYTE (b) = marker_byte_position (b->zv_marker);
1937 }
1938 1952
1939 /* Look down buffer's list of local Lisp variables 1953 /* Look down buffer's list of local Lisp variables
1940 to find and update any that forward into C variables. */ 1954 to find and update any that forward into C variables. */
@@ -1984,50 +1998,13 @@ set_buffer_temp (b)
1984 old_buf = current_buffer; 1998 old_buf = current_buffer;
1985 current_buffer = b; 1999 current_buffer = b;
1986 2000
1987 if (old_buf) 2001 /* If the old current buffer has markers to record PT, BEGV and ZV
1988 { 2002 when it is not current, update them now. */
1989 /* If the old current buffer has markers to record PT, BEGV and ZV 2003 record_buffer_markers (old_buf);
1990 when it is not current, update them now. */
1991 if (! NILP (old_buf->pt_marker))
1992 {
1993 Lisp_Object obuf;
1994 XSETBUFFER (obuf, old_buf);
1995 set_marker_both (old_buf->pt_marker, obuf,
1996 BUF_PT (old_buf), BUF_PT_BYTE (old_buf));
1997 }
1998 if (! NILP (old_buf->begv_marker))
1999 {
2000 Lisp_Object obuf;
2001 XSETBUFFER (obuf, old_buf);
2002 set_marker_both (old_buf->begv_marker, obuf,
2003 BUF_BEGV (old_buf), BUF_BEGV_BYTE (old_buf));
2004 }
2005 if (! NILP (old_buf->zv_marker))
2006 {
2007 Lisp_Object obuf;
2008 XSETBUFFER (obuf, old_buf);
2009 set_marker_both (old_buf->zv_marker, obuf,
2010 BUF_ZV (old_buf), BUF_ZV_BYTE (old_buf));
2011 }
2012 }
2013 2004
2014 /* If the new current buffer has markers to record PT, BEGV and ZV 2005 /* If the new current buffer has markers to record PT, BEGV and ZV
2015 when it is not current, fetch them now. */ 2006 when it is not current, fetch them now. */
2016 if (! NILP (b->pt_marker)) 2007 fetch_buffer_markers (b);
2017 {
2018 BUF_PT (b) = marker_position (b->pt_marker);
2019 BUF_PT_BYTE (b) = marker_byte_position (b->pt_marker);
2020 }
2021 if (! NILP (b->begv_marker))
2022 {
2023 BUF_BEGV (b) = marker_position (b->begv_marker);
2024 BUF_BEGV_BYTE (b) = marker_byte_position (b->begv_marker);
2025 }
2026 if (! NILP (b->zv_marker))
2027 {
2028 BUF_ZV (b) = marker_position (b->zv_marker);
2029 BUF_ZV_BYTE (b) = marker_byte_position (b->zv_marker);
2030 }
2031} 2008}
2032 2009
2033DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0, 2010DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0,
diff --git a/src/buffer.h b/src/buffer.h
index 21854571670..56d0422b7e3 100644
--- a/src/buffer.h
+++ b/src/buffer.h
@@ -107,22 +107,46 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
107#define BUF_BEG(buf) (BEG) 107#define BUF_BEG(buf) (BEG)
108#define BUF_BEG_BYTE(buf) (BEG_BYTE) 108#define BUF_BEG_BYTE(buf) (BEG_BYTE)
109 109
110/* The BUF_BEGV[_BYTE], BUF_ZV[_BYTE], and BUF_PT[_BYTE] macros cannot
111 be used for assignment; use SET_BUF_* macros below for that. */
112
110/* Position of beginning of accessible range of buffer. */ 113/* Position of beginning of accessible range of buffer. */
111#define BUF_BEGV(buf) ((buf)->begv) 114#define BUF_BEGV(buf) \
112#define BUF_BEGV_BYTE(buf) ((buf)->begv_byte) 115 (buf == current_buffer ? BEGV \
116 : NILP (buf->begv_marker) ? buf->begv \
117 : marker_position (buf->begv_marker))
118
119#define BUF_BEGV_BYTE(buf) \
120 (buf == current_buffer ? BEGV_BYTE \
121 : NILP (buf->begv_marker) ? buf->begv_byte \
122 : marker_byte_position (buf->begv_marker))
113 123
114/* Position of point in buffer. */ 124/* Position of point in buffer. */
115#define BUF_PT(buf) ((buf)->pt) 125#define BUF_PT(buf) \
116#define BUF_PT_BYTE(buf) ((buf)->pt_byte) 126 (buf == current_buffer ? PT \
127 : NILP (buf->pt_marker) ? buf->pt \
128 : marker_position (buf->pt_marker))
129
130#define BUF_PT_BYTE(buf) \
131 (buf == current_buffer ? PT_BYTE \
132 : NILP (buf->pt_marker) ? buf->pt_byte \
133 : marker_byte_position (buf->pt_marker))
134
135/* Position of end of accessible range of buffer. */
136#define BUF_ZV(buf) \
137 (buf == current_buffer ? ZV \
138 : NILP (buf->zv_marker) ? buf->zv \
139 : marker_position (buf->zv_marker))
140
141#define BUF_ZV_BYTE(buf) \
142 (buf == current_buffer ? ZV_BYTE \
143 : NILP (buf->zv_marker) ? buf->zv_byte \
144 : marker_byte_position (buf->zv_marker))
117 145
118/* Position of gap in buffer. */ 146/* Position of gap in buffer. */
119#define BUF_GPT(buf) ((buf)->text->gpt) 147#define BUF_GPT(buf) ((buf)->text->gpt)
120#define BUF_GPT_BYTE(buf) ((buf)->text->gpt_byte) 148#define BUF_GPT_BYTE(buf) ((buf)->text->gpt_byte)
121 149
122/* Position of end of accessible range of buffer. */
123#define BUF_ZV(buf) ((buf)->zv)
124#define BUF_ZV_BYTE(buf) ((buf)->zv_byte)
125
126/* Position of end of buffer. */ 150/* Position of end of buffer. */
127#define BUF_Z(buf) ((buf)->text->z) 151#define BUF_Z(buf) ((buf)->text->z)
128#define BUF_Z_BYTE(buf) ((buf)->text->z_byte) 152#define BUF_Z_BYTE(buf) ((buf)->text->z_byte)
@@ -230,8 +254,6 @@ extern void enlarge_buffer_text P_ ((struct buffer *, EMACS_INT));
230 254
231/* Macros for setting the BEGV, ZV or PT of a given buffer. 255/* Macros for setting the BEGV, ZV or PT of a given buffer.
232 256
233 SET_BUF_PT* seet to be redundant. Get rid of them?
234
235 The ..._BOTH macros take both a charpos and a bytepos, 257 The ..._BOTH macros take both a charpos and a bytepos,
236 which must correspond to each other. 258 which must correspond to each other.
237 259
diff --git a/src/insdel.c b/src/insdel.c
index 7e0ba797fa8..b76a2d2271a 100644
--- a/src/insdel.c
+++ b/src/insdel.c
@@ -459,9 +459,7 @@ adjust_markers_for_insert (EMACS_INT from, EMACS_INT from_byte,
459static void 459static void
460adjust_point (EMACS_INT nchars, EMACS_INT nbytes) 460adjust_point (EMACS_INT nchars, EMACS_INT nbytes)
461{ 461{
462 BUF_PT (current_buffer) += nchars; 462 SET_BUF_PT_BOTH (current_buffer, PT + nchars, PT_BYTE + nbytes);
463 BUF_PT_BYTE (current_buffer) += nbytes;
464
465 /* In a single-byte buffer, the two positions must be equal. */ 463 /* In a single-byte buffer, the two positions must be equal. */
466 eassert (PT_BYTE >= PT && PT_BYTE - PT <= ZV_BYTE - ZV); 464 eassert (PT_BYTE >= PT && PT_BYTE - PT <= ZV_BYTE - ZV);
467} 465}
diff --git a/src/intervals.c b/src/intervals.c
index d47888b237c..fd8f3f55479 100644
--- a/src/intervals.c
+++ b/src/intervals.c
@@ -1949,8 +1949,7 @@ temp_set_point_both (struct buffer *buffer,
1949 if (charpos > BUF_ZV (buffer) || charpos < BUF_BEGV (buffer)) 1949 if (charpos > BUF_ZV (buffer) || charpos < BUF_BEGV (buffer))
1950 abort (); 1950 abort ();
1951 1951
1952 BUF_PT_BYTE (buffer) = bytepos; 1952 SET_BUF_PT_BOTH (buffer, charpos, bytepos);
1953 BUF_PT (buffer) = charpos;
1954} 1953}
1955 1954
1956/* Set point in BUFFER to CHARPOS. If the target position is 1955/* Set point in BUFFER to CHARPOS. If the target position is
@@ -2366,10 +2365,9 @@ get_local_map (position, buffer, type)
2366 old_zv = BUF_ZV (buffer); 2365 old_zv = BUF_ZV (buffer);
2367 old_begv_byte = BUF_BEGV_BYTE (buffer); 2366 old_begv_byte = BUF_BEGV_BYTE (buffer);
2368 old_zv_byte = BUF_ZV_BYTE (buffer); 2367 old_zv_byte = BUF_ZV_BYTE (buffer);
2369 BUF_BEGV (buffer) = BUF_BEG (buffer); 2368
2370 BUF_ZV (buffer) = BUF_Z (buffer); 2369 SET_BUF_BEGV_BOTH (buffer, BUF_BEG (buffer), BUF_BEG_BYTE (buffer));
2371 BUF_BEGV_BYTE (buffer) = BUF_BEG_BYTE (buffer); 2370 SET_BUF_ZV_BOTH (buffer, BUF_Z (buffer), BUF_Z_BYTE (buffer));
2372 BUF_ZV_BYTE (buffer) = BUF_Z_BYTE (buffer);
2373 2371
2374 XSETFASTINT (lispy_position, position); 2372 XSETFASTINT (lispy_position, position);
2375 XSETBUFFER (lispy_buffer, buffer); 2373 XSETBUFFER (lispy_buffer, buffer);
@@ -2383,10 +2381,8 @@ get_local_map (position, buffer, type)
2383 if (NILP (prop)) 2381 if (NILP (prop))
2384 prop = get_pos_property (lispy_position, type, lispy_buffer); 2382 prop = get_pos_property (lispy_position, type, lispy_buffer);
2385 2383
2386 BUF_BEGV (buffer) = old_begv; 2384 SET_BUF_BEGV_BOTH (buffer, old_begv, old_begv_byte);
2387 BUF_ZV (buffer) = old_zv; 2385 SET_BUF_ZV_BOTH (buffer, old_zv, old_zv_byte);
2388 BUF_BEGV_BYTE (buffer) = old_begv_byte;
2389 BUF_ZV_BYTE (buffer) = old_zv_byte;
2390 2386
2391 /* Use the local map only if it is valid. */ 2387 /* Use the local map only if it is valid. */
2392 prop = get_keymap (prop, 0, 0); 2388 prop = get_keymap (prop, 0, 0);
diff --git a/src/lread.c b/src/lread.c
index 8f1d4af8f36..2da64632417 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -458,15 +458,15 @@ unreadchar (readcharfun, c)
458 else if (BUFFERP (readcharfun)) 458 else if (BUFFERP (readcharfun))
459 { 459 {
460 struct buffer *b = XBUFFER (readcharfun); 460 struct buffer *b = XBUFFER (readcharfun);
461 int bytepos = BUF_PT_BYTE (b); 461 EMACS_INT charpos = BUF_PT (b);
462 EMACS_INT bytepos = BUF_PT_BYTE (b);
462 463
463 BUF_PT (b)--;
464 if (! NILP (b->enable_multibyte_characters)) 464 if (! NILP (b->enable_multibyte_characters))
465 BUF_DEC_POS (b, bytepos); 465 BUF_DEC_POS (b, bytepos);
466 else 466 else
467 bytepos--; 467 bytepos--;
468 468
469 BUF_PT_BYTE (b) = bytepos; 469 SET_BUF_PT_BOTH (b, charpos - 1, bytepos);
470 } 470 }
471 else if (MARKERP (readcharfun)) 471 else if (MARKERP (readcharfun))
472 { 472 {
diff --git a/src/xdisp.c b/src/xdisp.c
index c2af4d68b6e..ade95cf3d62 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -10760,7 +10760,7 @@ hscroll_window_tree (window)
10760 current_buffer = XBUFFER (w->buffer); 10760 current_buffer = XBUFFER (w->buffer);
10761 10761
10762 if (w == XWINDOW (selected_window)) 10762 if (w == XWINDOW (selected_window))
10763 pt = BUF_PT (current_buffer); 10763 pt = PT;
10764 else 10764 else
10765 { 10765 {
10766 pt = marker_position (w->pointm); 10766 pt = marker_position (w->pointm);
@@ -11194,7 +11194,7 @@ reconsider_clip_changes (w, b)
11194 int pt; 11194 int pt;
11195 11195
11196 if (w == XWINDOW (selected_window)) 11196 if (w == XWINDOW (selected_window))
11197 pt = BUF_PT (current_buffer); 11197 pt = PT;
11198 else 11198 else
11199 pt = marker_position (w->pointm); 11199 pt = marker_position (w->pointm);
11200 11200