From bdfc2e29420d360eebf9dd1cf23668750bb8c8e8 Mon Sep 17 00:00:00 2001 From: nobu Date: Sat, 4 Oct 2014 23:33:09 +0000 Subject: json/generator: typed data * ext/json/generator/generator.c (JSON_Generator_State_type): turn into typed data. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47797 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/json/generator/generator.c | 34 ++++++++++++++++++++++++++++------ ext/json/generator/generator.h | 10 +++++++--- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c index b9f10171c8..906e902593 100644 --- a/ext/json/generator/generator.c +++ b/ext/json/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,17 +500,38 @@ static void State_free(JSON_Generator_State *state) ruby_xfree(state); } +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,}, + NULL, NULL, + RUBY_TYPED_FREE_IMMEDIATELY, +}; + static JSON_Generator_State *State_allocate(void) { - JSON_Generator_State *state = ALLOC(JSON_Generator_State); - MEMZERO(state, JSON_Generator_State, 1); + JSON_Generator_State *state = ZALLOC(JSON_Generator_State); return state; } 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); } /* @@ -966,8 +988,8 @@ static VALUE cState_init_copy(VALUE obj, VALUE orig) JSON_Generator_State *objState, *origState; if (obj == orig) return obj; - Data_Get_Struct(obj, JSON_Generator_State, objState); - Data_Get_Struct(orig, JSON_Generator_State, origState); + 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); diff --git a/ext/json/generator/generator.h b/ext/json/generator/generator.h index db885d48aa..ddd1aa8a30 100644 --- a/ext/json/generator/generator.h +++ b/ext/json/generator/generator.h @@ -78,9 +78,12 @@ typedef struct JSON_Generator_StateStruct { long buffer_initial_length; } JSON_Generator_State; +#define GET_STATE_TO(self, state) \ + TypedData_Get_Struct(self, JSON_Generator_State, &JSON_Generator_State_type, state) + #define GET_STATE(self) \ JSON_Generator_State *state; \ - Data_Get_Struct(self, JSON_Generator_State, state) + GET_STATE_TO(self, state) #define GENERATE_JSON(type) \ FBuffer *buffer; \ @@ -89,7 +92,7 @@ typedef struct JSON_Generator_StateStruct { \ rb_scan_args(argc, argv, "01", &Vstate); \ Vstate = cState_from_state_s(cState, Vstate); \ - Data_Get_Struct(Vstate, JSON_Generator_State, state); \ + TypedData_Get_Struct(Vstate, JSON_Generator_State, &JSON_Generator_State_type, state); \ buffer = cState_prepare_buffer(Vstate); \ generate_json_##type(buffer, Vstate, state, self); \ return fbuffer_to_s(buffer) @@ -108,7 +111,7 @@ static VALUE mTrueClass_to_json(int argc, VALUE *argv, VALUE self); static VALUE mFalseClass_to_json(int argc, VALUE *argv, VALUE self); static VALUE mNilClass_to_json(int argc, VALUE *argv, VALUE self); static VALUE mObject_to_json(int argc, VALUE *argv, VALUE self); -static void State_free(JSON_Generator_State *state); +static void State_free(void *state); static JSON_Generator_State *State_allocate(void); static VALUE cState_s_allocate(VALUE klass); static VALUE cState_configure(VALUE self, VALUE opts); @@ -144,5 +147,6 @@ static VALUE cState_ascii_only_p(VALUE self); static VALUE cState_depth(VALUE self); static VALUE cState_depth_set(VALUE self, VALUE depth); static FBuffer *cState_prepare_buffer(VALUE self); +static const rb_data_type_t JSON_Generator_State_type; #endif -- cgit v1.2.3