aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEli Zaretskii2014-09-13 20:49:40 +0300
committerEli Zaretskii2014-09-13 20:49:40 +0300
commit924d744508c5b6268e73258ccc7282cc1297fae7 (patch)
tree4087954aa6cd987663abba2c7e690be80aedd8b8 /src
parenteb71ffc65e57e72798c9e1326a0e804380b94b56 (diff)
downloademacs-924d744508c5b6268e73258ccc7282cc1297fae7.tar.gz
emacs-924d744508c5b6268e73258ccc7282cc1297fae7.zip
Use the level stack for initial level below bidi_level_of_next_char.
This still crashes in TUTORIAL.he.
Diffstat (limited to 'src')
-rw-r--r--src/bidi.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/bidi.c b/src/bidi.c
index 6fe937671da..41e4bbb2ed6 100644
--- a/src/bidi.c
+++ b/src/bidi.c
@@ -1953,7 +1953,7 @@ bidi_resolve_explicit_1 (struct bidi_it *bidi_it)
1953static int 1953static int
1954bidi_resolve_explicit (struct bidi_it *bidi_it) 1954bidi_resolve_explicit (struct bidi_it *bidi_it)
1955{ 1955{
1956 int prev_level = bidi_it->resolved_level; 1956 int prev_level = bidi_it->level_stack[bidi_it->stack_idx].level;
1957 int new_level = bidi_resolve_explicit_1 (bidi_it); 1957 int new_level = bidi_resolve_explicit_1 (bidi_it);
1958 ptrdiff_t eob = bidi_it->string.s ? bidi_it->string.schars : ZV; 1958 ptrdiff_t eob = bidi_it->string.s ? bidi_it->string.schars : ZV;
1959 const unsigned char *s 1959 const unsigned char *s
@@ -2035,7 +2035,7 @@ bidi_resolve_weak (struct bidi_it *bidi_it)
2035{ 2035{
2036 bidi_type_t type; 2036 bidi_type_t type;
2037 bidi_dir_t override; 2037 bidi_dir_t override;
2038 int prev_level = bidi_it->resolved_level; 2038 int prev_level = bidi_it->level_stack[bidi_it->stack_idx].level;
2039 int new_level = bidi_resolve_explicit (bidi_it); 2039 int new_level = bidi_resolve_explicit (bidi_it);
2040 int next_char; 2040 int next_char;
2041 bidi_type_t type_of_next; 2041 bidi_type_t type_of_next;
@@ -2283,9 +2283,9 @@ bidi_resolve_neutral_1 (bidi_type_t prev_type, bidi_type_t next_type, int lev)
2283static bidi_type_t 2283static bidi_type_t
2284bidi_resolve_neutral (struct bidi_it *bidi_it) 2284bidi_resolve_neutral (struct bidi_it *bidi_it)
2285{ 2285{
2286 int prev_level = bidi_it->resolved_level; 2286 int prev_level = bidi_it->level_stack[bidi_it->stack_idx].level;
2287 bidi_type_t type = bidi_resolve_weak (bidi_it); 2287 bidi_type_t type = bidi_resolve_weak (bidi_it);
2288 int current_level = bidi_it->resolved_level; 2288 int current_level = bidi_it->level_stack[bidi_it->stack_idx].level;
2289 2289
2290 if (!(type == STRONG_R 2290 if (!(type == STRONG_R
2291 || type == STRONG_L 2291 || type == STRONG_L
@@ -2517,7 +2517,7 @@ bidi_level_of_next_char (struct bidi_it *bidi_it)
2517 state must be already cached, so there's no need to know the 2517 state must be already cached, so there's no need to know the
2518 embedding level of the previous character, since we will be 2518 embedding level of the previous character, since we will be
2519 returning to our caller shortly. */ 2519 returning to our caller shortly. */
2520 prev_level = bidi_it->resolved_level; 2520 prev_level = bidi_it->level_stack[bidi_it->stack_idx].level;
2521 eassert (prev_level >= 0); 2521 eassert (prev_level >= 0);
2522 } 2522 }
2523 next_for_neutral = bidi_it->next_for_neutral; 2523 next_for_neutral = bidi_it->next_for_neutral;
@@ -2685,6 +2685,8 @@ bidi_level_of_next_char (struct bidi_it *bidi_it)
2685 level++; 2685 level++;
2686 } 2686 }
2687 2687
2688 /* FIXME: Exempt explicit directional characters from the assignment
2689 below, and remove the PDF hack above. */
2688 bidi_it->resolved_level = level; 2690 bidi_it->resolved_level = level;
2689 return level; 2691 return level;
2690} 2692}
@@ -2822,6 +2824,11 @@ bidi_move_to_visually_next (struct bidi_it *bidi_it)
2822 in the cache, which at this point should not happen. If 2824 in the cache, which at this point should not happen. If
2823 it does, we will infloop. */ 2825 it does, we will infloop. */
2824 eassert (next_level >= 0); 2826 eassert (next_level >= 0);
2827 /* If next_level is not consistent with incr, we might
2828 infloop. */
2829 eassert (incr > 0
2830 ? next_level > expected_next_level
2831 : next_level < expected_next_level);
2825 expected_next_level += incr; 2832 expected_next_level += incr;
2826 level_to_search += incr; 2833 level_to_search += incr;
2827 bidi_find_other_level_edge (bidi_it, level_to_search, !ascending); 2834 bidi_find_other_level_edge (bidi_it, level_to_search, !ascending);