json 2.4.0 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +27 -5
- data/README.md +3 -3
- data/VERSION +1 -1
- data/ext/json/ext/generator/generator.c +13 -17
- data/ext/json/ext/parser/extconf.rb +1 -0
- data/ext/json/ext/parser/parser.c +2971 -1797
- data/ext/json/ext/parser/parser.h +5 -1
- data/ext/json/ext/parser/parser.rl +106 -53
- data/json.gemspec +3 -76
- data/lib/json/common.rb +34 -13
- data/lib/json/pure/parser.rb +1 -1
- data/lib/json/version.rb +1 -1
- data/lib/json.rb +1 -1
- metadata +7 -110
- data/.gitignore +0 -18
- data/.travis.yml +0 -23
- data/Gemfile +0 -14
- data/README-json-jruby.md +0 -33
- data/Rakefile +0 -334
- data/diagrams/.keep +0 -0
- data/install.rb +0 -23
- data/java/src/json/ext/ByteListTranscoder.java +0 -166
- data/java/src/json/ext/Generator.java +0 -447
- data/java/src/json/ext/GeneratorMethods.java +0 -231
- data/java/src/json/ext/GeneratorService.java +0 -42
- data/java/src/json/ext/GeneratorState.java +0 -520
- data/java/src/json/ext/OptionsReader.java +0 -113
- data/java/src/json/ext/Parser.java +0 -2374
- data/java/src/json/ext/Parser.rl +0 -905
- data/java/src/json/ext/ParserService.java +0 -34
- data/java/src/json/ext/RuntimeInfo.java +0 -116
- data/java/src/json/ext/StringDecoder.java +0 -166
- data/java/src/json/ext/StringEncoder.java +0 -117
- data/java/src/json/ext/Utils.java +0 -88
- data/json-java.gemspec +0 -38
- data/json_pure.gemspec +0 -33
- data/lib/json/ext/.keep +0 -0
- data/references/rfc7159.txt +0 -899
- data/tests/fixtures/fail10.json +0 -1
- data/tests/fixtures/fail11.json +0 -1
- data/tests/fixtures/fail12.json +0 -1
- data/tests/fixtures/fail13.json +0 -1
- data/tests/fixtures/fail14.json +0 -1
- data/tests/fixtures/fail18.json +0 -1
- data/tests/fixtures/fail19.json +0 -1
- data/tests/fixtures/fail2.json +0 -1
- data/tests/fixtures/fail20.json +0 -1
- data/tests/fixtures/fail21.json +0 -1
- data/tests/fixtures/fail22.json +0 -1
- data/tests/fixtures/fail23.json +0 -1
- data/tests/fixtures/fail24.json +0 -1
- data/tests/fixtures/fail25.json +0 -1
- data/tests/fixtures/fail27.json +0 -2
- data/tests/fixtures/fail28.json +0 -2
- data/tests/fixtures/fail3.json +0 -1
- data/tests/fixtures/fail4.json +0 -1
- data/tests/fixtures/fail5.json +0 -1
- data/tests/fixtures/fail6.json +0 -1
- data/tests/fixtures/fail7.json +0 -1
- data/tests/fixtures/fail8.json +0 -1
- data/tests/fixtures/fail9.json +0 -1
- data/tests/fixtures/obsolete_fail1.json +0 -1
- data/tests/fixtures/pass1.json +0 -56
- data/tests/fixtures/pass15.json +0 -1
- data/tests/fixtures/pass16.json +0 -1
- data/tests/fixtures/pass17.json +0 -1
- data/tests/fixtures/pass2.json +0 -1
- data/tests/fixtures/pass26.json +0 -1
- data/tests/fixtures/pass3.json +0 -6
- data/tests/json_addition_test.rb +0 -199
- data/tests/json_common_interface_test.rb +0 -169
- data/tests/json_encoding_test.rb +0 -107
- data/tests/json_ext_parser_test.rb +0 -15
- data/tests/json_fixtures_test.rb +0 -40
- data/tests/json_generator_test.rb +0 -432
- data/tests/json_generic_object_test.rb +0 -82
- data/tests/json_parser_test.rb +0 -497
- data/tests/json_string_matching_test.rb +0 -38
- data/tests/test_helper.rb +0 -17
- data/tools/diff.sh +0 -18
- data/tools/fuzz.rb +0 -131
- data/tools/server.rb +0 -62
@@ -13,6 +13,10 @@
|
|
13
13
|
#include "st.h"
|
14
14
|
#endif
|
15
15
|
|
16
|
+
#ifndef MAYBE_UNUSED
|
17
|
+
# define MAYBE_UNUSED(x) x
|
18
|
+
#endif
|
19
|
+
|
16
20
|
#define option_given_p(opts, key) RTEST(rb_funcall(opts, i_key_p, 1, key))
|
17
21
|
|
18
22
|
/* unicode */
|
@@ -63,7 +67,7 @@ static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *resul
|
|
63
67
|
static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result);
|
64
68
|
static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result);
|
65
69
|
static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting);
|
66
|
-
static VALUE json_string_unescape(
|
70
|
+
static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int symbolize);
|
67
71
|
static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *result);
|
68
72
|
static VALUE convert_encoding(VALUE source);
|
69
73
|
static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self);
|
@@ -89,13 +89,12 @@ static int convert_UTF32_to_UTF8(char *buf, UTF32 ch)
|
|
89
89
|
|
90
90
|
static VALUE mJSON, mExt, cParser, eParserError, eNestingError;
|
91
91
|
static VALUE CNaN, CInfinity, CMinusInfinity;
|
92
|
-
static VALUE cBigDecimal = Qundef;
|
93
92
|
|
94
93
|
static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions,
|
95
94
|
i_chr, i_max_nesting, i_allow_nan, i_symbolize_names,
|
96
95
|
i_object_class, i_array_class, i_decimal_class, i_key_p,
|
97
96
|
i_deep_const_get, i_match, i_match_string, i_aset, i_aref,
|
98
|
-
i_leftshift, i_new,
|
97
|
+
i_leftshift, i_new, i_try_convert, i_freeze, i_uminus;
|
99
98
|
|
100
99
|
%%{
|
101
100
|
machine JSON_common;
|
@@ -345,19 +344,6 @@ static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *res
|
|
345
344
|
) (^[0-9Ee.\-]? @exit );
|
346
345
|
}%%
|
347
346
|
|
348
|
-
static int is_bigdecimal_class(VALUE obj)
|
349
|
-
{
|
350
|
-
if (cBigDecimal == Qundef) {
|
351
|
-
if (rb_const_defined(rb_cObject, i_BigDecimal)) {
|
352
|
-
cBigDecimal = rb_const_get_at(rb_cObject, i_BigDecimal);
|
353
|
-
}
|
354
|
-
else {
|
355
|
-
return 0;
|
356
|
-
}
|
357
|
-
}
|
358
|
-
return obj == cBigDecimal;
|
359
|
-
}
|
360
|
-
|
361
347
|
static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
362
348
|
{
|
363
349
|
int cs = EVIL;
|
@@ -367,21 +353,46 @@ static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *resul
|
|
367
353
|
%% write exec;
|
368
354
|
|
369
355
|
if (cs >= JSON_float_first_final) {
|
356
|
+
VALUE mod = Qnil;
|
357
|
+
ID method_id = 0;
|
358
|
+
if (rb_respond_to(json->decimal_class, i_try_convert)) {
|
359
|
+
mod = json->decimal_class;
|
360
|
+
method_id = i_try_convert;
|
361
|
+
} else if (rb_respond_to(json->decimal_class, i_new)) {
|
362
|
+
mod = json->decimal_class;
|
363
|
+
method_id = i_new;
|
364
|
+
} else if (RB_TYPE_P(json->decimal_class, T_CLASS)) {
|
365
|
+
VALUE name = rb_class_name(json->decimal_class);
|
366
|
+
const char *name_cstr = RSTRING_PTR(name);
|
367
|
+
const char *last_colon = strrchr(name_cstr, ':');
|
368
|
+
if (last_colon) {
|
369
|
+
const char *mod_path_end = last_colon - 1;
|
370
|
+
VALUE mod_path = rb_str_substr(name, 0, mod_path_end - name_cstr);
|
371
|
+
mod = rb_path_to_class(mod_path);
|
372
|
+
|
373
|
+
const char *method_name_beg = last_colon + 1;
|
374
|
+
long before_len = method_name_beg - name_cstr;
|
375
|
+
long len = RSTRING_LEN(name) - before_len;
|
376
|
+
VALUE method_name = rb_str_substr(name, before_len, len);
|
377
|
+
method_id = SYM2ID(rb_str_intern(method_name));
|
378
|
+
} else {
|
379
|
+
mod = rb_mKernel;
|
380
|
+
method_id = SYM2ID(rb_str_intern(name));
|
381
|
+
}
|
382
|
+
}
|
383
|
+
|
370
384
|
long len = p - json->memo;
|
371
385
|
fbuffer_clear(json->fbuffer);
|
372
386
|
fbuffer_append(json->fbuffer, json->memo, len);
|
373
387
|
fbuffer_append_char(json->fbuffer, '\0');
|
374
|
-
|
375
|
-
|
388
|
+
|
389
|
+
if (method_id) {
|
390
|
+
VALUE text = rb_str_new2(FBUFFER_PTR(json->fbuffer));
|
391
|
+
*result = rb_funcallv(mod, method_id, 1, &text);
|
376
392
|
} else {
|
377
|
-
|
378
|
-
text = rb_str_new2(FBUFFER_PTR(json->fbuffer));
|
379
|
-
if (is_bigdecimal_class(json->decimal_class)) {
|
380
|
-
*result = rb_funcall(Qnil, i_BigDecimal, 1, text);
|
381
|
-
} else {
|
382
|
-
*result = rb_funcall(json->decimal_class, i_new, 1, text);
|
383
|
-
}
|
393
|
+
*result = DBL2NUM(rb_cstr_to_dbl(FBUFFER_PTR(json->fbuffer), 1));
|
384
394
|
}
|
395
|
+
|
385
396
|
return p + 1;
|
386
397
|
} else {
|
387
398
|
return NULL;
|
@@ -441,17 +452,29 @@ static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *resul
|
|
441
452
|
}
|
442
453
|
}
|
443
454
|
|
444
|
-
static
|
455
|
+
static const size_t MAX_STACK_BUFFER_SIZE = 128;
|
456
|
+
static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int symbolize)
|
445
457
|
{
|
446
|
-
|
458
|
+
VALUE result = Qnil;
|
459
|
+
size_t bufferSize = stringEnd - string;
|
460
|
+
char *p = string, *pe = string, *unescape, *bufferStart, *buffer;
|
447
461
|
int unescape_len;
|
448
462
|
char buf[4];
|
449
463
|
|
464
|
+
if (bufferSize > MAX_STACK_BUFFER_SIZE) {
|
465
|
+
bufferStart = buffer = ALLOC_N(char, bufferSize);
|
466
|
+
} else {
|
467
|
+
bufferStart = buffer = ALLOCA_N(char, bufferSize);
|
468
|
+
}
|
469
|
+
|
450
470
|
while (pe < stringEnd) {
|
451
471
|
if (*pe == '\\') {
|
452
472
|
unescape = (char *) "?";
|
453
473
|
unescape_len = 1;
|
454
|
-
if (pe > p)
|
474
|
+
if (pe > p) {
|
475
|
+
MEMCPY(buffer, p, char, pe - p);
|
476
|
+
buffer += pe - p;
|
477
|
+
}
|
455
478
|
switch (*++pe) {
|
456
479
|
case 'n':
|
457
480
|
unescape = (char *) "\n";
|
@@ -476,6 +499,9 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
|
|
476
499
|
break;
|
477
500
|
case 'u':
|
478
501
|
if (pe > stringEnd - 4) {
|
502
|
+
if (bufferSize > MAX_STACK_BUFFER_SIZE) {
|
503
|
+
free(bufferStart);
|
504
|
+
}
|
479
505
|
rb_enc_raise(
|
480
506
|
EXC_ENCODING eParserError,
|
481
507
|
"%u: incomplete unicode character escape sequence at '%s'", __LINE__, p
|
@@ -486,6 +512,9 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
|
|
486
512
|
if (UNI_SUR_HIGH_START == (ch & 0xFC00)) {
|
487
513
|
pe++;
|
488
514
|
if (pe > stringEnd - 6) {
|
515
|
+
if (bufferSize > MAX_STACK_BUFFER_SIZE) {
|
516
|
+
free(bufferStart);
|
517
|
+
}
|
489
518
|
rb_enc_raise(
|
490
519
|
EXC_ENCODING eParserError,
|
491
520
|
"%u: incomplete surrogate pair at '%s'", __LINE__, p
|
@@ -509,13 +538,55 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
|
|
509
538
|
p = pe;
|
510
539
|
continue;
|
511
540
|
}
|
512
|
-
|
541
|
+
MEMCPY(buffer, unescape, char, unescape_len);
|
542
|
+
buffer += unescape_len;
|
513
543
|
p = ++pe;
|
514
544
|
} else {
|
515
545
|
pe++;
|
516
546
|
}
|
517
547
|
}
|
518
|
-
|
548
|
+
|
549
|
+
if (pe > p) {
|
550
|
+
MEMCPY(buffer, p, char, pe - p);
|
551
|
+
buffer += pe - p;
|
552
|
+
}
|
553
|
+
|
554
|
+
# ifdef HAVE_RB_ENC_INTERNED_STR
|
555
|
+
if (intern) {
|
556
|
+
result = rb_enc_interned_str(bufferStart, (long)(buffer - bufferStart), rb_utf8_encoding());
|
557
|
+
} else {
|
558
|
+
result = rb_utf8_str_new(bufferStart, (long)(buffer - bufferStart));
|
559
|
+
}
|
560
|
+
if (bufferSize > MAX_STACK_BUFFER_SIZE) {
|
561
|
+
free(bufferStart);
|
562
|
+
}
|
563
|
+
# else
|
564
|
+
result = rb_utf8_str_new(bufferStart, (long)(buffer - bufferStart));
|
565
|
+
|
566
|
+
if (bufferSize > MAX_STACK_BUFFER_SIZE) {
|
567
|
+
free(bufferStart);
|
568
|
+
}
|
569
|
+
|
570
|
+
if (intern) {
|
571
|
+
# if STR_UMINUS_DEDUPE_FROZEN
|
572
|
+
// Starting from MRI 2.8 it is preferable to freeze the string
|
573
|
+
// before deduplication so that it can be interned directly
|
574
|
+
// otherwise it would be duplicated first which is wasteful.
|
575
|
+
result = rb_funcall(rb_str_freeze(result), i_uminus, 0);
|
576
|
+
# elif STR_UMINUS_DEDUPE
|
577
|
+
// MRI 2.5 and older do not deduplicate strings that are already
|
578
|
+
// frozen.
|
579
|
+
result = rb_funcall(result, i_uminus, 0);
|
580
|
+
# else
|
581
|
+
result = rb_str_freeze(result);
|
582
|
+
# endif
|
583
|
+
}
|
584
|
+
# endif
|
585
|
+
|
586
|
+
if (symbolize) {
|
587
|
+
result = rb_str_intern(result);
|
588
|
+
}
|
589
|
+
|
519
590
|
return result;
|
520
591
|
}
|
521
592
|
|
@@ -526,12 +597,11 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
|
|
526
597
|
write data;
|
527
598
|
|
528
599
|
action parse_string {
|
529
|
-
*result = json_string_unescape(
|
600
|
+
*result = json_string_unescape(json->memo + 1, p, json->parsing_name || json-> freeze, json->parsing_name && json->symbolize_names);
|
530
601
|
if (NIL_P(*result)) {
|
531
602
|
fhold;
|
532
603
|
fbreak;
|
533
604
|
} else {
|
534
|
-
FORCE_UTF8(*result);
|
535
605
|
fexec p + 1;
|
536
606
|
}
|
537
607
|
}
|
@@ -558,7 +628,6 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
|
|
558
628
|
int cs = EVIL;
|
559
629
|
VALUE match_string;
|
560
630
|
|
561
|
-
*result = rb_str_buf_new(0);
|
562
631
|
%% write init;
|
563
632
|
json->memo = p;
|
564
633
|
%% write exec;
|
@@ -574,26 +643,6 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
|
|
574
643
|
}
|
575
644
|
}
|
576
645
|
|
577
|
-
if (json->symbolize_names && json->parsing_name) {
|
578
|
-
*result = rb_str_intern(*result);
|
579
|
-
} else if (RB_TYPE_P(*result, T_STRING)) {
|
580
|
-
# if STR_UMINUS_DEDUPE_FROZEN
|
581
|
-
if (json->freeze) {
|
582
|
-
// Starting from MRI 2.8 it is preferable to freeze the string
|
583
|
-
// before deduplication so that it can be interned directly
|
584
|
-
// otherwise it would be duplicated first which is wasteful.
|
585
|
-
*result = rb_funcall(rb_str_freeze(*result), i_uminus, 0);
|
586
|
-
}
|
587
|
-
# elif STR_UMINUS_DEDUPE
|
588
|
-
if (json->freeze) {
|
589
|
-
// MRI 2.5 and older do not deduplicate strings that are already
|
590
|
-
// frozen.
|
591
|
-
*result = rb_funcall(*result, i_uminus, 0);
|
592
|
-
}
|
593
|
-
# else
|
594
|
-
rb_str_resize(*result, RSTRING_LEN(*result));
|
595
|
-
# endif
|
596
|
-
}
|
597
646
|
if (cs >= JSON_string_first_final) {
|
598
647
|
return p + 1;
|
599
648
|
} else {
|
@@ -868,6 +917,10 @@ static VALUE cParser_source(VALUE self)
|
|
868
917
|
|
869
918
|
void Init_parser(void)
|
870
919
|
{
|
920
|
+
#ifdef HAVE_RB_EXT_RACTOR_SAFE
|
921
|
+
rb_ext_ractor_safe(true);
|
922
|
+
#endif
|
923
|
+
|
871
924
|
#undef rb_intern
|
872
925
|
rb_require("json/common");
|
873
926
|
mJSON = rb_define_module("JSON");
|
@@ -910,7 +963,7 @@ void Init_parser(void)
|
|
910
963
|
i_aref = rb_intern("[]");
|
911
964
|
i_leftshift = rb_intern("<<");
|
912
965
|
i_new = rb_intern("new");
|
913
|
-
|
966
|
+
i_try_convert = rb_intern("try_convert");
|
914
967
|
i_freeze = rb_intern("freeze");
|
915
968
|
i_uminus = rb_intern("-@");
|
916
969
|
}
|
data/json.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "json"
|
5
|
-
s.version = File.read('VERSION').chomp
|
5
|
+
s.version = File.read(File.expand_path('../VERSION', __FILE__)).chomp
|
6
6
|
|
7
7
|
s.summary = "JSON Implementation for Ruby"
|
8
8
|
s.description = "This is a JSON implementation as a Ruby extension in C."
|
@@ -12,18 +12,12 @@ Gem::Specification.new do |s|
|
|
12
12
|
|
13
13
|
s.extensions = ["ext/json/ext/generator/extconf.rb", "ext/json/ext/parser/extconf.rb", "ext/json/extconf.rb"]
|
14
14
|
s.extra_rdoc_files = ["README.md"]
|
15
|
-
s.rdoc_options = ["--title", "JSON
|
15
|
+
s.rdoc_options = ["--title", "JSON implementation for Ruby", "--main", "README.md"]
|
16
16
|
s.files = [
|
17
|
-
".gitignore",
|
18
|
-
".travis.yml",
|
19
17
|
"CHANGES.md",
|
20
|
-
"Gemfile",
|
21
18
|
"LICENSE",
|
22
|
-
"README-json-jruby.md",
|
23
19
|
"README.md",
|
24
|
-
"Rakefile",
|
25
20
|
"VERSION",
|
26
|
-
"diagrams/.keep",
|
27
21
|
"ext/json/ext/fbuffer/fbuffer.h",
|
28
22
|
"ext/json/ext/generator/depend",
|
29
23
|
"ext/json/ext/generator/extconf.rb",
|
@@ -35,23 +29,7 @@ Gem::Specification.new do |s|
|
|
35
29
|
"ext/json/ext/parser/parser.h",
|
36
30
|
"ext/json/ext/parser/parser.rl",
|
37
31
|
"ext/json/extconf.rb",
|
38
|
-
"install.rb",
|
39
|
-
"java/src/json/ext/ByteListTranscoder.java",
|
40
|
-
"java/src/json/ext/Generator.java",
|
41
|
-
"java/src/json/ext/GeneratorMethods.java",
|
42
|
-
"java/src/json/ext/GeneratorService.java",
|
43
|
-
"java/src/json/ext/GeneratorState.java",
|
44
|
-
"java/src/json/ext/OptionsReader.java",
|
45
|
-
"java/src/json/ext/Parser.java",
|
46
|
-
"java/src/json/ext/Parser.rl",
|
47
|
-
"java/src/json/ext/ParserService.java",
|
48
|
-
"java/src/json/ext/RuntimeInfo.java",
|
49
|
-
"java/src/json/ext/StringDecoder.java",
|
50
|
-
"java/src/json/ext/StringEncoder.java",
|
51
|
-
"java/src/json/ext/Utils.java",
|
52
|
-
"json-java.gemspec",
|
53
32
|
"json.gemspec",
|
54
|
-
"json_pure.gemspec",
|
55
33
|
"lib/json.rb",
|
56
34
|
"lib/json/add/bigdecimal.rb",
|
57
35
|
"lib/json/add/complex.rb",
|
@@ -69,58 +47,11 @@ Gem::Specification.new do |s|
|
|
69
47
|
"lib/json/add/time.rb",
|
70
48
|
"lib/json/common.rb",
|
71
49
|
"lib/json/ext.rb",
|
72
|
-
"lib/json/ext/.keep",
|
73
50
|
"lib/json/generic_object.rb",
|
74
51
|
"lib/json/pure.rb",
|
75
52
|
"lib/json/pure/generator.rb",
|
76
53
|
"lib/json/pure/parser.rb",
|
77
54
|
"lib/json/version.rb",
|
78
|
-
"references/rfc7159.txt",
|
79
|
-
"tests/fixtures/fail10.json",
|
80
|
-
"tests/fixtures/fail11.json",
|
81
|
-
"tests/fixtures/fail12.json",
|
82
|
-
"tests/fixtures/fail13.json",
|
83
|
-
"tests/fixtures/fail14.json",
|
84
|
-
"tests/fixtures/fail18.json",
|
85
|
-
"tests/fixtures/fail19.json",
|
86
|
-
"tests/fixtures/fail2.json",
|
87
|
-
"tests/fixtures/fail20.json",
|
88
|
-
"tests/fixtures/fail21.json",
|
89
|
-
"tests/fixtures/fail22.json",
|
90
|
-
"tests/fixtures/fail23.json",
|
91
|
-
"tests/fixtures/fail24.json",
|
92
|
-
"tests/fixtures/fail25.json",
|
93
|
-
"tests/fixtures/fail27.json",
|
94
|
-
"tests/fixtures/fail28.json",
|
95
|
-
"tests/fixtures/fail3.json",
|
96
|
-
"tests/fixtures/fail4.json",
|
97
|
-
"tests/fixtures/fail5.json",
|
98
|
-
"tests/fixtures/fail6.json",
|
99
|
-
"tests/fixtures/fail7.json",
|
100
|
-
"tests/fixtures/fail8.json",
|
101
|
-
"tests/fixtures/fail9.json",
|
102
|
-
"tests/fixtures/obsolete_fail1.json",
|
103
|
-
"tests/fixtures/pass1.json",
|
104
|
-
"tests/fixtures/pass15.json",
|
105
|
-
"tests/fixtures/pass16.json",
|
106
|
-
"tests/fixtures/pass17.json",
|
107
|
-
"tests/fixtures/pass2.json",
|
108
|
-
"tests/fixtures/pass26.json",
|
109
|
-
"tests/fixtures/pass3.json",
|
110
|
-
"tests/json_addition_test.rb",
|
111
|
-
"tests/json_common_interface_test.rb",
|
112
|
-
"tests/json_encoding_test.rb",
|
113
|
-
"tests/json_ext_parser_test.rb",
|
114
|
-
"tests/json_fixtures_test.rb",
|
115
|
-
"tests/json_generator_test.rb",
|
116
|
-
"tests/json_generic_object_test.rb",
|
117
|
-
"tests/json_parser_test.rb",
|
118
|
-
"tests/json_string_matching_test.rb",
|
119
|
-
"tests/test_helper.rb",
|
120
|
-
"tests/test_helper.rb",
|
121
|
-
"tools/diff.sh",
|
122
|
-
"tools/fuzz.rb",
|
123
|
-
"tools/server.rb",
|
124
55
|
]
|
125
56
|
s.homepage = "http://flori.github.com/json"
|
126
57
|
s.metadata = {
|
@@ -132,9 +63,5 @@ Gem::Specification.new do |s|
|
|
132
63
|
'wiki_uri' => 'https://github.com/flori/json/wiki'
|
133
64
|
}
|
134
65
|
|
135
|
-
s.required_ruby_version = Gem::Requirement.new(">= 2.
|
136
|
-
s.test_files = ["tests/test_helper.rb"]
|
137
|
-
|
138
|
-
s.add_development_dependency("rake", [">= 0"])
|
139
|
-
s.add_development_dependency("test-unit", [">= 2.0", "< 4.0"])
|
66
|
+
s.required_ruby_version = Gem::Requirement.new(">= 2.3")
|
140
67
|
end
|
data/lib/json/common.rb
CHANGED
@@ -71,22 +71,30 @@ module JSON
|
|
71
71
|
end
|
72
72
|
self.state = generator::State
|
73
73
|
const_set :State, self.state
|
74
|
-
const_set :SAFE_STATE_PROTOTYPE, State.new
|
75
|
-
const_set :FAST_STATE_PROTOTYPE,
|
74
|
+
const_set :SAFE_STATE_PROTOTYPE, State.new # for JRuby
|
75
|
+
const_set :FAST_STATE_PROTOTYPE, create_fast_state
|
76
|
+
const_set :PRETTY_STATE_PROTOTYPE, create_pretty_state
|
77
|
+
ensure
|
78
|
+
$VERBOSE = old
|
79
|
+
end
|
80
|
+
|
81
|
+
def create_fast_state
|
82
|
+
State.new(
|
76
83
|
:indent => '',
|
77
84
|
:space => '',
|
78
85
|
:object_nl => "",
|
79
86
|
:array_nl => "",
|
80
87
|
:max_nesting => false
|
81
88
|
)
|
82
|
-
|
89
|
+
end
|
90
|
+
|
91
|
+
def create_pretty_state
|
92
|
+
State.new(
|
83
93
|
:indent => ' ',
|
84
94
|
:space => ' ',
|
85
95
|
:object_nl => "\n",
|
86
96
|
:array_nl => "\n"
|
87
97
|
)
|
88
|
-
ensure
|
89
|
-
$VERBOSE = old
|
90
98
|
end
|
91
99
|
|
92
100
|
# Returns the JSON generator module that is used by JSON. This is
|
@@ -98,13 +106,26 @@ module JSON
|
|
98
106
|
# either JSON::Ext::Generator::State or JSON::Pure::Generator::State:
|
99
107
|
# JSON.state # => JSON::Ext::Generator::State
|
100
108
|
attr_accessor :state
|
109
|
+
end
|
110
|
+
|
111
|
+
DEFAULT_CREATE_ID = 'json_class'.freeze
|
112
|
+
private_constant :DEFAULT_CREATE_ID
|
113
|
+
|
114
|
+
CREATE_ID_TLS_KEY = "JSON.create_id".freeze
|
115
|
+
private_constant :CREATE_ID_TLS_KEY
|
116
|
+
|
117
|
+
# Sets create identifier, which is used to decide if the _json_create_
|
118
|
+
# hook of a class should be called; initial value is +json_class+:
|
119
|
+
# JSON.create_id # => 'json_class'
|
120
|
+
def self.create_id=(new_value)
|
121
|
+
Thread.current[CREATE_ID_TLS_KEY] = new_value.dup.freeze
|
122
|
+
end
|
101
123
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
124
|
+
# Returns the current create identifier.
|
125
|
+
# See also JSON.create_id=.
|
126
|
+
def self.create_id
|
127
|
+
Thread.current[CREATE_ID_TLS_KEY] || DEFAULT_CREATE_ID
|
106
128
|
end
|
107
|
-
self.create_id = 'json_class'
|
108
129
|
|
109
130
|
NaN = 0.0/0
|
110
131
|
|
@@ -276,7 +297,7 @@ module JSON
|
|
276
297
|
if State === opts
|
277
298
|
state, opts = opts, nil
|
278
299
|
else
|
279
|
-
state =
|
300
|
+
state = State.new
|
280
301
|
end
|
281
302
|
if opts
|
282
303
|
if opts.respond_to? :to_hash
|
@@ -315,7 +336,7 @@ module JSON
|
|
315
336
|
if State === opts
|
316
337
|
state, opts = opts, nil
|
317
338
|
else
|
318
|
-
state =
|
339
|
+
state = JSON.create_fast_state
|
319
340
|
end
|
320
341
|
if opts
|
321
342
|
if opts.respond_to? :to_hash
|
@@ -370,7 +391,7 @@ module JSON
|
|
370
391
|
if State === opts
|
371
392
|
state, opts = opts, nil
|
372
393
|
else
|
373
|
-
state =
|
394
|
+
state = JSON.create_pretty_state
|
374
395
|
end
|
375
396
|
if opts
|
376
397
|
if opts.respond_to? :to_hash
|
data/lib/json/pure/parser.rb
CHANGED
data/lib/json/version.rb
CHANGED
data/lib/json.rb
CHANGED
@@ -493,7 +493,7 @@ require 'json/common'
|
|
493
493
|
# json = JSON.generate(ruby0) # {"json_class":"Customer","v":["Dave","123 Main"]}
|
494
494
|
# ruby1 = JSON.parse(json, create_additions: true) # #<struct Customer name="Dave", address="123 Main">
|
495
495
|
# ruby1.class # Customer
|
496
|
-
|
496
|
+
#
|
497
497
|
# \Symbol:
|
498
498
|
# require 'json/add/symbol'
|
499
499
|
# ruby0 = :foo # foo
|