aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Zaretskii2014-09-06 14:33:43 +0300
committerEli Zaretskii2014-09-06 14:33:43 +0300
commit2f3daa55d193ff0d9f06340f766f82f06639dc99 (patch)
treee8787ce9f5a897542c97b950e9722c73d320ed69
parenta7fed5a88274d2d3737f7fd1192587731b4d4595 (diff)
downloademacs-2f3daa55d193ff0d9f06340f766f82f06639dc99.tar.gz
emacs-2f3daa55d193ff0d9f06340f766f82f06639dc99.zip
Optimize memory footprint of the bidi level stack.
-rw-r--r--src/bidi.c18
-rw-r--r--src/dispextern.h9
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,
449static int 449static int
450bidi_pop_embedding_level (struct bidi_it *bidi_it) 450bidi_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. */
1914struct bidi_stack { 1914struct 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. */