From: Eli Zaretskii Date: Sat, 11 Oct 2014 14:10:46 +0000 (+0300) Subject: Reset bracket_resolved bit earlier; remove bytepos from bidi_saved_info. X-Git-Tag: emacs-25.0.90~2635^2~679^2~50^2~17 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=4d5fab649d6673d1d270a6b7b35ae41cfced374e;p=emacs.git Reset bracket_resolved bit earlier; remove bytepos from bidi_saved_info. --- diff --git a/src/bidi.c b/src/bidi.c index 53191c14b8a..d14d6f6186a 100644 --- a/src/bidi.c +++ b/src/bidi.c @@ -411,7 +411,6 @@ bidi_set_sos_type (struct bidi_it *bidi_it, int level_before, int level_after) = bidi_it->last_strong.orig_type = UNKNOWN_BT; bidi_it->prev_for_neutral.type = (bidi_it->sos == R2L ? STRONG_R : STRONG_L); bidi_it->prev_for_neutral.charpos = bidi_it->charpos; - bidi_it->prev_for_neutral.bytepos = bidi_it->bytepos; bidi_it->next_for_neutral.type = bidi_it->next_for_neutral.type_after_wn = bidi_it->next_for_neutral.orig_type = UNKNOWN_BT; } @@ -496,7 +495,6 @@ bidi_remember_char (struct bidi_saved_info *saved_info, struct bidi_it *bidi_it) { saved_info->charpos = bidi_it->charpos; - saved_info->bytepos = bidi_it->bytepos; saved_info->type = bidi_it->type; bidi_check_type (bidi_it->type); saved_info->type_after_wn = bidi_it->type_after_wn; @@ -1776,6 +1774,9 @@ bidi_resolve_explicit (struct bidi_it *bidi_it) else /* EOB or end of string */ prev_type = NEUTRAL_B; + /* Reset the bracket_resolved flag. */ + bidi_it->bracket_resolved = 0; + current_level = bidi_it->level_stack[bidi_it->stack_idx].level; /* X1 */ override = bidi_it->level_stack[bidi_it->stack_idx].override; isolate_status = bidi_it->level_stack[bidi_it->stack_idx].isolate_status; @@ -2777,9 +2778,6 @@ bidi_level_of_next_char (struct bidi_it *bidi_it) && bidi_it->charpos >= bidi_it->next_for_ws.charpos) bidi_it->next_for_ws.type = UNKNOWN_BT; - /* Resete the bracket_resolved flag. */ - bidi_it->bracket_resolved = 0; - /* This must be taken before we fill the iterator with the info about the next char. If we scan backwards, the iterator state must be already cached, so there's no need to know the @@ -2884,7 +2882,10 @@ bidi_level_of_next_char (struct bidi_it *bidi_it) if (bidi_get_category (type) == NEUTRAL /* && type != NEUTRAL_B */ || bidi_isolate_fmt_char (type)) { - if (bidi_it->next_for_neutral.type == UNKNOWN_BT) + /* Make sure the data for resolving neutrals we are about to use + is valid. */ + if (bidi_it->next_for_neutral.charpos <= bidi_it->charpos + || bidi_it->next_for_neutral.type == UNKNOWN_BT) emacs_abort (); /* If the cached state shows a neutral character, it was not @@ -2932,7 +2933,6 @@ bidi_level_of_next_char (struct bidi_it *bidi_it) bidi_it->next_for_ws.type = chtype; bidi_check_type (bidi_it->next_for_ws.type); bidi_it->next_for_ws.charpos = cpos; - bidi_it->next_for_ws.bytepos = bpos; } /* Resolve implicit levels. */ diff --git a/src/dispextern.h b/src/dispextern.h index d476656e1b2..80b3879b806 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -1913,10 +1913,10 @@ typedef enum { NEUTRAL_DIR, L2R, R2L } bidi_dir_t; /* Data type for storing information about characters we need to remember. */ struct bidi_saved_info { - ptrdiff_t bytepos, charpos; /* character's buffer position */ + ptrdiff_t charpos; /* character's buffer position */ bidi_type_t type; /* character's resolved bidi type */ - bidi_type_t type_after_wn; /* original type of the character, after W1 */ - bidi_type_t orig_type; /* type as we found it in the buffer */ + bidi_type_t type_after_wn; /* bidi type of the character, after Wn */ + bidi_type_t orig_type; /* bidi type as we found it in the buffer */ bool_bf bracket_resolved : 1; /* 1 if type was BPA-resolved */ };