json 2.4.1 → 2.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +24 -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 -9
- 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 +6 -82
- data/Gemfile +0 -14
- data/lib/json/ext/.keep +0 -0
- 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/fail29.json +0 -1
- data/tests/fixtures/fail3.json +0 -1
- data/tests/fixtures/fail30.json +0 -1
- data/tests/fixtures/fail31.json +0 -1
- data/tests/fixtures/fail32.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
@@ -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."
|
@@ -15,7 +15,6 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.rdoc_options = ["--title", "JSON implementation for Ruby", "--main", "README.md"]
|
16
16
|
s.files = [
|
17
17
|
"CHANGES.md",
|
18
|
-
"Gemfile",
|
19
18
|
"LICENSE",
|
20
19
|
"README.md",
|
21
20
|
"VERSION",
|
@@ -48,13 +47,12 @@ Gem::Specification.new do |s|
|
|
48
47
|
"lib/json/add/time.rb",
|
49
48
|
"lib/json/common.rb",
|
50
49
|
"lib/json/ext.rb",
|
51
|
-
"lib/json/ext/.keep",
|
52
50
|
"lib/json/generic_object.rb",
|
53
51
|
"lib/json/pure.rb",
|
54
52
|
"lib/json/pure/generator.rb",
|
55
53
|
"lib/json/pure/parser.rb",
|
56
54
|
"lib/json/version.rb",
|
57
|
-
]
|
55
|
+
]
|
58
56
|
s.homepage = "http://flori.github.com/json"
|
59
57
|
s.metadata = {
|
60
58
|
'bug_tracker_uri' => 'https://github.com/flori/json/issues',
|
@@ -65,9 +63,5 @@ Gem::Specification.new do |s|
|
|
65
63
|
'wiki_uri' => 'https://github.com/flori/json/wiki'
|
66
64
|
}
|
67
65
|
|
68
|
-
s.required_ruby_version = Gem::Requirement.new(">= 2.
|
69
|
-
s.test_files = ["tests/test_helper.rb"]
|
70
|
-
|
71
|
-
s.add_development_dependency "rake"
|
72
|
-
s.add_development_dependency "test-unit"
|
66
|
+
s.required_ruby_version = Gem::Requirement.new(">= 2.3")
|
73
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
|
metadata
CHANGED
@@ -1,43 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Frank
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: rake
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: test-unit
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
11
|
+
date: 2021-10-24 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
41
13
|
description: This is a JSON implementation as a Ruby extension in C.
|
42
14
|
email: flori@ping.de
|
43
15
|
executables: []
|
@@ -49,7 +21,6 @@ extra_rdoc_files:
|
|
49
21
|
- README.md
|
50
22
|
files:
|
51
23
|
- CHANGES.md
|
52
|
-
- Gemfile
|
53
24
|
- LICENSE
|
54
25
|
- README.md
|
55
26
|
- VERSION
|
@@ -82,57 +53,11 @@ files:
|
|
82
53
|
- lib/json/add/time.rb
|
83
54
|
- lib/json/common.rb
|
84
55
|
- lib/json/ext.rb
|
85
|
-
- lib/json/ext/.keep
|
86
56
|
- lib/json/generic_object.rb
|
87
57
|
- lib/json/pure.rb
|
88
58
|
- lib/json/pure/generator.rb
|
89
59
|
- lib/json/pure/parser.rb
|
90
60
|
- lib/json/version.rb
|
91
|
-
- tests/fixtures/fail10.json
|
92
|
-
- tests/fixtures/fail11.json
|
93
|
-
- tests/fixtures/fail12.json
|
94
|
-
- tests/fixtures/fail13.json
|
95
|
-
- tests/fixtures/fail14.json
|
96
|
-
- tests/fixtures/fail18.json
|
97
|
-
- tests/fixtures/fail19.json
|
98
|
-
- tests/fixtures/fail2.json
|
99
|
-
- tests/fixtures/fail20.json
|
100
|
-
- tests/fixtures/fail21.json
|
101
|
-
- tests/fixtures/fail22.json
|
102
|
-
- tests/fixtures/fail23.json
|
103
|
-
- tests/fixtures/fail24.json
|
104
|
-
- tests/fixtures/fail25.json
|
105
|
-
- tests/fixtures/fail27.json
|
106
|
-
- tests/fixtures/fail28.json
|
107
|
-
- tests/fixtures/fail29.json
|
108
|
-
- tests/fixtures/fail3.json
|
109
|
-
- tests/fixtures/fail30.json
|
110
|
-
- tests/fixtures/fail31.json
|
111
|
-
- tests/fixtures/fail32.json
|
112
|
-
- tests/fixtures/fail4.json
|
113
|
-
- tests/fixtures/fail5.json
|
114
|
-
- tests/fixtures/fail6.json
|
115
|
-
- tests/fixtures/fail7.json
|
116
|
-
- tests/fixtures/fail8.json
|
117
|
-
- tests/fixtures/fail9.json
|
118
|
-
- tests/fixtures/obsolete_fail1.json
|
119
|
-
- tests/fixtures/pass1.json
|
120
|
-
- tests/fixtures/pass15.json
|
121
|
-
- tests/fixtures/pass16.json
|
122
|
-
- tests/fixtures/pass17.json
|
123
|
-
- tests/fixtures/pass2.json
|
124
|
-
- tests/fixtures/pass26.json
|
125
|
-
- tests/fixtures/pass3.json
|
126
|
-
- tests/json_addition_test.rb
|
127
|
-
- tests/json_common_interface_test.rb
|
128
|
-
- tests/json_encoding_test.rb
|
129
|
-
- tests/json_ext_parser_test.rb
|
130
|
-
- tests/json_fixtures_test.rb
|
131
|
-
- tests/json_generator_test.rb
|
132
|
-
- tests/json_generic_object_test.rb
|
133
|
-
- tests/json_parser_test.rb
|
134
|
-
- tests/json_string_matching_test.rb
|
135
|
-
- tests/test_helper.rb
|
136
61
|
homepage: http://flori.github.com/json
|
137
62
|
licenses:
|
138
63
|
- Ruby
|
@@ -155,16 +80,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
155
80
|
requirements:
|
156
81
|
- - ">="
|
157
82
|
- !ruby/object:Gem::Version
|
158
|
-
version: '2.
|
83
|
+
version: '2.3'
|
159
84
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
160
85
|
requirements:
|
161
86
|
- - ">="
|
162
87
|
- !ruby/object:Gem::Version
|
163
88
|
version: '0'
|
164
89
|
requirements: []
|
165
|
-
rubygems_version: 3.
|
90
|
+
rubygems_version: 3.3.0.dev
|
166
91
|
signing_key:
|
167
92
|
specification_version: 4
|
168
93
|
summary: JSON Implementation for Ruby
|
169
|
-
test_files:
|
170
|
-
- tests/test_helper.rb
|
94
|
+
test_files: []
|
data/Gemfile
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# vim: set ft=ruby:
|
2
|
-
|
3
|
-
source 'https://rubygems.org'
|
4
|
-
|
5
|
-
case ENV['JSON']
|
6
|
-
when 'ext', nil
|
7
|
-
if ENV['RUBY_ENGINE'] == 'jruby'
|
8
|
-
gemspec :name => 'json-java'
|
9
|
-
else
|
10
|
-
gemspec :name => 'json'
|
11
|
-
end
|
12
|
-
when 'pure'
|
13
|
-
gemspec :name => 'json_pure'
|
14
|
-
end
|
data/lib/json/ext/.keep
DELETED
File without changes
|
data/tests/fixtures/fail10.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"Extra value after close": true} "misplaced quoted value"
|
data/tests/fixtures/fail11.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"Illegal expression": 1 + 2}
|
data/tests/fixtures/fail12.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"Illegal invocation": alert()}
|
data/tests/fixtures/fail13.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"Numbers cannot have leading zeroes": 013}
|
data/tests/fixtures/fail14.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"Numbers cannot be hex": 0x14}
|
data/tests/fixtures/fail18.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
|
data/tests/fixtures/fail19.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"Missing colon" null}
|
data/tests/fixtures/fail2.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
["Unclosed array"
|
data/tests/fixtures/fail20.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"Double colon":: null}
|
data/tests/fixtures/fail21.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"Comma instead of colon", null}
|
data/tests/fixtures/fail22.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
["Colon instead of comma": false]
|
data/tests/fixtures/fail23.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
["Bad value", truth]
|
data/tests/fixtures/fail24.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
['single quote']
|
data/tests/fixtures/fail25.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
["tab character in string "]
|
data/tests/fixtures/fail27.json
DELETED
data/tests/fixtures/fail28.json
DELETED
data/tests/fixtures/fail29.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{
|
data/tests/fixtures/fail3.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{unquoted_key: "keys must be quoted"}
|
data/tests/fixtures/fail30.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
[
|
data/tests/fixtures/fail31.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
[1, 2, 3,
|
data/tests/fixtures/fail32.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"foo": "bar"
|