]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix crash reported in bug #6306.
authorEli Zaretskii <eliz@gnu.org>
Sun, 30 May 2010 19:01:51 +0000 (22:01 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sun, 30 May 2010 19:01:51 +0000 (22:01 +0300)
 bidi.c (bidi_move_to_visually_next): Make sure the sentinel
 state is always cached.

src/ChangeLog
src/bidi.c

index 718f2b385d87220ca6e6b5901842f857c0e0619e..256d96effb88a28465a2eff9431fa55be0ac3343 100644 (file)
@@ -1,3 +1,8 @@
+2010-05-30  Eli Zaretskii  <eliz@gnu.org>
+
+       * bidi.c (bidi_move_to_visually_next): Make sure the sentinel
+       state is always cached (bug#6306).
+
 2010-05-29  Eli Zaretskii  <eliz@gnu.org>
 
        Fix cursor motion in bidi-reordered continued lines.
index bdeccfee97c8f5fb1ef2e88a79e154c816677768..a25976dcc015e36154f4e4846ead7433807e0594 100644 (file)
@@ -1907,7 +1907,9 @@ bidi_move_to_visually_next (struct bidi_it *bidi_it)
   if (!bidi_it->first_elt && bidi_it->orig_type == NEUTRAL_B)
     bidi_line_init (bidi_it);
 
-  /* Prepare the sentinel iterator state.  */
+  /* Prepare the sentinel iterator state, and cache it.  When we bump
+     into it, scanning backwards, we'll know that the last non-base
+     level is exhausted.  */
   if (bidi_cache_idx == 0)
     {
       bidi_copy_it (&sentinel, bidi_it);
@@ -1918,6 +1920,7 @@ bidi_move_to_visually_next (struct bidi_it *bidi_it)
          sentinel.ch = '\n';   /* doesn't matter, but why not? */
          sentinel.ch_len = 1;
        }
+      bidi_cache_iterator_state (&sentinel, 1);
     }
 
   old_level = bidi_it->resolved_level;
@@ -1933,11 +1936,6 @@ bidi_move_to_visually_next (struct bidi_it *bidi_it)
       int incr = ascending ? 1 : -1;
       int expected_next_level = old_level + incr;
 
-      /* If we don't have anything cached yet, we need to cache the
-        sentinel state, since we'll need it to record where to jump
-        when the last non-base level is exhausted.  */
-      if (bidi_cache_idx == 0)
-       bidi_cache_iterator_state (&sentinel, 1);
       /* Jump (or walk) to the other edge of this level.  */
       bidi_find_other_level_edge (bidi_it, level_to_search, !ascending);
       /* Switch scan direction and peek at the next character in the