bidi_it->stack_idx++;
eassert (bidi_it->stack_idx < BIDI_MAXDEPTH+2+1);
st = &bidi_it->level_stack[bidi_it->stack_idx];
+ eassert (level <= (1 << 7));
st->level = level;
st->override = override;
st->isolate_status = isolate_status;
if (isolate_status)
{
- st->prev = bidi_it->prev;
st->last_strong = bidi_it->last_strong;
st->prev_for_neutral = bidi_it->prev_for_neutral;
st->next_for_neutral = bidi_it->next_for_neutral;
static int
bidi_pop_embedding_level (struct bidi_it *bidi_it)
{
+ int level;
+
/* UAX#9 says to ignore invalid PDFs (X7, last bullet)
and PDIs (X6a, 2nd bullet). */
if (bidi_it->stack_idx > 0)
st = bidi_it->level_stack[bidi_it->stack_idx];
if (isolate_status)
{
- bidi_it->prev = st.prev;
+ /* PREV is used in W1 for resolving WEAK_NSM. By the time
+ we get to an NSM, we must have gotten past at least one
+ character: the PDI that ends the isolate from which we
+ are popping here. So PREV will have been filled up by
+ the time we first use it. We initialize it here to
+ UNKNOWN_BT to be able to catch any blunders in this
+ logic. */
+ bidi_it->prev.orig_type = bidi_it->prev.type_after_w1
+ = bidi_it->prev.type = UNKNOWN_BT;
bidi_it->last_strong = st.last_strong;
bidi_it->prev_for_neutral = st.prev_for_neutral;
bidi_it->next_for_neutral = st.next_for_neutral;
}
bidi_it->stack_idx--;
}
- return bidi_it->level_stack[bidi_it->stack_idx].level;
+ level = bidi_it->level_stack[bidi_it->stack_idx].level;
+ eassert (0 <= level && level <= BIDI_MAXDEPTH + 1);
+ return level;
}
/* Record in SAVED_INFO the information about the current character. */
levels, override status, isolate status, and isolating sequence
runs. */
struct bidi_stack {
- char level;
- bool isolate_status;
- bidi_dir_t override;
- struct bidi_saved_info prev;
struct bidi_saved_info last_strong;
struct bidi_saved_info next_for_neutral;
struct bidi_saved_info prev_for_neutral;
struct bidi_saved_info next_for_ws;
- bidi_dir_t sos;
+ unsigned level : 7;
+ bool_bf isolate_status : 1;
+ unsigned override : 2;
+ unsigned sos : 2;
};
/* Data type for storing information about a string being iterated on. */