diff options
author | Florian Frank <flori@ping.de> | 2009-11-05 22:54:50 +0100 |
---|---|---|
committer | Florian Frank <flori@ping.de> | 2009-11-05 22:54:50 +0100 |
commit | 9e1ae1bd63ca61719a2e86418454b683e8fa17b9 (patch) | |
tree | 8e9cfa8f696914b643a48fdba5f8d782439aeecd | |
parent | b6e068308f318f32436a2f4003d6a0d4753a829b (diff) | |
download | json-9e1ae1bd63ca61719a2e86418454b683e8fa17b9.tar.gz |
avoid copying from buffer ptr to rstring ptr
-rw-r--r-- | ext/json/ext/generator/fbuffer.c | 6 | ||||
-rw-r--r-- | ext/json/ext/generator/fbuffer.h | 2 | ||||
-rw-r--r-- | ext/json/ext/generator/generator.c | 22 |
3 files changed, 25 insertions, 5 deletions
diff --git a/ext/json/ext/generator/fbuffer.c b/ext/json/ext/generator/fbuffer.c index 66d4b61..da3e41e 100644 --- a/ext/json/ext/generator/fbuffer.c +++ b/ext/json/ext/generator/fbuffer.c @@ -14,6 +14,12 @@ inline void fbuffer_free(FBuffer *fb) ruby_xfree(fb); } +inline void fbuffer_free_only_buffer(FBuffer *fb) +{ + ruby_xfree(fb); +} + + inline void fbuffer_clear(FBuffer *fb) { fb->len = 0; diff --git a/ext/json/ext/generator/fbuffer.h b/ext/json/ext/generator/fbuffer.h index 3b42721..1a4d272 100644 --- a/ext/json/ext/generator/fbuffer.h +++ b/ext/json/ext/generator/fbuffer.h @@ -11,10 +11,12 @@ typedef struct FBufferStruct { #define FBUFFER_PTR(fb) (fb->ptr) #define FBUFFER_LEN(fb) (fb->len) +#define FBUFFER_CAPA(fb) (fb->capa) #define FBUFFER_PAIR(fb) FBUFFER_PTR(fb), FBUFFER_LEN(fb) inline FBuffer *fbuffer_alloc(); inline void fbuffer_free(FBuffer *fb); +inline void fbuffer_free_only_buffer(FBuffer *fb); inline void fbuffer_clear(FBuffer *fb); inline void fbuffer_inc_capa(FBuffer *fb, unsigned int requested); inline void fbuffer_append(FBuffer *fb, const char *newstr, unsigned int len); diff --git a/ext/json/ext/generator/generator.c b/ext/json/ext/generator/generator.c index 4d017f0..9b41652 100644 --- a/ext/json/ext/generator/generator.c +++ b/ext/json/ext/generator/generator.c @@ -374,6 +374,18 @@ static VALUE cState_to_h(VALUE self) return result; } +inline static VALUE fbuffer2rstring(FBuffer *buffer) +{ + NEWOBJ(str, struct RString); + OBJSETUP(str, rb_cString, T_STRING); + + str->ptr = FBUFFER_PTR(buffer); + str->len = FBUFFER_LEN(buffer); + str->aux.capa = FBUFFER_CAPA(buffer); + + return (VALUE) str; +} + void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj, long depth) { VALUE tmp; @@ -391,12 +403,12 @@ void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, V long max_nesting = state->max_nesting; int i, j; FBuffer *delim, *delim2; - if (delim = state->delim) { + if ((delim = state->delim)) { fbuffer_clear(delim); } else { delim = state->delim = fbuffer_alloc(); } - if (delim2 = state->delim2) { + if ((delim2 = state->delim2)) { fbuffer_clear(delim2); } else { delim2 = state->delim2 = fbuffer_alloc(); @@ -452,7 +464,7 @@ void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, V long max_nesting = state->max_nesting; int i, j; FBuffer *delim; - if (delim = state->delim) { + if ((delim = state->delim)) { fbuffer_clear(delim); } else { delim = state->delim = fbuffer_alloc(); @@ -554,8 +566,8 @@ inline static VALUE cState_partial_generate(VALUE self, VALUE obj, VALUE depth) FBuffer *buffer = fbuffer_alloc(); GET_STATE(self); generate_json(buffer, self, state, obj, NIL_P(depth) ? 0 : FIX2INT(depth)); - result = rb_str_new(FBUFFER_PAIR(buffer)); - fbuffer_free(buffer); + result = fbuffer2rstring(buffer); + fbuffer_free_only_buffer(buffer); FORCE_UTF8(result); return result; } |