diff options
| -rw-r--r-- | ext/json/fbuffer/fbuffer.h | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/ext/json/fbuffer/fbuffer.h b/ext/json/fbuffer/fbuffer.h index 55fc0bba9d..9bbfeed3cb 100644 --- a/ext/json/fbuffer/fbuffer.h +++ b/ext/json/fbuffer/fbuffer.h @@ -33,7 +33,7 @@ static void fbuffer_append(FBuffer *fb, const char *newstr, unsigned long len); #ifdef JSON_GENERATOR static void fbuffer_append_long(FBuffer *fb, long number); #endif -static void fbuffer_append_char(FBuffer *fb, char newchr); +static inline void fbuffer_append_char(FBuffer *fb, char newchr); #ifdef JSON_GENERATOR static VALUE fbuffer_to_s(FBuffer *fb); #endif @@ -66,29 +66,34 @@ static void fbuffer_clear(FBuffer *fb) } #endif -static inline void fbuffer_inc_capa(FBuffer *fb, unsigned long requested) +static void fbuffer_do_inc_capa(FBuffer *fb, unsigned long requested) { - if (RB_UNLIKELY(requested > fb->capa - fb->len)) { - unsigned long required; + unsigned long required; - if (RB_UNLIKELY(!fb->ptr)) { - fb->ptr = ALLOC_N(char, fb->initial_length); - fb->capa = fb->initial_length; - } + if (RB_UNLIKELY(!fb->ptr)) { + fb->ptr = ALLOC_N(char, fb->initial_length); + fb->capa = fb->initial_length; + } + + for (required = fb->capa; requested > required - fb->len; required <<= 1); - for (required = fb->capa; requested > required - fb->len; required <<= 1); - - if (required > fb->capa) { - if (fb->type == STACK) { - const char *old_buffer = fb->ptr; - fb->ptr = ALLOC_N(char, required); - fb->type = HEAP; - MEMCPY(fb->ptr, old_buffer, char, fb->len); - } else { - REALLOC_N(fb->ptr, char, required); - } - fb->capa = required; + if (required > fb->capa) { + if (fb->type == STACK) { + const char *old_buffer = fb->ptr; + fb->ptr = ALLOC_N(char, required); + fb->type = HEAP; + MEMCPY(fb->ptr, old_buffer, char, fb->len); + } else { + REALLOC_N(fb->ptr, char, required); } + fb->capa = required; + } +} + +static inline void fbuffer_inc_capa(FBuffer *fb, unsigned long requested) +{ + if (RB_UNLIKELY(requested > fb->capa - fb->len)) { + fbuffer_do_inc_capa(fb, requested); } } @@ -113,7 +118,7 @@ static void fbuffer_append_str(FBuffer *fb, VALUE str) } #endif -static void fbuffer_append_char(FBuffer *fb, char newchr) +static inline void fbuffer_append_char(FBuffer *fb, char newchr) { fbuffer_inc_capa(fb, 1); *(fb->ptr + fb->len) = newchr; |
