From 2fe72643a04d063444b0eba90d77e15fcf6d751f Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 14 May 2010 18:19:07 +0300 Subject: [PATCH] Make the cache of bidi iterator states dynamically allocated. bidi.c (bidi_cache_shrink): New function. (bidi_init_it): Call it. (bidi_cache_iterator_state): Enlarge the cache if needed. --- src/ChangeLog | 5 +++++ src/bidi.c | 30 ++++++++++++++++++++++++------ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 0f3c5673c2a..14311049a17 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,10 @@ 2010-05-14 Eli Zaretskii + 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. diff --git a/src/bidi.c b/src/bidi.c index 4b44699f7b2..c4cb4c599df 100644 --- a/src/bidi.c +++ b/src/bidi.c @@ -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 -- 2.39.2