]> git.eshelyaron.com Git - emacs.git/commitdiff
Make the cache of bidi iterator states dynamically allocated.
authorEli Zaretskii <eliz@gnu.org>
Fri, 14 May 2010 15:19:07 +0000 (18:19 +0300)
committerEli Zaretskii <eliz@gnu.org>
Fri, 14 May 2010 15:19:07 +0000 (18:19 +0300)
 bidi.c (bidi_cache_shrink): New function.
 (bidi_init_it): Call it.
 (bidi_cache_iterator_state): Enlarge the cache if needed.

src/ChangeLog
src/bidi.c

index 0f3c5673c2afb06dc79ec0417388f7aa79fbbe22..14311049a17c3aaec9e67b963c74b3e63b0acbba 100644 (file)
@@ -1,5 +1,10 @@
 2010-05-14  Eli Zaretskii  <eliz@gnu.org>
 
+       Make the cache of bidi iterator states dynamically allocated.
+       (bidi_cache_shrink): New function.
+       (bidi_init_it): Call it.
+       (bidi_cache_iterator_state): Enlarge the cache if needed.
+
        * bidi.c (bidi_move_to_visually_next): Renamed from
        bidi_get_next_char_visually.  All callers changed.
 
index 4b44699f7b22c051e5efe501a2602b72498ce764..c4cb4c599df33255e648ca58f725f3e9557265a3 100644 (file)
@@ -540,9 +540,11 @@ bidi_copy_it (struct bidi_it *to, struct bidi_it *from)
 
 /* Caching the bidi iterator states.  */
 
-static struct bidi_it bidi_cache[1000]; /* FIXME: make this dynamically allocated! */
-static int bidi_cache_idx;
-static int bidi_cache_last_idx;
+#define BIDI_CACHE_CHUNK 200
+static struct bidi_it *bidi_cache;
+static size_t bidi_cache_size = 0;
+static int bidi_cache_idx;     /* next unused cache slot */
+static int bidi_cache_last_idx;        /* slot of last cache hit */
 
 static INLINE void
 bidi_cache_reset (void)
@@ -551,6 +553,17 @@ bidi_cache_reset (void)
   bidi_cache_last_idx = -1;
 }
 
+static INLINE void
+bidi_cache_shrink (void)
+{
+  if (bidi_cache_size > BIDI_CACHE_CHUNK)
+    {
+      bidi_cache_size = BIDI_CACHE_CHUNK * sizeof (struct bidi_it);
+      bidi_cache = (struct bidi_it *) xrealloc (bidi_cache, bidi_cache_size);
+    }
+  bidi_cache_reset ();
+}
+
 static INLINE void
 bidi_cache_fetch_state (int idx, struct bidi_it *bidi_it)
 {
@@ -672,9 +685,13 @@ bidi_cache_iterator_state (struct bidi_it *bidi_it, int resolved)
   if (idx < 0)
     {
       idx = bidi_cache_idx;
-      /* Don't overrun the cache limit.  */
-      if (idx > sizeof (bidi_cache) / sizeof (bidi_cache[0]) - 1)
-       abort ();
+      /* Enlarge the cache as needed.  */
+      if (idx >= bidi_cache_size)
+       {
+         bidi_cache_size += BIDI_CACHE_CHUNK * sizeof (struct bidi_it);
+         bidi_cache =
+           (struct bidi_it *) xrealloc (bidi_cache, bidi_cache_size);
+       }
       /* Character positions should correspond to cache positions 1:1.
         If we are outside the range of cached positions, the cache is
         useless and must be reset.  */
@@ -990,6 +1007,7 @@ bidi_init_it (EMACS_INT charpos, EMACS_INT bytepos, struct bidi_it *bidi_it)
     bidi_it->prev_for_neutral.type_after_w1 =
     bidi_it->prev_for_neutral.orig_type = UNKNOWN_BT;
   bidi_it->sor = L2R;   /* FIXME: should it be user-selectable? */
+  bidi_cache_shrink ();
 }
 
 /* Push the current embedding level and override status; reset the