diff options
-rw-r--r-- | ext/json/fbuffer/fbuffer.h | 51 |
1 files changed, 37 insertions, 14 deletions
@@ -4,9 +4,40 @@ #include "ruby.h" #include "ruby/encoding.h" enum fbuffer_type { - HEAP = 0, - STACK = 1, }; typedef struct FBufferStruct { @@ -38,19 +69,11 @@ static inline void fbuffer_append_char(FBuffer *fb, char newchr); static VALUE fbuffer_to_s(FBuffer *fb); #endif -#ifndef RB_UNLIKELY -#define RB_UNLIKELY(expr) expr -#endif - -#ifndef RB_LIKELY -#define RB_LIKELY(expr) expr -#endif - static void fbuffer_stack_init(FBuffer *fb, unsigned long initial_length, char *stack_buffer, long stack_buffer_size) { fb->initial_length = (initial_length > 0) ? initial_length : FBUFFER_INITIAL_LENGTH_DEFAULT; if (stack_buffer) { - fb->type = STACK; fb->ptr = stack_buffer; fb->capa = stack_buffer_size; } @@ -58,7 +81,7 @@ static void fbuffer_stack_init(FBuffer *fb, unsigned long initial_length, char * static void fbuffer_free(FBuffer *fb) { - if (fb->ptr && fb->type == HEAP) { ruby_xfree(fb->ptr); } } @@ -82,10 +105,10 @@ static void fbuffer_do_inc_capa(FBuffer *fb, unsigned long requested) 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); |