aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog22
-rw-r--r--src/buffer.c187
-rw-r--r--src/buffer.h45
-rw-r--r--src/insdel.c4
-rw-r--r--src/intervals.c16
-rw-r--r--src/lread.c4
-rw-r--r--src/xdisp.c4
7 files changed, 146 insertions, 136 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 3d5f3e0c387..bad9b8dd4b7 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,25 @@
12011-03-13 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-13 Eli Zaretskii <eliz@gnu.org> 232011-03-13 Eli Zaretskii <eliz@gnu.org>
2 24
3 * makefile.w32-in ($(BLD)/editfns.$(O)): Depend on 25 * makefile.w32-in ($(BLD)/editfns.$(O)): Depend on
diff --git a/src/buffer.c b/src/buffer.c
index 448c9236387..01940728275 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -330,15 +330,17 @@ even if it is dead. The return value is never nil. */)
330 if (! BUF_BEG_ADDR (b)) 330 if (! BUF_BEG_ADDR (b))
331 buffer_memory_full (); 331 buffer_memory_full ();
332 332
333 BUF_PT (b) = BEG; 333 b->pt = BEG;
334 b->begv = BEG;
335 b->zv = BEG;
336 b->pt_byte = BEG_BYTE;
337 b->begv_byte = BEG_BYTE;
338 b->zv_byte = BEG_BYTE;
339
334 BUF_GPT (b) = BEG; 340 BUF_GPT (b) = BEG;
335 BUF_BEGV (b) = BEG;
336 BUF_ZV (b) = BEG;
337 BUF_Z (b) = BEG;
338 BUF_PT_BYTE (b) = BEG_BYTE;
339 BUF_GPT_BYTE (b) = BEG_BYTE; 341 BUF_GPT_BYTE (b) = BEG_BYTE;
340 BUF_BEGV_BYTE (b) = BEG_BYTE; 342
341 BUF_ZV_BYTE (b) = BEG_BYTE; 343 BUF_Z (b) = BEG;
342 BUF_Z_BYTE (b) = BEG_BYTE; 344 BUF_Z_BYTE (b) = BEG_BYTE;
343 BUF_MODIFF (b) = 1; 345 BUF_MODIFF (b) = 1;
344 BUF_CHARS_MODIFF (b) = 1; 346 BUF_CHARS_MODIFF (b) = 1;
@@ -489,6 +491,53 @@ clone_per_buffer_values (struct buffer *from, struct buffer *to)
489 BVAR (to, local_var_alist) = buffer_lisp_local_variables (from); 491 BVAR (to, local_var_alist) = buffer_lisp_local_variables (from);
490} 492}
491 493
494
495/* If buffer B has markers to record PT, BEGV and ZV when it is not
496 current, update these markers. */
497
498static void
499record_buffer_markers (struct buffer *b)
500{
501 if (! NILP (BVAR (b, pt_marker)))
502 {
503 Lisp_Object buffer;
504
505 eassert (!NILP (BVAR (b, begv_marker)));
506 eassert (!NILP (BVAR (b, zv_marker)));
507
508 XSETBUFFER (buffer, b);
509 set_marker_both (BVAR (b, pt_marker), buffer, b->pt, b->pt_byte);
510 set_marker_both (BVAR (b, begv_marker), buffer, b->begv, b->begv_byte);
511 set_marker_both (BVAR (b, zv_marker), buffer, b->zv, b->zv_byte);
512 }
513}
514
515
516/* If buffer B has markers to record PT, BEGV and ZV when it is not
517 current, fetch these values into B->begv etc. */
518
519static void
520fetch_buffer_markers (struct buffer *b)
521{
522 if (! NILP (BVAR (b, pt_marker)))
523 {
524 Lisp_Object m;
525
526 eassert (!NILP (BVAR (b, begv_marker)));
527 eassert (!NILP (BVAR (b, zv_marker)));
528
529 m = BVAR (b, pt_marker);
530 SET_BUF_PT_BOTH (b, marker_position (m), marker_byte_position (m));
531
532 m = BVAR (b, begv_marker);
533 SET_BUF_BEGV_BOTH (b, marker_position (m), marker_byte_position (m));
534
535 m = BVAR (b, zv_marker);
536 SET_BUF_ZV_BOTH (b, marker_position (m), marker_byte_position (m));
537 }
538}
539
540
492DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, Smake_indirect_buffer, 541DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, Smake_indirect_buffer,
493 2, 3, 542 2, 3,
494 "bMake indirect buffer (to buffer): \nBName of indirect buffer: ", 543 "bMake indirect buffer (to buffer): \nBName of indirect buffer: ",
@@ -527,12 +576,12 @@ CLONE nil means the indirect buffer's state is reset to default values. */)
527 /* Use the base buffer's text object. */ 576 /* Use the base buffer's text object. */
528 b->text = b->base_buffer->text; 577 b->text = b->base_buffer->text;
529 578
530 BUF_BEGV (b) = BUF_BEGV (b->base_buffer); 579 b->pt = b->base_buffer->pt;
531 BUF_ZV (b) = BUF_ZV (b->base_buffer); 580 b->begv = b->base_buffer->begv;
532 BUF_PT (b) = BUF_PT (b->base_buffer); 581 b->zv = b->base_buffer->zv;
533 BUF_BEGV_BYTE (b) = BUF_BEGV_BYTE (b->base_buffer); 582 b->pt_byte = b->base_buffer->pt_byte;
534 BUF_ZV_BYTE (b) = BUF_ZV_BYTE (b->base_buffer); 583 b->begv_byte = b->base_buffer->begv_byte;
535 BUF_PT_BYTE (b) = BUF_PT_BYTE (b->base_buffer); 584 b->zv_byte = b->base_buffer->zv_byte;
536 585
537 b->newline_cache = 0; 586 b->newline_cache = 0;
538 b->width_run_cache = 0; 587 b->width_run_cache = 0;
@@ -562,24 +611,23 @@ CLONE nil means the indirect buffer's state is reset to default values. */)
562 /* Make sure the base buffer has markers for its narrowing. */ 611 /* Make sure the base buffer has markers for its narrowing. */
563 if (NILP (BVAR (b->base_buffer, pt_marker))) 612 if (NILP (BVAR (b->base_buffer, pt_marker)))
564 { 613 {
614 eassert (NILP (BVAR (b, begv_marker)));
615 eassert (NILP (BVAR (b, zv_marker)));
616
565 BVAR (b->base_buffer, pt_marker) = Fmake_marker (); 617 BVAR (b->base_buffer, pt_marker) = Fmake_marker ();
566 set_marker_both (BVAR (b->base_buffer, pt_marker), base_buffer, 618 set_marker_both (BVAR (b->base_buffer, pt_marker), base_buffer,
567 BUF_PT (b->base_buffer), 619 b->base_buffer->pt,
568 BUF_PT_BYTE (b->base_buffer)); 620 b->base_buffer->pt_byte);
569 } 621
570 if (NILP (BVAR (b->base_buffer, begv_marker)))
571 {
572 BVAR (b->base_buffer, begv_marker) = Fmake_marker (); 622 BVAR (b->base_buffer, begv_marker) = Fmake_marker ();
573 set_marker_both (BVAR (b->base_buffer, begv_marker), base_buffer, 623 set_marker_both (BVAR (b->base_buffer, begv_marker), base_buffer,
574 BUF_BEGV (b->base_buffer), 624 b->base_buffer->begv,
575 BUF_BEGV_BYTE (b->base_buffer)); 625 b->base_buffer->begv_byte);
576 } 626
577 if (NILP (BVAR (b->base_buffer, zv_marker)))
578 {
579 BVAR (b->base_buffer, zv_marker) = Fmake_marker (); 627 BVAR (b->base_buffer, zv_marker) = Fmake_marker ();
580 set_marker_both (BVAR (b->base_buffer, zv_marker), base_buffer, 628 set_marker_both (BVAR (b->base_buffer, zv_marker), base_buffer,
581 BUF_ZV (b->base_buffer), 629 b->base_buffer->zv,
582 BUF_ZV_BYTE (b->base_buffer)); 630 b->base_buffer->zv_byte);
583 XMARKER (BVAR (b->base_buffer, zv_marker))->insertion_type = 1; 631 XMARKER (BVAR (b->base_buffer, zv_marker))->insertion_type = 1;
584 } 632 }
585 633
@@ -587,11 +635,11 @@ CLONE nil means the indirect buffer's state is reset to default values. */)
587 { 635 {
588 /* Give the indirect buffer markers for its narrowing. */ 636 /* Give the indirect buffer markers for its narrowing. */
589 BVAR (b, pt_marker) = Fmake_marker (); 637 BVAR (b, pt_marker) = Fmake_marker ();
590 set_marker_both (BVAR (b, pt_marker), buf, BUF_PT (b), BUF_PT_BYTE (b)); 638 set_marker_both (BVAR (b, pt_marker), buf, b->pt, b->pt_byte);
591 BVAR (b, begv_marker) = Fmake_marker (); 639 BVAR (b, begv_marker) = Fmake_marker ();
592 set_marker_both (BVAR (b, begv_marker), buf, BUF_BEGV (b), BUF_BEGV_BYTE (b)); 640 set_marker_both (BVAR (b, begv_marker), buf, b->begv, b->begv_byte);
593 BVAR (b, zv_marker) = Fmake_marker (); 641 BVAR (b, zv_marker) = Fmake_marker ();
594 set_marker_both (BVAR (b, zv_marker), buf, BUF_ZV (b), BUF_ZV_BYTE (b)); 642 set_marker_both (BVAR (b, zv_marker), buf, b->zv, b->zv_byte);
595 XMARKER (BVAR (b, zv_marker))->insertion_type = 1; 643 XMARKER (BVAR (b, zv_marker))->insertion_type = 1;
596 } 644 }
597 else 645 else
@@ -1796,27 +1844,7 @@ set_buffer_internal_1 (register struct buffer *b)
1796 1844
1797 /* If the old current buffer has markers to record PT, BEGV and ZV 1845 /* If the old current buffer has markers to record PT, BEGV and ZV
1798 when it is not current, update them now. */ 1846 when it is not current, update them now. */
1799 if (! NILP (BVAR (old_buf, pt_marker))) 1847 record_buffer_markers (old_buf);
1800 {
1801 Lisp_Object obuf;
1802 XSETBUFFER (obuf, old_buf);
1803 set_marker_both (BVAR (old_buf, pt_marker), obuf,
1804 BUF_PT (old_buf), BUF_PT_BYTE (old_buf));
1805 }
1806 if (! NILP (BVAR (old_buf, begv_marker)))
1807 {
1808 Lisp_Object obuf;
1809 XSETBUFFER (obuf, old_buf);
1810 set_marker_both (BVAR (old_buf, begv_marker), obuf,
1811 BUF_BEGV (old_buf), BUF_BEGV_BYTE (old_buf));
1812 }
1813 if (! NILP (BVAR (old_buf, zv_marker)))
1814 {
1815 Lisp_Object obuf;
1816 XSETBUFFER (obuf, old_buf);
1817 set_marker_both (BVAR (old_buf, zv_marker), obuf,
1818 BUF_ZV (old_buf), BUF_ZV_BYTE (old_buf));
1819 }
1820 } 1848 }
1821 1849
1822 /* Get the undo list from the base buffer, so that it appears 1850 /* Get the undo list from the base buffer, so that it appears
@@ -1826,21 +1854,7 @@ set_buffer_internal_1 (register struct buffer *b)
1826 1854
1827 /* If the new current buffer has markers to record PT, BEGV and ZV 1855 /* If the new current buffer has markers to record PT, BEGV and ZV
1828 when it is not current, fetch them now. */ 1856 when it is not current, fetch them now. */
1829 if (! NILP (BVAR (b, pt_marker))) 1857 fetch_buffer_markers (b);
1830 {
1831 BUF_PT (b) = marker_position (BVAR (b, pt_marker));
1832 BUF_PT_BYTE (b) = marker_byte_position (BVAR (b, pt_marker));
1833 }
1834 if (! NILP (BVAR (b, begv_marker)))
1835 {
1836 BUF_BEGV (b) = marker_position (BVAR (b, begv_marker));
1837 BUF_BEGV_BYTE (b) = marker_byte_position (BVAR (b, begv_marker));
1838 }
1839 if (! NILP (BVAR (b, zv_marker)))
1840 {
1841 BUF_ZV (b) = marker_position (BVAR (b, zv_marker));
1842 BUF_ZV_BYTE (b) = marker_byte_position (BVAR (b, zv_marker));
1843 }
1844 1858
1845 /* Look down buffer's list of local Lisp variables 1859 /* Look down buffer's list of local Lisp variables
1846 to find and update any that forward into C variables. */ 1860 to find and update any that forward into C variables. */
@@ -1876,50 +1890,13 @@ set_buffer_temp (struct buffer *b)
1876 old_buf = current_buffer; 1890 old_buf = current_buffer;
1877 current_buffer = b; 1891 current_buffer = b;
1878 1892
1879 if (old_buf) 1893 /* If the old current buffer has markers to record PT, BEGV and ZV
1880 { 1894 when it is not current, update them now. */
1881 /* If the old current buffer has markers to record PT, BEGV and ZV 1895 record_buffer_markers (old_buf);
1882 when it is not current, update them now. */
1883 if (! NILP (BVAR (old_buf, pt_marker)))
1884 {
1885 Lisp_Object obuf;
1886 XSETBUFFER (obuf, old_buf);
1887 set_marker_both (BVAR (old_buf, pt_marker), obuf,
1888 BUF_PT (old_buf), BUF_PT_BYTE (old_buf));
1889 }
1890 if (! NILP (BVAR (old_buf, begv_marker)))
1891 {
1892 Lisp_Object obuf;
1893 XSETBUFFER (obuf, old_buf);
1894 set_marker_both (BVAR (old_buf, begv_marker), obuf,
1895 BUF_BEGV (old_buf), BUF_BEGV_BYTE (old_buf));
1896 }
1897 if (! NILP (BVAR (old_buf, zv_marker)))
1898 {
1899 Lisp_Object obuf;
1900 XSETBUFFER (obuf, old_buf);
1901 set_marker_both (BVAR (old_buf, zv_marker), obuf,
1902 BUF_ZV (old_buf), BUF_ZV_BYTE (old_buf));
1903 }
1904 }
1905 1896
1906 /* If the new current buffer has markers to record PT, BEGV and ZV 1897 /* If the new current buffer has markers to record PT, BEGV and ZV
1907 when it is not current, fetch them now. */ 1898 when it is not current, fetch them now. */
1908 if (! NILP (BVAR (b, pt_marker))) 1899 fetch_buffer_markers (b);
1909 {
1910 BUF_PT (b) = marker_position (BVAR (b, pt_marker));
1911 BUF_PT_BYTE (b) = marker_byte_position (BVAR (b, pt_marker));
1912 }
1913 if (! NILP (BVAR (b, begv_marker)))
1914 {
1915 BUF_BEGV (b) = marker_position (BVAR (b, begv_marker));
1916 BUF_BEGV_BYTE (b) = marker_byte_position (BVAR (b, begv_marker));
1917 }
1918 if (! NILP (BVAR (b, zv_marker)))
1919 {
1920 BUF_ZV (b) = marker_position (BVAR (b, zv_marker));
1921 BUF_ZV_BYTE (b) = marker_byte_position (BVAR (b, zv_marker));
1922 }
1923} 1900}
1924 1901
1925DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0, 1902DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0,
diff --git a/src/buffer.h b/src/buffer.h
index 65c7168d60a..0975d2e3adc 100644
--- a/src/buffer.h
+++ b/src/buffer.h
@@ -107,27 +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/* !!!FIXME: all the BUF_BEGV/BUF_ZV/BUF_PT macros are flawed: 110/* The BUF_BEGV[_BYTE], BUF_ZV[_BYTE], and BUF_PT[_BYTE] macros cannot
111 on indirect (or base) buffers, that value is only correct if that buffer 111 be used for assignment; use SET_BUF_* macros below for that. */
112 is the current_buffer, or if the buffer's text hasn't been modified (via
113 an indirect buffer) since it was last current. */
114 112
115/* Position of beginning of accessible range of buffer. */ 113/* Position of beginning of accessible range of buffer. */
116#define BUF_BEGV(buf) ((buf)->begv) 114#define BUF_BEGV(buf) \
117#define BUF_BEGV_BYTE(buf) ((buf)->begv_byte) 115 (buf == current_buffer ? BEGV \
116 : NILP (BVAR (buf, begv_marker)) ? buf->begv \
117 : marker_position (BVAR (buf, begv_marker)))
118
119#define BUF_BEGV_BYTE(buf) \
120 (buf == current_buffer ? BEGV_BYTE \
121 : NILP (BVAR (buf, begv_marker)) ? buf->begv_byte \
122 : marker_byte_position (BVAR (buf, begv_marker)))
118 123
119/* Position of point in buffer. */ 124/* Position of point in buffer. */
120#define BUF_PT(buf) ((buf)->pt) 125#define BUF_PT(buf) \
121#define BUF_PT_BYTE(buf) ((buf)->pt_byte) 126 (buf == current_buffer ? PT \
127 : NILP (BVAR (buf, pt_marker)) ? buf->pt \
128 : marker_position (BVAR (buf, pt_marker)))
129
130#define BUF_PT_BYTE(buf) \
131 (buf == current_buffer ? PT_BYTE \
132 : NILP (BVAR (buf, pt_marker)) ? buf->pt_byte \
133 : marker_byte_position (BVAR (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 (BVAR (buf, zv_marker)) ? buf->zv \
139 : marker_position (BVAR (buf, zv_marker)))
140
141#define BUF_ZV_BYTE(buf) \
142 (buf == current_buffer ? ZV_BYTE \
143 : NILP (BVAR (buf, zv_marker)) ? buf->zv_byte \
144 : marker_byte_position (BVAR (buf, zv_marker)))
122 145
123/* Position of gap in buffer. */ 146/* Position of gap in buffer. */
124#define BUF_GPT(buf) ((buf)->text->gpt) 147#define BUF_GPT(buf) ((buf)->text->gpt)
125#define BUF_GPT_BYTE(buf) ((buf)->text->gpt_byte) 148#define BUF_GPT_BYTE(buf) ((buf)->text->gpt_byte)
126 149
127/* Position of end of accessible range of buffer. */
128#define BUF_ZV(buf) ((buf)->zv)
129#define BUF_ZV_BYTE(buf) ((buf)->zv_byte)
130
131/* Position of end of buffer. */ 150/* Position of end of buffer. */
132#define BUF_Z(buf) ((buf)->text->z) 151#define BUF_Z(buf) ((buf)->text->z)
133#define BUF_Z_BYTE(buf) ((buf)->text->z_byte) 152#define BUF_Z_BYTE(buf) ((buf)->text->z_byte)
@@ -235,8 +254,6 @@ extern void enlarge_buffer_text (struct buffer *, EMACS_INT);
235 254
236/* 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.
237 256
238 SET_BUF_PT* seet to be redundant. Get rid of them?
239
240 The ..._BOTH macros take both a charpos and a bytepos, 257 The ..._BOTH macros take both a charpos and a bytepos,
241 which must correspond to each other. 258 which must correspond to each other.
242 259
diff --git a/src/insdel.c b/src/insdel.c
index 7fcf9522a33..bdf6aff1717 100644
--- a/src/insdel.c
+++ b/src/insdel.c
@@ -411,9 +411,7 @@ adjust_markers_for_insert (EMACS_INT from, EMACS_INT from_byte,
411static void 411static void
412adjust_point (EMACS_INT nchars, EMACS_INT nbytes) 412adjust_point (EMACS_INT nchars, EMACS_INT nbytes)
413{ 413{
414 BUF_PT (current_buffer) += nchars; 414 SET_BUF_PT_BOTH (current_buffer, PT + nchars, PT_BYTE + nbytes);
415 BUF_PT_BYTE (current_buffer) += nbytes;
416
417 /* In a single-byte buffer, the two positions must be equal. */ 415 /* In a single-byte buffer, the two positions must be equal. */
418 eassert (PT_BYTE >= PT && PT_BYTE - PT <= ZV_BYTE - ZV); 416 eassert (PT_BYTE >= PT && PT_BYTE - PT <= ZV_BYTE - ZV);
419} 417}
diff --git a/src/intervals.c b/src/intervals.c
index 6aee6e9d7fa..12b2789cc77 100644
--- a/src/intervals.c
+++ b/src/intervals.c
@@ -1892,8 +1892,7 @@ temp_set_point_both (struct buffer *buffer,
1892 if (charpos > BUF_ZV (buffer) || charpos < BUF_BEGV (buffer)) 1892 if (charpos > BUF_ZV (buffer) || charpos < BUF_BEGV (buffer))
1893 abort (); 1893 abort ();
1894 1894
1895 BUF_PT_BYTE (buffer) = bytepos; 1895 SET_BUF_PT_BOTH (buffer, charpos, bytepos);
1896 BUF_PT (buffer) = charpos;
1897} 1896}
1898 1897
1899/* Set point "temporarily", without checking any text properties. */ 1898/* Set point "temporarily", without checking any text properties. */
@@ -2312,10 +2311,9 @@ get_local_map (register EMACS_INT position, register struct buffer *buffer,
2312 old_zv = BUF_ZV (buffer); 2311 old_zv = BUF_ZV (buffer);
2313 old_begv_byte = BUF_BEGV_BYTE (buffer); 2312 old_begv_byte = BUF_BEGV_BYTE (buffer);
2314 old_zv_byte = BUF_ZV_BYTE (buffer); 2313 old_zv_byte = BUF_ZV_BYTE (buffer);
2315 BUF_BEGV (buffer) = BUF_BEG (buffer); 2314
2316 BUF_ZV (buffer) = BUF_Z (buffer); 2315 SET_BUF_BEGV_BOTH (buffer, BUF_BEG (buffer), BUF_BEG_BYTE (buffer));
2317 BUF_BEGV_BYTE (buffer) = BUF_BEG_BYTE (buffer); 2316 SET_BUF_ZV_BOTH (buffer, BUF_Z (buffer), BUF_Z_BYTE (buffer));
2318 BUF_ZV_BYTE (buffer) = BUF_Z_BYTE (buffer);
2319 2317
2320 XSETFASTINT (lispy_position, position); 2318 XSETFASTINT (lispy_position, position);
2321 XSETBUFFER (lispy_buffer, buffer); 2319 XSETBUFFER (lispy_buffer, buffer);
@@ -2329,10 +2327,8 @@ get_local_map (register EMACS_INT position, register struct buffer *buffer,
2329 if (NILP (prop)) 2327 if (NILP (prop))
2330 prop = get_pos_property (lispy_position, type, lispy_buffer); 2328 prop = get_pos_property (lispy_position, type, lispy_buffer);
2331 2329
2332 BUF_BEGV (buffer) = old_begv; 2330 SET_BUF_BEGV_BOTH (buffer, old_begv, old_begv_byte);
2333 BUF_ZV (buffer) = old_zv; 2331 SET_BUF_ZV_BOTH (buffer, old_zv, old_zv_byte);
2334 BUF_BEGV_BYTE (buffer) = old_begv_byte;
2335 BUF_ZV_BYTE (buffer) = old_zv_byte;
2336 2332
2337 /* Use the local map only if it is valid. */ 2333 /* Use the local map only if it is valid. */
2338 prop = get_keymap (prop, 0, 0); 2334 prop = get_keymap (prop, 0, 0);
diff --git a/src/lread.c b/src/lread.c
index 8a5f6ecd691..3c5b627f98c 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -368,15 +368,15 @@ unreadchar (Lisp_Object readcharfun, int c)
368 else if (BUFFERP (readcharfun)) 368 else if (BUFFERP (readcharfun))
369 { 369 {
370 struct buffer *b = XBUFFER (readcharfun); 370 struct buffer *b = XBUFFER (readcharfun);
371 EMACS_INT charpos = BUF_PT (b);
371 EMACS_INT bytepos = BUF_PT_BYTE (b); 372 EMACS_INT bytepos = BUF_PT_BYTE (b);
372 373
373 BUF_PT (b)--;
374 if (! NILP (BVAR (b, enable_multibyte_characters))) 374 if (! NILP (BVAR (b, enable_multibyte_characters)))
375 BUF_DEC_POS (b, bytepos); 375 BUF_DEC_POS (b, bytepos);
376 else 376 else
377 bytepos--; 377 bytepos--;
378 378
379 BUF_PT_BYTE (b) = bytepos; 379 SET_BUF_PT_BOTH (b, charpos - 1, bytepos);
380 } 380 }
381 else if (MARKERP (readcharfun)) 381 else if (MARKERP (readcharfun))
382 { 382 {
diff --git a/src/xdisp.c b/src/xdisp.c
index f2477a2eca5..a7955f41e0c 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -10909,7 +10909,7 @@ hscroll_window_tree (Lisp_Object window)
10909 current_buffer = XBUFFER (w->buffer); 10909 current_buffer = XBUFFER (w->buffer);
10910 10910
10911 if (w == XWINDOW (selected_window)) 10911 if (w == XWINDOW (selected_window))
10912 pt = BUF_PT (current_buffer); 10912 pt = PT;
10913 else 10913 else
10914 { 10914 {
10915 pt = marker_position (w->pointm); 10915 pt = marker_position (w->pointm);
@@ -11347,7 +11347,7 @@ reconsider_clip_changes (struct window *w, struct buffer *b)
11347 EMACS_INT pt; 11347 EMACS_INT pt;
11348 11348
11349 if (w == XWINDOW (selected_window)) 11349 if (w == XWINDOW (selected_window))
11350 pt = BUF_PT (current_buffer); 11350 pt = PT;
11351 else 11351 else
11352 pt = marker_position (w->pointm); 11352 pt = marker_position (w->pointm);
11353 11353