json 1.6.1 → 1.6.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of json might be problematic. Click here for more details.
- data/.gitignore +8 -0
- data/.travis.yml +15 -0
- data/CHANGES +10 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -2
- data/VERSION +1 -1
- data/benchmarks/data-p4-3GHz-ruby18/.keep +0 -0
- data/benchmarks/data/.keep +0 -0
- data/benchmarks/generator2_benchmark.rb +1 -1
- data/benchmarks/generator_benchmark.rb +1 -1
- data/benchmarks/parser2_benchmark.rb +1 -1
- data/benchmarks/parser_benchmark.rb +1 -1
- data/diagrams/.keep +0 -0
- data/ext/json/ext/fbuffer/fbuffer.h +156 -0
- data/ext/json/ext/generator/extconf.rb +0 -7
- data/ext/json/ext/generator/generator.c +57 -132
- data/ext/json/ext/generator/generator.h +4 -43
- data/ext/json/ext/parser/extconf.rb +0 -3
- data/ext/json/ext/parser/parser.c +94 -87
- data/ext/json/ext/parser/parser.h +2 -7
- data/ext/json/ext/parser/parser.rl +12 -2
- data/java/src/json/ext/GeneratorState.java +21 -0
- data/json.gemspec +16 -16
- data/json_pure.gemspec +15 -15
- data/lib/json/add/bigdecimal.rb +21 -0
- data/lib/json/add/ostruct.rb +31 -0
- data/lib/json/add/time.rb +2 -2
- data/lib/json/common.rb +39 -5
- data/lib/json/ext.rb +6 -0
- data/lib/json/ext/.keep +0 -0
- data/lib/json/pure.rb +6 -0
- data/lib/json/pure/generator.rb +20 -9
- data/lib/json/pure/parser.rb +7 -2
- data/lib/json/version.rb +1 -1
- data/tests/test_json.rb +16 -1
- data/tests/test_json_addition.rb +15 -1
- data/tests/test_json_generate.rb +66 -30
- metadata +142 -133
data/.gitignore
ADDED
data/.travis.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# Passes arguments to bundle install (http://gembundler.com/man/bundle-install.1.html)
|
2
|
+
bundler_args: --binstubs
|
3
|
+
|
4
|
+
# Specify which ruby versions you wish to run your tests on, each version will be used
|
5
|
+
rvm:
|
6
|
+
- 1.8.7
|
7
|
+
- 1.9.2
|
8
|
+
- 1.9.3
|
9
|
+
- rbx
|
10
|
+
- rbx-2.0
|
11
|
+
- ree
|
12
|
+
- jruby
|
13
|
+
- ruby-head
|
14
|
+
|
15
|
+
script: "bundle exec rake"
|
data/CHANGES
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
2011-11-21 (1.6.2)
|
2
|
+
* Add support for OpenStruct and BigDecimal.
|
3
|
+
* Fix bug when parsing nil in quirks_mode.
|
4
|
+
* Make JSON.dump and JSON.load methods better cooperate with Rails' serialize
|
5
|
+
method. Just use: serialize :value, JSON
|
6
|
+
* Fix bug with time serialization concerning nanoseconds. Thanks for the
|
7
|
+
patch go to Josh Partlow (jpartlow@github).
|
8
|
+
* Improve parsing speed for JSON numbers (integers and floats) in a similar way to
|
9
|
+
what Evan Phoenix <evan@phx.io> suggested in:
|
10
|
+
https://github.com/flori/json/pull/103
|
1
11
|
2011-09-18 (1.6.1)
|
2
12
|
* Using -target 1.5 to force Java bits to compile with 1.5.
|
3
13
|
2011-09-12 (1.6.0)
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -22,14 +22,13 @@ MAKE = ENV['MAKE'] || %w[gmake make].find { |c| system(c, '-v') }
|
|
22
22
|
PKG_NAME = 'json'
|
23
23
|
PKG_TITLE = 'JSON Implementation for Ruby'
|
24
24
|
PKG_VERSION = File.read('VERSION').chomp
|
25
|
-
PKG_FILES = FileList[
|
25
|
+
PKG_FILES = FileList[`git ls-files`.split(/\n/)]
|
26
26
|
|
27
27
|
EXT_ROOT_DIR = 'ext/json/ext'
|
28
28
|
EXT_PARSER_DIR = "#{EXT_ROOT_DIR}/parser"
|
29
29
|
EXT_PARSER_DL = "#{EXT_PARSER_DIR}/parser.#{CONFIG['DLEXT']}"
|
30
30
|
RAGEL_PATH = "#{EXT_PARSER_DIR}/parser.rl"
|
31
31
|
EXT_PARSER_SRC = "#{EXT_PARSER_DIR}/parser.c"
|
32
|
-
PKG_FILES << EXT_PARSER_SRC
|
33
32
|
EXT_GENERATOR_DIR = "#{EXT_ROOT_DIR}/generator"
|
34
33
|
EXT_GENERATOR_DL = "#{EXT_GENERATOR_DIR}/generator.#{CONFIG['DLEXT']}"
|
35
34
|
EXT_GENERATOR_SRC = "#{EXT_GENERATOR_DIR}/generator.c"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.6.
|
1
|
+
1.6.2
|
File without changes
|
File without changes
|
@@ -199,7 +199,7 @@ if $0 == __FILE__
|
|
199
199
|
system "#{RAKE_PATH} clean"
|
200
200
|
system "#{RUBY_PATH} #$0 rails"
|
201
201
|
system "#{RUBY_PATH} #$0 pure"
|
202
|
-
system "#{RAKE_PATH}
|
202
|
+
system "#{RAKE_PATH} compile"
|
203
203
|
system "#{RUBY_PATH} #$0 ext"
|
204
204
|
system "#{RUBY_PATH} #$0 yajl"
|
205
205
|
Bullshit.compare do
|
@@ -201,7 +201,7 @@ if $0 == __FILE__
|
|
201
201
|
system "#{RAKE_PATH} clean"
|
202
202
|
system "#{RUBY_PATH} #$0 rails"
|
203
203
|
system "#{RUBY_PATH} #$0 pure"
|
204
|
-
system "#{RAKE_PATH}
|
204
|
+
system "#{RAKE_PATH} compile"
|
205
205
|
system "#{RUBY_PATH} #$0 ext"
|
206
206
|
system "#{RUBY_PATH} #$0 yajl"
|
207
207
|
Bullshit.compare do
|
@@ -233,7 +233,7 @@ if $0 == __FILE__
|
|
233
233
|
system "#{RUBY_PATH} #$0 yaml"
|
234
234
|
system "#{RUBY_PATH} #$0 rails"
|
235
235
|
system "#{RUBY_PATH} #$0 pure"
|
236
|
-
system "#{RAKE_PATH}
|
236
|
+
system "#{RAKE_PATH} compile"
|
237
237
|
system "#{RUBY_PATH} #$0 ext"
|
238
238
|
system "#{RUBY_PATH} #$0 yajl"
|
239
239
|
Bullshit.compare do
|
@@ -241,7 +241,7 @@ if $0 == __FILE__
|
|
241
241
|
system "#{RUBY_PATH} #$0 yaml"
|
242
242
|
system "#{RUBY_PATH} #$0 rails"
|
243
243
|
system "#{RUBY_PATH} #$0 pure"
|
244
|
-
system "#{RAKE_PATH}
|
244
|
+
system "#{RAKE_PATH} compile"
|
245
245
|
system "#{RUBY_PATH} #$0 ext"
|
246
246
|
system "#{RUBY_PATH} #$0 yajl"
|
247
247
|
Bullshit.compare do
|
data/diagrams/.keep
ADDED
File without changes
|
@@ -0,0 +1,156 @@
|
|
1
|
+
|
2
|
+
#ifndef _FBUFFER_H_
|
3
|
+
#define _FBUFFER_H_
|
4
|
+
|
5
|
+
#include <assert.h>
|
6
|
+
#include "ruby.h"
|
7
|
+
|
8
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
9
|
+
#include "ruby/encoding.h"
|
10
|
+
#define FORCE_UTF8(obj) rb_enc_associate((obj), rb_utf8_encoding())
|
11
|
+
#else
|
12
|
+
#define FORCE_UTF8(obj)
|
13
|
+
#endif
|
14
|
+
|
15
|
+
/* We don't need to guard objects for rbx, so let's do nothing at all. */
|
16
|
+
#ifndef RB_GC_GUARD
|
17
|
+
#define RB_GC_GUARD(object)
|
18
|
+
#endif
|
19
|
+
|
20
|
+
typedef struct FBufferStruct {
|
21
|
+
unsigned long initial_length;
|
22
|
+
char *ptr;
|
23
|
+
unsigned long len;
|
24
|
+
unsigned long capa;
|
25
|
+
} FBuffer;
|
26
|
+
|
27
|
+
#define FBUFFER_INITIAL_LENGTH_DEFAULT 1024
|
28
|
+
|
29
|
+
#define FBUFFER_PTR(fb) (fb->ptr)
|
30
|
+
#define FBUFFER_LEN(fb) (fb->len)
|
31
|
+
#define FBUFFER_CAPA(fb) (fb->capa)
|
32
|
+
#define FBUFFER_PAIR(fb) FBUFFER_PTR(fb), FBUFFER_LEN(fb)
|
33
|
+
|
34
|
+
static FBuffer *fbuffer_alloc(unsigned long initial_length);
|
35
|
+
static void fbuffer_free(FBuffer *fb);
|
36
|
+
static void fbuffer_clear(FBuffer *fb);
|
37
|
+
static void fbuffer_append(FBuffer *fb, const char *newstr, unsigned long len);
|
38
|
+
static void fbuffer_append_long(FBuffer *fb, long number);
|
39
|
+
static void fbuffer_append_char(FBuffer *fb, char newchr);
|
40
|
+
static FBuffer *fbuffer_dup(FBuffer *fb);
|
41
|
+
static VALUE fbuffer_to_s(FBuffer *fb);
|
42
|
+
|
43
|
+
static FBuffer *fbuffer_alloc(unsigned long initial_length)
|
44
|
+
{
|
45
|
+
FBuffer *fb;
|
46
|
+
if (initial_length <= 0) initial_length = FBUFFER_INITIAL_LENGTH_DEFAULT;
|
47
|
+
fb = ALLOC(FBuffer);
|
48
|
+
memset((void *) fb, 0, sizeof(FBuffer));
|
49
|
+
fb->initial_length = initial_length;
|
50
|
+
return fb;
|
51
|
+
}
|
52
|
+
|
53
|
+
static void fbuffer_free(FBuffer *fb)
|
54
|
+
{
|
55
|
+
if (fb->ptr) ruby_xfree(fb->ptr);
|
56
|
+
ruby_xfree(fb);
|
57
|
+
}
|
58
|
+
|
59
|
+
static void fbuffer_clear(FBuffer *fb)
|
60
|
+
{
|
61
|
+
fb->len = 0;
|
62
|
+
}
|
63
|
+
|
64
|
+
static void fbuffer_inc_capa(FBuffer *fb, unsigned long requested)
|
65
|
+
{
|
66
|
+
unsigned long required;
|
67
|
+
|
68
|
+
if (!fb->ptr) {
|
69
|
+
fb->ptr = ALLOC_N(char, fb->initial_length);
|
70
|
+
fb->capa = fb->initial_length;
|
71
|
+
}
|
72
|
+
|
73
|
+
for (required = fb->capa; requested > required - fb->len; required <<= 1);
|
74
|
+
|
75
|
+
if (required > fb->capa) {
|
76
|
+
REALLOC_N(fb->ptr, char, required);
|
77
|
+
fb->capa = required;
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
81
|
+
static void fbuffer_append(FBuffer *fb, const char *newstr, unsigned long len)
|
82
|
+
{
|
83
|
+
if (len > 0) {
|
84
|
+
fbuffer_inc_capa(fb, len);
|
85
|
+
MEMCPY(fb->ptr + fb->len, newstr, char, len);
|
86
|
+
fb->len += len;
|
87
|
+
}
|
88
|
+
}
|
89
|
+
|
90
|
+
static void fbuffer_append_str(FBuffer *fb, VALUE str)
|
91
|
+
{
|
92
|
+
const char *newstr = StringValuePtr(str);
|
93
|
+
unsigned long len = RSTRING_LEN(str);
|
94
|
+
|
95
|
+
RB_GC_GUARD(str);
|
96
|
+
|
97
|
+
fbuffer_append(fb, newstr, len);
|
98
|
+
}
|
99
|
+
|
100
|
+
static void fbuffer_append_char(FBuffer *fb, char newchr)
|
101
|
+
{
|
102
|
+
fbuffer_inc_capa(fb, 1);
|
103
|
+
*(fb->ptr + fb->len) = newchr;
|
104
|
+
fb->len++;
|
105
|
+
}
|
106
|
+
|
107
|
+
static void freverse(char *start, char *end)
|
108
|
+
{
|
109
|
+
char c;
|
110
|
+
|
111
|
+
while (end > start) {
|
112
|
+
c = *end, *end-- = *start, *start++ = c;
|
113
|
+
}
|
114
|
+
}
|
115
|
+
|
116
|
+
static long fltoa(long number, char *buf)
|
117
|
+
{
|
118
|
+
static char digits[] = "0123456789";
|
119
|
+
long sign = number;
|
120
|
+
char* tmp = buf;
|
121
|
+
|
122
|
+
if (sign < 0) number = -number;
|
123
|
+
do *tmp++ = digits[number % 10]; while (number /= 10);
|
124
|
+
if (sign < 0) *tmp++ = '-';
|
125
|
+
freverse(buf, tmp - 1);
|
126
|
+
return tmp - buf;
|
127
|
+
}
|
128
|
+
|
129
|
+
static void fbuffer_append_long(FBuffer *fb, long number)
|
130
|
+
{
|
131
|
+
char buf[20];
|
132
|
+
unsigned long len = fltoa(number, buf);
|
133
|
+
fbuffer_append(fb, buf, len);
|
134
|
+
}
|
135
|
+
|
136
|
+
static FBuffer *fbuffer_dup(FBuffer *fb)
|
137
|
+
{
|
138
|
+
unsigned long len = fb->len;
|
139
|
+
FBuffer *result;
|
140
|
+
|
141
|
+
assert(len > 0);
|
142
|
+
if (len > 0) {
|
143
|
+
result = fbuffer_alloc(len);
|
144
|
+
fbuffer_append(result, FBUFFER_PAIR(fb));
|
145
|
+
}
|
146
|
+
return result;
|
147
|
+
}
|
148
|
+
|
149
|
+
static VALUE fbuffer_to_s(FBuffer *fb)
|
150
|
+
{
|
151
|
+
VALUE result = rb_str_new(FBUFFER_PAIR(fb));
|
152
|
+
fbuffer_free(fb);
|
153
|
+
FORCE_UTF8(result);
|
154
|
+
return result;
|
155
|
+
}
|
156
|
+
#endif
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'mkmf'
|
2
|
-
require 'rbconfig'
|
3
2
|
|
4
3
|
unless $CFLAGS.gsub!(/ -O[\dsz]?/, ' -O3')
|
5
4
|
$CFLAGS << ' -O3'
|
@@ -11,10 +10,4 @@ if CONFIG['CC'] =~ /gcc/
|
|
11
10
|
#end
|
12
11
|
end
|
13
12
|
|
14
|
-
if RUBY_VERSION < "1.9"
|
15
|
-
have_header("re.h")
|
16
|
-
else
|
17
|
-
have_header("ruby/re.h")
|
18
|
-
have_header("ruby/encoding.h")
|
19
|
-
end
|
20
13
|
create_makefile 'json/ext/generator'
|
@@ -1,3 +1,4 @@
|
|
1
|
+
#include "../fbuffer/fbuffer.h"
|
1
2
|
#include "generator.h"
|
2
3
|
|
3
4
|
#ifdef HAVE_RUBY_ENCODING_H
|
@@ -14,7 +15,8 @@ static VALUE mJSON, mExt, mGenerator, cState, mGeneratorMethods, mObject,
|
|
14
15
|
static ID i_to_s, i_to_json, i_new, i_indent, i_space, i_space_before,
|
15
16
|
i_object_nl, i_array_nl, i_max_nesting, i_allow_nan, i_ascii_only,
|
16
17
|
i_quirks_mode, i_pack, i_unpack, i_create_id, i_extend, i_key_p,
|
17
|
-
i_aref, i_send, i_respond_to_p, i_match, i_keys, i_depth,
|
18
|
+
i_aref, i_send, i_respond_to_p, i_match, i_keys, i_depth,
|
19
|
+
i_buffer_initial_length, i_dup;
|
18
20
|
|
19
21
|
/*
|
20
22
|
* Copyright 2001-2004 Unicode, Inc.
|
@@ -112,7 +114,7 @@ static void unicode_escape(char *buf, UTF16 character)
|
|
112
114
|
}
|
113
115
|
|
114
116
|
/* Escapes the UTF16 character and stores the result in the buffer buf, then
|
115
|
-
* the buffer buf
|
117
|
+
* the buffer buf is appended to the FBuffer buffer. */
|
116
118
|
static void unicode_escape_to_buffer(FBuffer *buffer, char buf[6], UTF16
|
117
119
|
character)
|
118
120
|
{
|
@@ -292,123 +294,6 @@ static char *fstrndup(const char *ptr, unsigned long len) {
|
|
292
294
|
return result;
|
293
295
|
}
|
294
296
|
|
295
|
-
/* fbuffer implementation */
|
296
|
-
|
297
|
-
static FBuffer *fbuffer_alloc()
|
298
|
-
{
|
299
|
-
FBuffer *fb = ALLOC(FBuffer);
|
300
|
-
memset((void *) fb, 0, sizeof(FBuffer));
|
301
|
-
fb->initial_length = FBUFFER_INITIAL_LENGTH;
|
302
|
-
return fb;
|
303
|
-
}
|
304
|
-
|
305
|
-
static FBuffer *fbuffer_alloc_with_length(unsigned long initial_length)
|
306
|
-
{
|
307
|
-
FBuffer *fb;
|
308
|
-
assert(initial_length > 0);
|
309
|
-
fb = ALLOC(FBuffer);
|
310
|
-
memset((void *) fb, 0, sizeof(FBuffer));
|
311
|
-
fb->initial_length = initial_length;
|
312
|
-
return fb;
|
313
|
-
}
|
314
|
-
|
315
|
-
static void fbuffer_free(FBuffer *fb)
|
316
|
-
{
|
317
|
-
if (fb->ptr) ruby_xfree(fb->ptr);
|
318
|
-
ruby_xfree(fb);
|
319
|
-
}
|
320
|
-
|
321
|
-
static void fbuffer_clear(FBuffer *fb)
|
322
|
-
{
|
323
|
-
fb->len = 0;
|
324
|
-
}
|
325
|
-
|
326
|
-
static void fbuffer_inc_capa(FBuffer *fb, unsigned long requested)
|
327
|
-
{
|
328
|
-
unsigned long required;
|
329
|
-
|
330
|
-
if (!fb->ptr) {
|
331
|
-
fb->ptr = ALLOC_N(char, fb->initial_length);
|
332
|
-
fb->capa = fb->initial_length;
|
333
|
-
}
|
334
|
-
|
335
|
-
for (required = fb->capa; requested > required - fb->len; required <<= 1);
|
336
|
-
|
337
|
-
if (required > fb->capa) {
|
338
|
-
REALLOC_N(fb->ptr, char, required);
|
339
|
-
fb->capa = required;
|
340
|
-
}
|
341
|
-
}
|
342
|
-
|
343
|
-
static void fbuffer_append(FBuffer *fb, const char *newstr, unsigned long len)
|
344
|
-
{
|
345
|
-
if (len > 0) {
|
346
|
-
fbuffer_inc_capa(fb, len);
|
347
|
-
MEMCPY(fb->ptr + fb->len, newstr, char, len);
|
348
|
-
fb->len += len;
|
349
|
-
}
|
350
|
-
}
|
351
|
-
|
352
|
-
static void fbuffer_append_str(FBuffer *fb, VALUE str)
|
353
|
-
{
|
354
|
-
const char *newstr = StringValuePtr(str);
|
355
|
-
unsigned long len = RSTRING_LEN(str);
|
356
|
-
|
357
|
-
RB_GC_GUARD(str);
|
358
|
-
|
359
|
-
fbuffer_append(fb, newstr, len);
|
360
|
-
}
|
361
|
-
|
362
|
-
static void fbuffer_append_char(FBuffer *fb, char newchr)
|
363
|
-
{
|
364
|
-
fbuffer_inc_capa(fb, 1);
|
365
|
-
*(fb->ptr + fb->len) = newchr;
|
366
|
-
fb->len++;
|
367
|
-
}
|
368
|
-
|
369
|
-
static void freverse(char *start, char *end)
|
370
|
-
{
|
371
|
-
char c;
|
372
|
-
|
373
|
-
while (end > start) {
|
374
|
-
c = *end, *end-- = *start, *start++ = c;
|
375
|
-
}
|
376
|
-
}
|
377
|
-
|
378
|
-
static long fltoa(long number, char *buf)
|
379
|
-
{
|
380
|
-
static char digits[] = "0123456789";
|
381
|
-
long sign = number;
|
382
|
-
char* tmp = buf;
|
383
|
-
|
384
|
-
if (sign < 0) number = -number;
|
385
|
-
do *tmp++ = digits[number % 10]; while (number /= 10);
|
386
|
-
if (sign < 0) *tmp++ = '-';
|
387
|
-
freverse(buf, tmp - 1);
|
388
|
-
return tmp - buf;
|
389
|
-
}
|
390
|
-
|
391
|
-
static void fbuffer_append_long(FBuffer *fb, long number)
|
392
|
-
{
|
393
|
-
char buf[20];
|
394
|
-
unsigned long len = fltoa(number, buf);
|
395
|
-
fbuffer_append(fb, buf, len);
|
396
|
-
}
|
397
|
-
|
398
|
-
static FBuffer *fbuffer_dup(FBuffer *fb)
|
399
|
-
{
|
400
|
-
unsigned long len = fb->len;
|
401
|
-
FBuffer *result;
|
402
|
-
|
403
|
-
if (len > 0) {
|
404
|
-
result = fbuffer_alloc_with_length(len);
|
405
|
-
fbuffer_append(result, FBUFFER_PAIR(fb));
|
406
|
-
} else {
|
407
|
-
result = fbuffer_alloc();
|
408
|
-
}
|
409
|
-
return result;
|
410
|
-
}
|
411
|
-
|
412
297
|
/*
|
413
298
|
* Document-module: JSON::Ext::Generator
|
414
299
|
*
|
@@ -694,6 +579,16 @@ static VALUE cState_configure(VALUE self, VALUE opts)
|
|
694
579
|
state->depth = 0;
|
695
580
|
}
|
696
581
|
}
|
582
|
+
tmp = ID2SYM(i_buffer_initial_length);
|
583
|
+
if (option_given_p(opts, tmp)) {
|
584
|
+
VALUE buffer_initial_length = rb_hash_aref(opts, tmp);
|
585
|
+
if (RTEST(buffer_initial_length)) {
|
586
|
+
long initial_length;
|
587
|
+
Check_Type(buffer_initial_length, T_FIXNUM);
|
588
|
+
initial_length = FIX2LONG(buffer_initial_length);
|
589
|
+
if (initial_length > 0) state->buffer_initial_length = initial_length;
|
590
|
+
}
|
591
|
+
}
|
697
592
|
tmp = rb_hash_aref(opts, ID2SYM(i_allow_nan));
|
698
593
|
state->allow_nan = RTEST(tmp);
|
699
594
|
tmp = rb_hash_aref(opts, ID2SYM(i_ascii_only));
|
@@ -723,6 +618,7 @@ static VALUE cState_to_h(VALUE self)
|
|
723
618
|
rb_hash_aset(result, ID2SYM(i_quirks_mode), state->quirks_mode ? Qtrue : Qfalse);
|
724
619
|
rb_hash_aset(result, ID2SYM(i_max_nesting), LONG2FIX(state->max_nesting));
|
725
620
|
rb_hash_aset(result, ID2SYM(i_depth), LONG2FIX(state->depth));
|
621
|
+
rb_hash_aset(result, ID2SYM(i_buffer_initial_length), LONG2FIX(state->buffer_initial_length));
|
726
622
|
return result;
|
727
623
|
}
|
728
624
|
|
@@ -920,19 +816,20 @@ static void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *s
|
|
920
816
|
|
921
817
|
static FBuffer *cState_prepare_buffer(VALUE self)
|
922
818
|
{
|
923
|
-
FBuffer *buffer
|
819
|
+
FBuffer *buffer;
|
924
820
|
GET_STATE(self);
|
821
|
+
buffer = fbuffer_alloc(state->buffer_initial_length);
|
925
822
|
|
926
823
|
if (state->object_delim) {
|
927
824
|
fbuffer_clear(state->object_delim);
|
928
825
|
} else {
|
929
|
-
state->object_delim =
|
826
|
+
state->object_delim = fbuffer_alloc(16);
|
930
827
|
}
|
931
828
|
fbuffer_append_char(state->object_delim, ',');
|
932
829
|
if (state->object_delim2) {
|
933
830
|
fbuffer_clear(state->object_delim2);
|
934
831
|
} else {
|
935
|
-
state->object_delim2 =
|
832
|
+
state->object_delim2 = fbuffer_alloc(16);
|
936
833
|
}
|
937
834
|
fbuffer_append_char(state->object_delim2, ':');
|
938
835
|
if (state->space) fbuffer_append(state->object_delim2, state->space, state->space_len);
|
@@ -940,21 +837,13 @@ static FBuffer *cState_prepare_buffer(VALUE self)
|
|
940
837
|
if (state->array_delim) {
|
941
838
|
fbuffer_clear(state->array_delim);
|
942
839
|
} else {
|
943
|
-
state->array_delim =
|
840
|
+
state->array_delim = fbuffer_alloc(16);
|
944
841
|
}
|
945
842
|
fbuffer_append_char(state->array_delim, ',');
|
946
843
|
if (state->array_nl) fbuffer_append(state->array_delim, state->array_nl, state->array_nl_len);
|
947
844
|
return buffer;
|
948
845
|
}
|
949
846
|
|
950
|
-
static VALUE fbuffer_to_s(FBuffer *fb)
|
951
|
-
{
|
952
|
-
VALUE result = rb_str_new(FBUFFER_PAIR(fb));
|
953
|
-
fbuffer_free(fb);
|
954
|
-
FORCE_UTF8(result);
|
955
|
-
return result;
|
956
|
-
}
|
957
|
-
|
958
847
|
static VALUE cState_partial_generate(VALUE self, VALUE obj)
|
959
848
|
{
|
960
849
|
FBuffer *buffer = cState_prepare_buffer(self);
|
@@ -1003,12 +892,15 @@ static VALUE cState_generate(VALUE self, VALUE obj)
|
|
1003
892
|
* encountered. This options defaults to false.
|
1004
893
|
* * *quirks_mode*: Enables quirks_mode for parser, that is for example
|
1005
894
|
* generating single JSON values instead of documents is possible.
|
895
|
+
* * *buffer_initial_length*: sets the initial length of the generator's
|
896
|
+
* internal buffer.
|
1006
897
|
*/
|
1007
898
|
static VALUE cState_initialize(int argc, VALUE *argv, VALUE self)
|
1008
899
|
{
|
1009
900
|
VALUE opts;
|
1010
901
|
GET_STATE(self);
|
1011
902
|
state->max_nesting = 19;
|
903
|
+
state->buffer_initial_length = FBUFFER_INITIAL_LENGTH_DEFAULT;
|
1012
904
|
rb_scan_args(argc, argv, "01", &opts);
|
1013
905
|
if (!NIL_P(opts)) cState_configure(self, opts);
|
1014
906
|
return self;
|
@@ -1349,7 +1241,37 @@ static VALUE cState_depth_set(VALUE self, VALUE depth)
|
|
1349
1241
|
{
|
1350
1242
|
GET_STATE(self);
|
1351
1243
|
Check_Type(depth, T_FIXNUM);
|
1352
|
-
|
1244
|
+
state->depth = FIX2LONG(depth);
|
1245
|
+
return Qnil;
|
1246
|
+
}
|
1247
|
+
|
1248
|
+
/*
|
1249
|
+
* call-seq: buffer_initial_length
|
1250
|
+
*
|
1251
|
+
* This integer returns the current inital length of the buffer.
|
1252
|
+
*/
|
1253
|
+
static VALUE cState_buffer_initial_length(VALUE self)
|
1254
|
+
{
|
1255
|
+
GET_STATE(self);
|
1256
|
+
return LONG2FIX(state->buffer_initial_length);
|
1257
|
+
}
|
1258
|
+
|
1259
|
+
/*
|
1260
|
+
* call-seq: buffer_initial_length=(length)
|
1261
|
+
*
|
1262
|
+
* This sets the initial length of the buffer to +length+, if +length+ > 0,
|
1263
|
+
* otherwise its value isn't changed.
|
1264
|
+
*/
|
1265
|
+
static VALUE cState_buffer_initial_length_set(VALUE self, VALUE buffer_initial_length)
|
1266
|
+
{
|
1267
|
+
long initial_length;
|
1268
|
+
GET_STATE(self);
|
1269
|
+
Check_Type(buffer_initial_length, T_FIXNUM);
|
1270
|
+
initial_length = FIX2LONG(buffer_initial_length);
|
1271
|
+
if (initial_length > 0) {
|
1272
|
+
state->buffer_initial_length = initial_length;
|
1273
|
+
}
|
1274
|
+
return Qnil;
|
1353
1275
|
}
|
1354
1276
|
|
1355
1277
|
/*
|
@@ -1391,6 +1313,8 @@ void Init_generator()
|
|
1391
1313
|
rb_define_method(cState, "quirks_mode=", cState_quirks_mode_set, 1);
|
1392
1314
|
rb_define_method(cState, "depth", cState_depth, 0);
|
1393
1315
|
rb_define_method(cState, "depth=", cState_depth_set, 1);
|
1316
|
+
rb_define_method(cState, "buffer_initial_length", cState_buffer_initial_length, 0);
|
1317
|
+
rb_define_method(cState, "buffer_initial_length=", cState_buffer_initial_length_set, 1);
|
1394
1318
|
rb_define_method(cState, "configure", cState_configure, 1);
|
1395
1319
|
rb_define_alias(cState, "merge", "configure");
|
1396
1320
|
rb_define_method(cState, "to_h", cState_to_h, 0);
|
@@ -1438,6 +1362,7 @@ void Init_generator()
|
|
1438
1362
|
i_ascii_only = rb_intern("ascii_only");
|
1439
1363
|
i_quirks_mode = rb_intern("quirks_mode");
|
1440
1364
|
i_depth = rb_intern("depth");
|
1365
|
+
i_buffer_initial_length = rb_intern("buffer_initial_length");
|
1441
1366
|
i_pack = rb_intern("pack");
|
1442
1367
|
i_unpack = rb_intern("unpack");
|
1443
1368
|
i_create_id = rb_intern("create_id");
|