summaryrefslogtreecommitdiff
path: root/ext/json
diff options
context:
space:
mode:
-rw-r--r--ext/json/fbuffer/fbuffer.h29
-rw-r--r--ext/json/generator/generator.c3
-rw-r--r--ext/json/generator/generator.h1
-rw-r--r--ext/json/parser/parser.c2
-rw-r--r--ext/json/parser/parser.rl2
5 files changed, 30 insertions, 7 deletions
@@ -4,13 +4,20 @@
#include "ruby.h"
#include "ruby/encoding.h"
typedef struct FBufferStruct {
unsigned long initial_length;
- char *ptr;
unsigned long len;
unsigned long capa;
} FBuffer;
#define FBUFFER_INITIAL_LENGTH_DEFAULT 1024
#define FBUFFER_PTR(fb) ((fb)->ptr)
@@ -35,14 +42,21 @@ static VALUE fbuffer_to_s(FBuffer *fb);
#define RB_UNLIKELY(expr) expr
#endif
-static void fbuffer_init(FBuffer *fb, unsigned long initial_length)
{
fb->initial_length = (initial_length > 0) ? initial_length : FBUFFER_INITIAL_LENGTH_DEFAULT;
}
static void fbuffer_free(FBuffer *fb)
{
- if (fb->ptr) ruby_xfree(fb->ptr);
}
#ifndef JSON_GENERATOR
@@ -65,7 +79,14 @@ static inline void fbuffer_inc_capa(FBuffer *fb, unsigned long requested)
for (required = fb->capa; requested > required - fb->len; required <<= 1);
if (required > fb->capa) {
- REALLOC_N(fb->ptr, char, required);
fb->capa = required;
}
}
@@ -954,8 +954,9 @@ static VALUE cState_partial_generate(VALUE self, VALUE obj, void (*func)(FBuffer
{
GET_STATE(self);
FBuffer buffer = {0};
- fbuffer_init(&buffer, state->buffer_initial_length);
struct generate_json_data data = {
.buffer = &buffer,
@@ -54,6 +54,7 @@ typedef struct JSON_Generator_StateStruct {
JSON_Generator_State *state; \
GET_STATE_TO(self, state)
static VALUE mHash_to_json(int argc, VALUE *argv, VALUE self);
static VALUE mArray_to_json(int argc, VALUE *argv, VALUE self);
#ifdef RUBY_INTEGER_UNIFICATION
@@ -2159,7 +2159,7 @@ static VALUE cJSON_parser_s_allocate(VALUE klass)
{
JSON_Parser *json;
VALUE obj = TypedData_Make_Struct(klass, JSON_Parser, &JSON_Parser_type, json);
- fbuffer_init(&json->fbuffer, 0);
return obj;
}
@@ -919,7 +919,7 @@ static VALUE cJSON_parser_s_allocate(VALUE klass)
{
JSON_Parser *json;
VALUE obj = TypedData_Make_Struct(klass, JSON_Parser, &JSON_Parser_type, json);
- fbuffer_init(&json->fbuffer, 0);
return obj;
}