]> git.eshelyaron.com Git - emacs.git/commitdiff
Optimize memory footprint of the bidi level stack.
authorEli Zaretskii <eliz@gnu.org>
Sat, 6 Sep 2014 11:33:43 +0000 (14:33 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 6 Sep 2014 11:33:43 +0000 (14:33 +0300)
src/bidi.c
src/dispextern.h

index cb86b20b38ee1947173c8a787cad397e495cb5c6..6fe937671da3d5ca4de1d51998bb3602043beb1e 100644 (file)
@@ -429,12 +429,12 @@ bidi_push_embedding_level (struct bidi_it *bidi_it,
   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;
@@ -449,6 +449,8 @@ bidi_push_embedding_level (struct bidi_it *bidi_it,
 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)
@@ -460,7 +462,15 @@ bidi_pop_embedding_level (struct bidi_it *bidi_it)
       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;
@@ -469,7 +479,9 @@ bidi_pop_embedding_level (struct bidi_it *bidi_it)
        }
       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.  */
index 3723d341a515e9aadf3b309154800a495fb0741a..e0701f34a4133aba011c8b899b4b4fab225bec7a 100644 (file)
@@ -1912,15 +1912,14 @@ struct bidi_saved_info {
    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.  */