diff options
author | Florian Frank <flori@ping.de> | 2015-01-02 21:31:20 +0100 |
---|---|---|
committer | Florian Frank <flori@ping.de> | 2015-01-02 21:31:20 +0100 |
commit | cb3656bb25eb37eb02a4d955a6e4c094aecf74f4 (patch) | |
tree | c7426fc85de55662eb02f6cc00c486195242fb30 /ext/json/ext/generator/generator.c | |
parent | 6ae8732ef0e7a59e3457495f150c582301c00c7c (diff) | |
parent | b798187c278beea246b0f709754ebd34eaae074e (diff) | |
download | json-cb3656bb25eb37eb02a4d955a6e4c094aecf74f4.tar.gz |
Merge branch 'ruby-2.2' of https://github.com/zzak/json into zzak-ruby-2.2
Conflicts:
.travis.yml
json.gemspec
json_pure.gemspec
Diffstat (limited to 'ext/json/ext/generator/generator.c')
-rw-r--r-- | ext/json/ext/generator/generator.c | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/ext/json/ext/generator/generator.c b/ext/json/ext/generator/generator.c index 976afc5..f789a89 100644 --- a/ext/json/ext/generator/generator.c +++ b/ext/json/ext/generator/generator.c @@ -486,8 +486,9 @@ static VALUE mObject_to_json(int argc, VALUE *argv, VALUE self) return cState_partial_generate(state, string); } -static void State_free(JSON_Generator_State *state) +static void State_free(void *ptr) { + JSON_Generator_State *state = ptr; if (state->indent) ruby_xfree(state->indent); if (state->space) ruby_xfree(state->space); if (state->space_before) ruby_xfree(state->space_before); @@ -499,7 +500,31 @@ static void State_free(JSON_Generator_State *state) ruby_xfree(state); } -static JSON_Generator_State *State_allocate() +static size_t State_memsize(const void *ptr) +{ + const JSON_Generator_State *state = ptr; + size_t size = sizeof(*state); + if (state->indent) size += state->indent_len + 1; + if (state->space) size += state->space_len + 1; + if (state->space_before) size += state->space_before_len + 1; + if (state->object_nl) size += state->object_nl_len + 1; + if (state->array_nl) size += state->array_nl_len + 1; + if (state->array_delim) size += FBUFFER_CAPA(state->array_delim); + if (state->object_delim) size += FBUFFER_CAPA(state->object_delim); + if (state->object_delim2) size += FBUFFER_CAPA(state->object_delim2); + return size; +} + +static const rb_data_type_t JSON_Generator_State_type = { + "JSON/Generator/State", + {NULL, State_free, State_memsize,}, +#ifdef RUBY_TYPED_FREE_IMMEDIATELY + 0, 0, + RUBY_TYPED_FREE_IMMEDIATELY, +#endif +}; + +static JSON_Generator_State *State_allocate(void) { JSON_Generator_State *state = ALLOC(JSON_Generator_State); MEMZERO(state, JSON_Generator_State, 1); @@ -509,7 +534,7 @@ static JSON_Generator_State *State_allocate() static VALUE cState_s_allocate(VALUE klass) { JSON_Generator_State *state = State_allocate(); - return Data_Wrap_Struct(klass, NULL, State_free, state); + return TypedData_Wrap_Struct(klass, &JSON_Generator_State_type, state); } /* @@ -812,10 +837,10 @@ static void generate_json_float(FBuffer *buffer, VALUE Vstate, JSON_Generator_St if (!allow_nan) { if (isinf(value)) { fbuffer_free(buffer); - rb_raise(eGeneratorError, "%u: %s not allowed in JSON", __LINE__, StringValueCStr(tmp)); + rb_raise(eGeneratorError, "%u: %"PRIsVALUE" not allowed in JSON", __LINE__, RB_OBJ_STRING(tmp)); } else if (isnan(value)) { fbuffer_free(buffer); - rb_raise(eGeneratorError, "%u: %s not allowed in JSON", __LINE__, StringValueCStr(tmp)); + rb_raise(eGeneratorError, "%u: %"PRIsVALUE" not allowed in JSON", __LINE__, RB_OBJ_STRING(tmp)); } } fbuffer_append_str(buffer, tmp); @@ -965,8 +990,9 @@ static VALUE cState_init_copy(VALUE obj, VALUE orig) { JSON_Generator_State *objState, *origState; - Data_Get_Struct(obj, JSON_Generator_State, objState); - Data_Get_Struct(orig, JSON_Generator_State, origState); + if (obj == orig) return obj; + GET_STATE_TO(obj, objState); + GET_STATE_TO(orig, origState); if (!objState) rb_raise(rb_eArgError, "unallocated JSON::State"); MEMCPY(objState, origState, JSON_Generator_State, 1); @@ -1326,7 +1352,7 @@ static VALUE cState_buffer_initial_length_set(VALUE self, VALUE buffer_initial_l /* * */ -void Init_generator() +void Init_generator(void) { rb_require("json/common"); |