summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Frank <flori@ping.de>2009-11-05 22:54:50 +0100
committerFlorian Frank <flori@ping.de>2009-11-05 22:54:50 +0100
commit9e1ae1bd63ca61719a2e86418454b683e8fa17b9 (patch)
tree8e9cfa8f696914b643a48fdba5f8d782439aeecd
parentb6e068308f318f32436a2f4003d6a0d4753a829b (diff)
downloadjson-9e1ae1bd63ca61719a2e86418454b683e8fa17b9.tar.gz
avoid copying from buffer ptr to rstring ptr
-rw-r--r--ext/json/ext/generator/fbuffer.c6
-rw-r--r--ext/json/ext/generator/fbuffer.h2
-rw-r--r--ext/json/ext/generator/generator.c22
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;
}