diff options
| author | Eli Zaretskii | 2014-09-06 14:33:43 +0300 |
|---|---|---|
| committer | Eli Zaretskii | 2014-09-06 14:33:43 +0300 |
| commit | 2f3daa55d193ff0d9f06340f766f82f06639dc99 (patch) | |
| tree | e8787ce9f5a897542c97b950e9722c73d320ed69 /src | |
| parent | a7fed5a88274d2d3737f7fd1192587731b4d4595 (diff) | |
| download | emacs-2f3daa55d193ff0d9f06340f766f82f06639dc99.tar.gz emacs-2f3daa55d193ff0d9f06340f766f82f06639dc99.zip | |
Optimize memory footprint of the bidi level stack.
Diffstat (limited to 'src')
| -rw-r--r-- | src/bidi.c | 18 | ||||
| -rw-r--r-- | src/dispextern.h | 9 |
2 files changed, 19 insertions, 8 deletions
diff --git a/src/bidi.c b/src/bidi.c index cb86b20b38e..6fe937671da 100644 --- a/src/bidi.c +++ b/src/bidi.c | |||
| @@ -429,12 +429,12 @@ bidi_push_embedding_level (struct bidi_it *bidi_it, | |||
| 429 | bidi_it->stack_idx++; | 429 | bidi_it->stack_idx++; |
| 430 | eassert (bidi_it->stack_idx < BIDI_MAXDEPTH+2+1); | 430 | eassert (bidi_it->stack_idx < BIDI_MAXDEPTH+2+1); |
| 431 | st = &bidi_it->level_stack[bidi_it->stack_idx]; | 431 | st = &bidi_it->level_stack[bidi_it->stack_idx]; |
| 432 | eassert (level <= (1 << 7)); | ||
| 432 | st->level = level; | 433 | st->level = level; |
| 433 | st->override = override; | 434 | st->override = override; |
| 434 | st->isolate_status = isolate_status; | 435 | st->isolate_status = isolate_status; |
| 435 | if (isolate_status) | 436 | if (isolate_status) |
| 436 | { | 437 | { |
| 437 | st->prev = bidi_it->prev; | ||
| 438 | st->last_strong = bidi_it->last_strong; | 438 | st->last_strong = bidi_it->last_strong; |
| 439 | st->prev_for_neutral = bidi_it->prev_for_neutral; | 439 | st->prev_for_neutral = bidi_it->prev_for_neutral; |
| 440 | st->next_for_neutral = bidi_it->next_for_neutral; | 440 | st->next_for_neutral = bidi_it->next_for_neutral; |
| @@ -449,6 +449,8 @@ bidi_push_embedding_level (struct bidi_it *bidi_it, | |||
| 449 | static int | 449 | static int |
| 450 | bidi_pop_embedding_level (struct bidi_it *bidi_it) | 450 | bidi_pop_embedding_level (struct bidi_it *bidi_it) |
| 451 | { | 451 | { |
| 452 | int level; | ||
| 453 | |||
| 452 | /* UAX#9 says to ignore invalid PDFs (X7, last bullet) | 454 | /* UAX#9 says to ignore invalid PDFs (X7, last bullet) |
| 453 | and PDIs (X6a, 2nd bullet). */ | 455 | and PDIs (X6a, 2nd bullet). */ |
| 454 | if (bidi_it->stack_idx > 0) | 456 | if (bidi_it->stack_idx > 0) |
| @@ -460,7 +462,15 @@ bidi_pop_embedding_level (struct bidi_it *bidi_it) | |||
| 460 | st = bidi_it->level_stack[bidi_it->stack_idx]; | 462 | st = bidi_it->level_stack[bidi_it->stack_idx]; |
| 461 | if (isolate_status) | 463 | if (isolate_status) |
| 462 | { | 464 | { |
| 463 | bidi_it->prev = st.prev; | 465 | /* PREV is used in W1 for resolving WEAK_NSM. By the time |
| 466 | we get to an NSM, we must have gotten past at least one | ||
| 467 | character: the PDI that ends the isolate from which we | ||
| 468 | are popping here. So PREV will have been filled up by | ||
| 469 | the time we first use it. We initialize it here to | ||
| 470 | UNKNOWN_BT to be able to catch any blunders in this | ||
| 471 | logic. */ | ||
| 472 | bidi_it->prev.orig_type = bidi_it->prev.type_after_w1 | ||
| 473 | = bidi_it->prev.type = UNKNOWN_BT; | ||
| 464 | bidi_it->last_strong = st.last_strong; | 474 | bidi_it->last_strong = st.last_strong; |
| 465 | bidi_it->prev_for_neutral = st.prev_for_neutral; | 475 | bidi_it->prev_for_neutral = st.prev_for_neutral; |
| 466 | bidi_it->next_for_neutral = st.next_for_neutral; | 476 | bidi_it->next_for_neutral = st.next_for_neutral; |
| @@ -469,7 +479,9 @@ bidi_pop_embedding_level (struct bidi_it *bidi_it) | |||
| 469 | } | 479 | } |
| 470 | bidi_it->stack_idx--; | 480 | bidi_it->stack_idx--; |
| 471 | } | 481 | } |
| 472 | return bidi_it->level_stack[bidi_it->stack_idx].level; | 482 | level = bidi_it->level_stack[bidi_it->stack_idx].level; |
| 483 | eassert (0 <= level && level <= BIDI_MAXDEPTH + 1); | ||
| 484 | return level; | ||
| 473 | } | 485 | } |
| 474 | 486 | ||
| 475 | /* Record in SAVED_INFO the information about the current character. */ | 487 | /* Record in SAVED_INFO the information about the current character. */ |
diff --git a/src/dispextern.h b/src/dispextern.h index 3723d341a51..e0701f34a41 100644 --- a/src/dispextern.h +++ b/src/dispextern.h | |||
| @@ -1912,15 +1912,14 @@ struct bidi_saved_info { | |||
| 1912 | levels, override status, isolate status, and isolating sequence | 1912 | levels, override status, isolate status, and isolating sequence |
| 1913 | runs. */ | 1913 | runs. */ |
| 1914 | struct bidi_stack { | 1914 | struct bidi_stack { |
| 1915 | char level; | ||
| 1916 | bool isolate_status; | ||
| 1917 | bidi_dir_t override; | ||
| 1918 | struct bidi_saved_info prev; | ||
| 1919 | struct bidi_saved_info last_strong; | 1915 | struct bidi_saved_info last_strong; |
| 1920 | struct bidi_saved_info next_for_neutral; | 1916 | struct bidi_saved_info next_for_neutral; |
| 1921 | struct bidi_saved_info prev_for_neutral; | 1917 | struct bidi_saved_info prev_for_neutral; |
| 1922 | struct bidi_saved_info next_for_ws; | 1918 | struct bidi_saved_info next_for_ws; |
| 1923 | bidi_dir_t sos; | 1919 | unsigned level : 7; |
| 1920 | bool_bf isolate_status : 1; | ||
| 1921 | unsigned override : 2; | ||
| 1922 | unsigned sos : 2; | ||
| 1924 | }; | 1923 | }; |
| 1925 | 1924 | ||
| 1926 | /* Data type for storing information about a string being iterated on. */ | 1925 | /* Data type for storing information about a string being iterated on. */ |