aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
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/buffer.c
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/buffer.c')
-rw-r--r--src/buffer.c187
1 files changed, 82 insertions, 105 deletions
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,