]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix bug #15841 with missing line numbers in linum-mode.
authorEli Zaretskii <eliz@gnu.org>
Sat, 9 Nov 2013 21:24:10 +0000 (23:24 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sat, 9 Nov 2013 21:24:10 +0000 (23:24 +0200)
 src/search.c (find_newline): If buffer text is relocated during the
 "dumb loop", adjust C pointers into buffer text to follow suit.

src/ChangeLog
src/search.c

index 5ff279a44002ade8b5449a549937490597acf1d2..9a4855332661178aca295439d291b138028bcf3d 100644 (file)
@@ -1,3 +1,9 @@
+2013-11-09  Eli Zaretskii  <eliz@gnu.org>
+
+       * search.c (find_newline): If buffer text is relocated during the
+       "dumb loop", adjust C pointers into buffer text to follow suit.
+       (Bug#15841)
+
 2013-11-09  Ćukasz Stelmach <stlman@poczta.fm> (tiny change)
 
        * gtkutil.c (xg_check_special_colors): Use rgb: instead of rgbi:
index 99e8d2501feb8bf50154bda4a3e1b731eb1ca926..1d0740428d7dac17c3d7cba5af13768119cf8dcb 100644 (file)
@@ -752,6 +752,22 @@ find_newline (ptrdiff_t start, ptrdiff_t start_byte, ptrdiff_t end,
                    *bytepos = nl + 1 - base + start_byte;
                  return BYTE_TO_CHAR (nl + 1 - base + start_byte);
                }
+             if (newline_cache)
+               {
+                 /* The call to know_region_cache could have
+                    allocated memory and caused relocation of buffer
+                    text.  If it did, adjust pointers into buffer
+                    text.  */
+                 ptrdiff_t offset = BYTE_POS_ADDR (start_byte) - base;
+
+                 if (offset != 0)
+                   {
+                     cursor += offset;
+                     base += offset;
+                     ceiling_addr += offset;
+                     nl += offset;
+                   }
+               }
              cursor = nl + 1;
             }
 
@@ -824,6 +840,18 @@ find_newline (ptrdiff_t start, ptrdiff_t start_byte, ptrdiff_t end,
                    *bytepos = nl - base + start_byte;
                  return BYTE_TO_CHAR (nl - base + start_byte);
                }
+             if (newline_cache)
+               {
+                 ptrdiff_t offset = BYTE_POS_ADDR (start_byte - 1) - base;
+
+                 if (offset != 0)
+                   {
+                     cursor += offset;
+                     base += offset;
+                     ceiling_addr += offset;
+                     nl += offset;
+                   }
+               }
              cursor = nl - 1;
             }