json 1.1.0-mswin32 → 1.1.1-mswin32
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/CHANGES +18 -0
- data/Rakefile +5 -5
- data/VERSION +1 -1
- data/benchmarks/benchmark_generator.rb +5 -1
- data/benchmarks/benchmark_parser.rb +5 -1
- data/bin/edit_json.rb +11 -11
- data/ext/json/ext/generator.so +0 -0
- data/ext/json/ext/generator/extconf.rb +2 -2
- data/ext/json/ext/generator/generator.c +185 -50
- data/ext/json/ext/parser.so +0 -0
- data/ext/json/ext/parser/extconf.rb +2 -2
- data/ext/json/ext/parser/parser.c +246 -117
- data/ext/json/ext/parser/parser.rl +54 -6
- data/lib/json.rb +23 -0
- data/lib/json/add/core.rb +119 -0
- data/lib/json/add/rails.rb +52 -0
- data/lib/json/common.rb +174 -23
- data/lib/json/editor.rb +12 -14
- data/lib/json/pure/generator.rb +83 -10
- data/lib/json/pure/parser.rb +15 -1
- data/lib/json/version.rb +1 -1
- data/tests/fixtures/fail18.json +1 -1
- data/tests/test_json.rb +51 -12
- data/tests/test_json_addition.rb +34 -3
- data/tests/test_json_fixtures.rb +2 -2
- data/tests/test_json_generate.rb +21 -2
- data/tests/test_json_unicode.rb +4 -1
- data/tools/fuzz.rb +2 -1
- metadata +5 -2
data/ext/json/ext/parser.so
CHANGED
Binary file
|
@@ -9,8 +9,12 @@
|
|
9
9
|
#define EVIL 0x666
|
10
10
|
|
11
11
|
static VALUE mJSON, mExt, cParser, eParserError, eNestingError;
|
12
|
+
static VALUE CNaN, CInfinity, CMinusInfinity;
|
12
13
|
|
13
|
-
static ID i_json_creatable_p, i_json_create, i_create_id, i_chr, i_max_nesting
|
14
|
+
static ID i_json_creatable_p, i_json_create, i_create_id, i_chr, i_max_nesting,
|
15
|
+
i_allow_nan;
|
16
|
+
|
17
|
+
#define MinusInfinity "-Infinity"
|
14
18
|
|
15
19
|
typedef struct JSON_ParserStruct {
|
16
20
|
VALUE Vsource;
|
@@ -20,6 +24,7 @@ typedef struct JSON_ParserStruct {
|
|
20
24
|
VALUE create_id;
|
21
25
|
int max_nesting;
|
22
26
|
int current_nesting;
|
27
|
+
int allow_nan;
|
23
28
|
} JSON_Parser;
|
24
29
|
|
25
30
|
static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result);
|
@@ -33,18 +38,18 @@ static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *resul
|
|
33
38
|
JSON_Parser *json; \
|
34
39
|
Data_Get_Struct(self, JSON_Parser, json);
|
35
40
|
|
36
|
-
#line
|
41
|
+
#line 66 "parser.rl"
|
37
42
|
|
38
43
|
|
39
44
|
|
40
|
-
#line
|
45
|
+
#line 46 "parser.c"
|
41
46
|
static const int JSON_object_start = 1;
|
42
47
|
static const int JSON_object_first_final = 27;
|
43
48
|
static const int JSON_object_error = 0;
|
44
49
|
|
45
50
|
static const int JSON_object_en_main = 1;
|
46
51
|
|
47
|
-
#line
|
52
|
+
#line 99 "parser.rl"
|
48
53
|
|
49
54
|
|
50
55
|
static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
@@ -59,13 +64,13 @@ static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *resu
|
|
59
64
|
*result = rb_hash_new();
|
60
65
|
|
61
66
|
|
62
|
-
#line
|
67
|
+
#line 68 "parser.c"
|
63
68
|
{
|
64
69
|
cs = JSON_object_start;
|
65
70
|
}
|
66
|
-
#line
|
71
|
+
#line 113 "parser.rl"
|
67
72
|
|
68
|
-
#line
|
73
|
+
#line 74 "parser.c"
|
69
74
|
{
|
70
75
|
if ( p == pe )
|
71
76
|
goto _out;
|
@@ -92,7 +97,7 @@ case 2:
|
|
92
97
|
goto st2;
|
93
98
|
goto st0;
|
94
99
|
tr2:
|
95
|
-
#line
|
100
|
+
#line 85 "parser.rl"
|
96
101
|
{
|
97
102
|
char *np = JSON_parse_string(json, p, pe, &last_name);
|
98
103
|
if (np == NULL) goto _out3; else {p = (( np))-1;}
|
@@ -102,7 +107,7 @@ st3:
|
|
102
107
|
if ( ++p == pe )
|
103
108
|
goto _out3;
|
104
109
|
case 3:
|
105
|
-
#line
|
110
|
+
#line 111 "parser.c"
|
106
111
|
switch( (*p) ) {
|
107
112
|
case 13: goto st3;
|
108
113
|
case 32: goto st3;
|
@@ -154,6 +159,8 @@ case 8:
|
|
154
159
|
case 34: goto tr11;
|
155
160
|
case 45: goto tr11;
|
156
161
|
case 47: goto st19;
|
162
|
+
case 73: goto tr11;
|
163
|
+
case 78: goto tr11;
|
157
164
|
case 91: goto tr11;
|
158
165
|
case 102: goto tr11;
|
159
166
|
case 110: goto tr11;
|
@@ -167,7 +174,7 @@ case 8:
|
|
167
174
|
goto st8;
|
168
175
|
goto st0;
|
169
176
|
tr11:
|
170
|
-
#line
|
177
|
+
#line 74 "parser.rl"
|
171
178
|
{
|
172
179
|
VALUE v = Qnil;
|
173
180
|
char *np = JSON_parse_value(json, p, pe, &v);
|
@@ -183,7 +190,7 @@ st9:
|
|
183
190
|
if ( ++p == pe )
|
184
191
|
goto _out9;
|
185
192
|
case 9:
|
186
|
-
#line
|
193
|
+
#line 194 "parser.c"
|
187
194
|
switch( (*p) ) {
|
188
195
|
case 13: goto st9;
|
189
196
|
case 32: goto st9;
|
@@ -272,14 +279,14 @@ case 18:
|
|
272
279
|
goto st9;
|
273
280
|
goto st18;
|
274
281
|
tr4:
|
275
|
-
#line
|
282
|
+
#line 90 "parser.rl"
|
276
283
|
{ goto _out27; }
|
277
284
|
goto st27;
|
278
285
|
st27:
|
279
286
|
if ( ++p == pe )
|
280
287
|
goto _out27;
|
281
288
|
case 27:
|
282
|
-
#line
|
289
|
+
#line 290 "parser.c"
|
283
290
|
goto st0;
|
284
291
|
st19:
|
285
292
|
if ( ++p == pe )
|
@@ -376,7 +383,7 @@ case 26:
|
|
376
383
|
|
377
384
|
_out: {}
|
378
385
|
}
|
379
|
-
#line
|
386
|
+
#line 114 "parser.rl"
|
380
387
|
|
381
388
|
if (cs >= JSON_object_first_final) {
|
382
389
|
VALUE klassname = rb_hash_aref(*result, json->create_id);
|
@@ -393,14 +400,14 @@ case 26:
|
|
393
400
|
}
|
394
401
|
|
395
402
|
|
396
|
-
#line
|
403
|
+
#line 404 "parser.c"
|
397
404
|
static const int JSON_value_start = 1;
|
398
|
-
static const int JSON_value_first_final =
|
405
|
+
static const int JSON_value_first_final = 21;
|
399
406
|
static const int JSON_value_error = 0;
|
400
407
|
|
401
408
|
static const int JSON_value_en_main = 1;
|
402
409
|
|
403
|
-
#line
|
410
|
+
#line 210 "parser.rl"
|
404
411
|
|
405
412
|
|
406
413
|
static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
@@ -408,13 +415,13 @@ static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *resul
|
|
408
415
|
int cs = EVIL;
|
409
416
|
|
410
417
|
|
411
|
-
#line
|
418
|
+
#line 419 "parser.c"
|
412
419
|
{
|
413
420
|
cs = JSON_value_start;
|
414
421
|
}
|
415
|
-
#line
|
422
|
+
#line 217 "parser.rl"
|
416
423
|
|
417
|
-
#line
|
424
|
+
#line 425 "parser.c"
|
418
425
|
{
|
419
426
|
if ( p == pe )
|
420
427
|
goto _out;
|
@@ -424,11 +431,13 @@ case 1:
|
|
424
431
|
switch( (*p) ) {
|
425
432
|
case 34: goto tr0;
|
426
433
|
case 45: goto tr2;
|
427
|
-
case
|
428
|
-
case
|
429
|
-
case
|
430
|
-
case
|
431
|
-
case
|
434
|
+
case 73: goto st2;
|
435
|
+
case 78: goto st9;
|
436
|
+
case 91: goto tr5;
|
437
|
+
case 102: goto st11;
|
438
|
+
case 110: goto st15;
|
439
|
+
case 116: goto st18;
|
440
|
+
case 123: goto tr9;
|
432
441
|
}
|
433
442
|
if ( 48 <= (*p) && (*p) <= 57 )
|
434
443
|
goto tr2;
|
@@ -436,142 +445,234 @@ case 1:
|
|
436
445
|
st0:
|
437
446
|
goto _out0;
|
438
447
|
tr0:
|
439
|
-
#line
|
448
|
+
#line 158 "parser.rl"
|
440
449
|
{
|
441
450
|
char *np = JSON_parse_string(json, p, pe, result);
|
442
|
-
if (np == NULL) goto
|
451
|
+
if (np == NULL) goto _out21; else {p = (( np))-1;}
|
443
452
|
}
|
444
|
-
goto
|
453
|
+
goto st21;
|
445
454
|
tr2:
|
446
|
-
#line
|
455
|
+
#line 163 "parser.rl"
|
447
456
|
{
|
448
457
|
char *np;
|
458
|
+
if(pe > p + 9 && !strncmp(MinusInfinity, p, 9)) {
|
459
|
+
if (json->allow_nan) {
|
460
|
+
*result = CMinusInfinity;
|
461
|
+
{p = (( p + 10))-1;}
|
462
|
+
goto _out21;
|
463
|
+
} else {
|
464
|
+
rb_raise(eParserError, "unexpected token at '%s'", p);
|
465
|
+
}
|
466
|
+
}
|
449
467
|
np = JSON_parse_float(json, p, pe, result);
|
450
468
|
if (np != NULL) {p = (( np))-1;}
|
451
469
|
np = JSON_parse_integer(json, p, pe, result);
|
452
470
|
if (np != NULL) {p = (( np))-1;}
|
453
|
-
goto
|
471
|
+
goto _out21;
|
454
472
|
}
|
455
|
-
goto
|
456
|
-
|
457
|
-
#line
|
473
|
+
goto st21;
|
474
|
+
tr5:
|
475
|
+
#line 181 "parser.rl"
|
458
476
|
{
|
459
477
|
char *np;
|
460
478
|
json->current_nesting += 1;
|
461
479
|
np = JSON_parse_array(json, p, pe, result);
|
462
480
|
json->current_nesting -= 1;
|
463
|
-
if (np == NULL) goto
|
481
|
+
if (np == NULL) goto _out21; else {p = (( np))-1;}
|
464
482
|
}
|
465
|
-
goto
|
466
|
-
|
467
|
-
#line
|
483
|
+
goto st21;
|
484
|
+
tr9:
|
485
|
+
#line 189 "parser.rl"
|
468
486
|
{
|
469
487
|
char *np;
|
470
488
|
json->current_nesting += 1;
|
471
489
|
np = JSON_parse_object(json, p, pe, result);
|
472
490
|
json->current_nesting -= 1;
|
473
|
-
if (np == NULL) goto
|
491
|
+
if (np == NULL) goto _out21; else {p = (( np))-1;}
|
474
492
|
}
|
475
|
-
goto
|
476
|
-
|
477
|
-
#line
|
493
|
+
goto st21;
|
494
|
+
tr16:
|
495
|
+
#line 151 "parser.rl"
|
496
|
+
{
|
497
|
+
if (json->allow_nan) {
|
498
|
+
*result = CInfinity;
|
499
|
+
} else {
|
500
|
+
rb_raise(eParserError, "unexpected token at '%s'", p - 8);
|
501
|
+
}
|
502
|
+
}
|
503
|
+
goto st21;
|
504
|
+
tr18:
|
505
|
+
#line 144 "parser.rl"
|
506
|
+
{
|
507
|
+
if (json->allow_nan) {
|
508
|
+
*result = CNaN;
|
509
|
+
} else {
|
510
|
+
rb_raise(eParserError, "unexpected token at '%s'", p - 2);
|
511
|
+
}
|
512
|
+
}
|
513
|
+
goto st21;
|
514
|
+
tr22:
|
515
|
+
#line 138 "parser.rl"
|
478
516
|
{
|
479
517
|
*result = Qfalse;
|
480
518
|
}
|
481
|
-
goto
|
482
|
-
|
483
|
-
#line
|
519
|
+
goto st21;
|
520
|
+
tr25:
|
521
|
+
#line 135 "parser.rl"
|
484
522
|
{
|
485
523
|
*result = Qnil;
|
486
524
|
}
|
487
|
-
goto
|
488
|
-
|
489
|
-
#line
|
525
|
+
goto st21;
|
526
|
+
tr28:
|
527
|
+
#line 141 "parser.rl"
|
490
528
|
{
|
491
529
|
*result = Qtrue;
|
492
530
|
}
|
493
|
-
goto
|
494
|
-
|
531
|
+
goto st21;
|
532
|
+
st21:
|
495
533
|
if ( ++p == pe )
|
496
|
-
goto
|
497
|
-
case
|
498
|
-
#line
|
499
|
-
{ goto
|
500
|
-
#line
|
534
|
+
goto _out21;
|
535
|
+
case 21:
|
536
|
+
#line 197 "parser.rl"
|
537
|
+
{ goto _out21; }
|
538
|
+
#line 539 "parser.c"
|
501
539
|
goto st0;
|
502
540
|
st2:
|
503
541
|
if ( ++p == pe )
|
504
542
|
goto _out2;
|
505
543
|
case 2:
|
506
|
-
if ( (*p) ==
|
544
|
+
if ( (*p) == 110 )
|
507
545
|
goto st3;
|
508
546
|
goto st0;
|
509
547
|
st3:
|
510
548
|
if ( ++p == pe )
|
511
549
|
goto _out3;
|
512
550
|
case 3:
|
513
|
-
if ( (*p) ==
|
551
|
+
if ( (*p) == 102 )
|
514
552
|
goto st4;
|
515
553
|
goto st0;
|
516
554
|
st4:
|
517
555
|
if ( ++p == pe )
|
518
556
|
goto _out4;
|
519
557
|
case 4:
|
520
|
-
if ( (*p) ==
|
558
|
+
if ( (*p) == 105 )
|
521
559
|
goto st5;
|
522
560
|
goto st0;
|
523
561
|
st5:
|
524
562
|
if ( ++p == pe )
|
525
563
|
goto _out5;
|
526
564
|
case 5:
|
527
|
-
if ( (*p) ==
|
528
|
-
goto
|
565
|
+
if ( (*p) == 110 )
|
566
|
+
goto st6;
|
529
567
|
goto st0;
|
530
568
|
st6:
|
531
569
|
if ( ++p == pe )
|
532
570
|
goto _out6;
|
533
571
|
case 6:
|
534
|
-
if ( (*p) ==
|
572
|
+
if ( (*p) == 105 )
|
535
573
|
goto st7;
|
536
574
|
goto st0;
|
537
575
|
st7:
|
538
576
|
if ( ++p == pe )
|
539
577
|
goto _out7;
|
540
578
|
case 7:
|
541
|
-
if ( (*p) ==
|
579
|
+
if ( (*p) == 116 )
|
542
580
|
goto st8;
|
543
581
|
goto st0;
|
544
582
|
st8:
|
545
583
|
if ( ++p == pe )
|
546
584
|
goto _out8;
|
547
585
|
case 8:
|
548
|
-
if ( (*p) ==
|
549
|
-
goto
|
586
|
+
if ( (*p) == 121 )
|
587
|
+
goto tr16;
|
550
588
|
goto st0;
|
551
589
|
st9:
|
552
590
|
if ( ++p == pe )
|
553
591
|
goto _out9;
|
554
592
|
case 9:
|
555
|
-
if ( (*p) ==
|
593
|
+
if ( (*p) == 97 )
|
556
594
|
goto st10;
|
557
595
|
goto st0;
|
558
596
|
st10:
|
559
597
|
if ( ++p == pe )
|
560
598
|
goto _out10;
|
561
599
|
case 10:
|
562
|
-
if ( (*p) ==
|
563
|
-
goto
|
600
|
+
if ( (*p) == 78 )
|
601
|
+
goto tr18;
|
564
602
|
goto st0;
|
565
603
|
st11:
|
566
604
|
if ( ++p == pe )
|
567
605
|
goto _out11;
|
568
606
|
case 11:
|
607
|
+
if ( (*p) == 97 )
|
608
|
+
goto st12;
|
609
|
+
goto st0;
|
610
|
+
st12:
|
611
|
+
if ( ++p == pe )
|
612
|
+
goto _out12;
|
613
|
+
case 12:
|
614
|
+
if ( (*p) == 108 )
|
615
|
+
goto st13;
|
616
|
+
goto st0;
|
617
|
+
st13:
|
618
|
+
if ( ++p == pe )
|
619
|
+
goto _out13;
|
620
|
+
case 13:
|
621
|
+
if ( (*p) == 115 )
|
622
|
+
goto st14;
|
623
|
+
goto st0;
|
624
|
+
st14:
|
625
|
+
if ( ++p == pe )
|
626
|
+
goto _out14;
|
627
|
+
case 14:
|
628
|
+
if ( (*p) == 101 )
|
629
|
+
goto tr22;
|
630
|
+
goto st0;
|
631
|
+
st15:
|
632
|
+
if ( ++p == pe )
|
633
|
+
goto _out15;
|
634
|
+
case 15:
|
635
|
+
if ( (*p) == 117 )
|
636
|
+
goto st16;
|
637
|
+
goto st0;
|
638
|
+
st16:
|
639
|
+
if ( ++p == pe )
|
640
|
+
goto _out16;
|
641
|
+
case 16:
|
642
|
+
if ( (*p) == 108 )
|
643
|
+
goto st17;
|
644
|
+
goto st0;
|
645
|
+
st17:
|
646
|
+
if ( ++p == pe )
|
647
|
+
goto _out17;
|
648
|
+
case 17:
|
649
|
+
if ( (*p) == 108 )
|
650
|
+
goto tr25;
|
651
|
+
goto st0;
|
652
|
+
st18:
|
653
|
+
if ( ++p == pe )
|
654
|
+
goto _out18;
|
655
|
+
case 18:
|
656
|
+
if ( (*p) == 114 )
|
657
|
+
goto st19;
|
658
|
+
goto st0;
|
659
|
+
st19:
|
660
|
+
if ( ++p == pe )
|
661
|
+
goto _out19;
|
662
|
+
case 19:
|
663
|
+
if ( (*p) == 117 )
|
664
|
+
goto st20;
|
665
|
+
goto st0;
|
666
|
+
st20:
|
667
|
+
if ( ++p == pe )
|
668
|
+
goto _out20;
|
669
|
+
case 20:
|
569
670
|
if ( (*p) == 101 )
|
570
|
-
goto
|
671
|
+
goto tr28;
|
571
672
|
goto st0;
|
572
673
|
}
|
573
674
|
_out0: cs = 0; goto _out;
|
574
|
-
|
675
|
+
_out21: cs = 21; goto _out;
|
575
676
|
_out2: cs = 2; goto _out;
|
576
677
|
_out3: cs = 3; goto _out;
|
577
678
|
_out4: cs = 4; goto _out;
|
@@ -582,10 +683,19 @@ case 11:
|
|
582
683
|
_out9: cs = 9; goto _out;
|
583
684
|
_out10: cs = 10; goto _out;
|
584
685
|
_out11: cs = 11; goto _out;
|
686
|
+
_out12: cs = 12; goto _out;
|
687
|
+
_out13: cs = 13; goto _out;
|
688
|
+
_out14: cs = 14; goto _out;
|
689
|
+
_out15: cs = 15; goto _out;
|
690
|
+
_out16: cs = 16; goto _out;
|
691
|
+
_out17: cs = 17; goto _out;
|
692
|
+
_out18: cs = 18; goto _out;
|
693
|
+
_out19: cs = 19; goto _out;
|
694
|
+
_out20: cs = 20; goto _out;
|
585
695
|
|
586
696
|
_out: {}
|
587
697
|
}
|
588
|
-
#line
|
698
|
+
#line 218 "parser.rl"
|
589
699
|
|
590
700
|
if (cs >= JSON_value_first_final) {
|
591
701
|
return p;
|
@@ -595,14 +705,14 @@ case 11:
|
|
595
705
|
}
|
596
706
|
|
597
707
|
|
598
|
-
#line
|
708
|
+
#line 709 "parser.c"
|
599
709
|
static const int JSON_integer_start = 1;
|
600
710
|
static const int JSON_integer_first_final = 5;
|
601
711
|
static const int JSON_integer_error = 0;
|
602
712
|
|
603
713
|
static const int JSON_integer_en_main = 1;
|
604
714
|
|
605
|
-
#line
|
715
|
+
#line 234 "parser.rl"
|
606
716
|
|
607
717
|
|
608
718
|
static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
@@ -610,14 +720,14 @@ static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *res
|
|
610
720
|
int cs = EVIL;
|
611
721
|
|
612
722
|
|
613
|
-
#line
|
723
|
+
#line 724 "parser.c"
|
614
724
|
{
|
615
725
|
cs = JSON_integer_start;
|
616
726
|
}
|
617
|
-
#line
|
727
|
+
#line 241 "parser.rl"
|
618
728
|
json->memo = p;
|
619
729
|
|
620
|
-
#line
|
730
|
+
#line 731 "parser.c"
|
621
731
|
{
|
622
732
|
if ( p == pe )
|
623
733
|
goto _out;
|
@@ -650,14 +760,14 @@ case 3:
|
|
650
760
|
goto st0;
|
651
761
|
goto tr4;
|
652
762
|
tr4:
|
653
|
-
#line
|
763
|
+
#line 231 "parser.rl"
|
654
764
|
{ goto _out5; }
|
655
765
|
goto st5;
|
656
766
|
st5:
|
657
767
|
if ( ++p == pe )
|
658
768
|
goto _out5;
|
659
769
|
case 5:
|
660
|
-
#line
|
770
|
+
#line 771 "parser.c"
|
661
771
|
goto st0;
|
662
772
|
st4:
|
663
773
|
if ( ++p == pe )
|
@@ -675,7 +785,7 @@ case 4:
|
|
675
785
|
|
676
786
|
_out: {}
|
677
787
|
}
|
678
|
-
#line
|
788
|
+
#line 243 "parser.rl"
|
679
789
|
|
680
790
|
if (cs >= JSON_integer_first_final) {
|
681
791
|
long len = p - json->memo;
|
@@ -687,14 +797,14 @@ case 4:
|
|
687
797
|
}
|
688
798
|
|
689
799
|
|
690
|
-
#line
|
800
|
+
#line 801 "parser.c"
|
691
801
|
static const int JSON_float_start = 1;
|
692
802
|
static const int JSON_float_first_final = 10;
|
693
803
|
static const int JSON_float_error = 0;
|
694
804
|
|
695
805
|
static const int JSON_float_en_main = 1;
|
696
806
|
|
697
|
-
#line
|
807
|
+
#line 265 "parser.rl"
|
698
808
|
|
699
809
|
|
700
810
|
static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
@@ -702,14 +812,14 @@ static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *resul
|
|
702
812
|
int cs = EVIL;
|
703
813
|
|
704
814
|
|
705
|
-
#line
|
815
|
+
#line 816 "parser.c"
|
706
816
|
{
|
707
817
|
cs = JSON_float_start;
|
708
818
|
}
|
709
|
-
#line
|
819
|
+
#line 272 "parser.rl"
|
710
820
|
json->memo = p;
|
711
821
|
|
712
|
-
#line
|
822
|
+
#line 823 "parser.c"
|
713
823
|
{
|
714
824
|
if ( p == pe )
|
715
825
|
goto _out;
|
@@ -766,14 +876,14 @@ case 5:
|
|
766
876
|
goto st0;
|
767
877
|
goto tr7;
|
768
878
|
tr7:
|
769
|
-
#line
|
879
|
+
#line 259 "parser.rl"
|
770
880
|
{ goto _out10; }
|
771
881
|
goto st10;
|
772
882
|
st10:
|
773
883
|
if ( ++p == pe )
|
774
884
|
goto _out10;
|
775
885
|
case 10:
|
776
|
-
#line
|
886
|
+
#line 887 "parser.c"
|
777
887
|
goto st0;
|
778
888
|
st6:
|
779
889
|
if ( ++p == pe )
|
@@ -833,7 +943,7 @@ case 9:
|
|
833
943
|
|
834
944
|
_out: {}
|
835
945
|
}
|
836
|
-
#line
|
946
|
+
#line 274 "parser.rl"
|
837
947
|
|
838
948
|
if (cs >= JSON_float_first_final) {
|
839
949
|
long len = p - json->memo;
|
@@ -846,14 +956,14 @@ case 9:
|
|
846
956
|
|
847
957
|
|
848
958
|
|
849
|
-
#line
|
959
|
+
#line 960 "parser.c"
|
850
960
|
static const int JSON_array_start = 1;
|
851
961
|
static const int JSON_array_first_final = 17;
|
852
962
|
static const int JSON_array_error = 0;
|
853
963
|
|
854
964
|
static const int JSON_array_en_main = 1;
|
855
965
|
|
856
|
-
#line
|
966
|
+
#line 310 "parser.rl"
|
857
967
|
|
858
968
|
|
859
969
|
static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
@@ -866,13 +976,13 @@ static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *resul
|
|
866
976
|
*result = rb_ary_new();
|
867
977
|
|
868
978
|
|
869
|
-
#line
|
979
|
+
#line 980 "parser.c"
|
870
980
|
{
|
871
981
|
cs = JSON_array_start;
|
872
982
|
}
|
873
|
-
#line
|
983
|
+
#line 322 "parser.rl"
|
874
984
|
|
875
|
-
#line
|
985
|
+
#line 986 "parser.c"
|
876
986
|
{
|
877
987
|
if ( p == pe )
|
878
988
|
goto _out;
|
@@ -894,6 +1004,8 @@ case 2:
|
|
894
1004
|
case 34: goto tr2;
|
895
1005
|
case 45: goto tr2;
|
896
1006
|
case 47: goto st13;
|
1007
|
+
case 73: goto tr2;
|
1008
|
+
case 78: goto tr2;
|
897
1009
|
case 91: goto tr2;
|
898
1010
|
case 93: goto tr4;
|
899
1011
|
case 102: goto tr2;
|
@@ -908,7 +1020,7 @@ case 2:
|
|
908
1020
|
goto st2;
|
909
1021
|
goto st0;
|
910
1022
|
tr2:
|
911
|
-
#line
|
1023
|
+
#line 291 "parser.rl"
|
912
1024
|
{
|
913
1025
|
VALUE v = Qnil;
|
914
1026
|
char *np = JSON_parse_value(json, p, pe, &v);
|
@@ -924,7 +1036,7 @@ st3:
|
|
924
1036
|
if ( ++p == pe )
|
925
1037
|
goto _out3;
|
926
1038
|
case 3:
|
927
|
-
#line
|
1039
|
+
#line 1040 "parser.c"
|
928
1040
|
switch( (*p) ) {
|
929
1041
|
case 13: goto st3;
|
930
1042
|
case 32: goto st3;
|
@@ -945,6 +1057,8 @@ case 4:
|
|
945
1057
|
case 34: goto tr2;
|
946
1058
|
case 45: goto tr2;
|
947
1059
|
case 47: goto st5;
|
1060
|
+
case 73: goto tr2;
|
1061
|
+
case 78: goto tr2;
|
948
1062
|
case 91: goto tr2;
|
949
1063
|
case 102: goto tr2;
|
950
1064
|
case 110: goto tr2;
|
@@ -1022,14 +1136,14 @@ case 12:
|
|
1022
1136
|
goto st3;
|
1023
1137
|
goto st12;
|
1024
1138
|
tr4:
|
1025
|
-
#line
|
1139
|
+
#line 302 "parser.rl"
|
1026
1140
|
{ goto _out17; }
|
1027
1141
|
goto st17;
|
1028
1142
|
st17:
|
1029
1143
|
if ( ++p == pe )
|
1030
1144
|
goto _out17;
|
1031
1145
|
case 17:
|
1032
|
-
#line
|
1146
|
+
#line 1147 "parser.c"
|
1033
1147
|
goto st0;
|
1034
1148
|
st13:
|
1035
1149
|
if ( ++p == pe )
|
@@ -1084,7 +1198,7 @@ case 16:
|
|
1084
1198
|
|
1085
1199
|
_out: {}
|
1086
1200
|
}
|
1087
|
-
#line
|
1201
|
+
#line 323 "parser.rl"
|
1088
1202
|
|
1089
1203
|
if(cs >= JSON_array_first_final) {
|
1090
1204
|
return p + 1;
|
@@ -1150,14 +1264,14 @@ static VALUE json_string_unescape(char *p, char *pe)
|
|
1150
1264
|
}
|
1151
1265
|
|
1152
1266
|
|
1153
|
-
#line
|
1267
|
+
#line 1268 "parser.c"
|
1154
1268
|
static const int JSON_string_start = 1;
|
1155
1269
|
static const int JSON_string_first_final = 8;
|
1156
1270
|
static const int JSON_string_error = 0;
|
1157
1271
|
|
1158
1272
|
static const int JSON_string_en_main = 1;
|
1159
1273
|
|
1160
|
-
#line
|
1274
|
+
#line 401 "parser.rl"
|
1161
1275
|
|
1162
1276
|
|
1163
1277
|
static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
@@ -1166,14 +1280,14 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
|
|
1166
1280
|
|
1167
1281
|
*result = rb_str_new("", 0);
|
1168
1282
|
|
1169
|
-
#line
|
1283
|
+
#line 1284 "parser.c"
|
1170
1284
|
{
|
1171
1285
|
cs = JSON_string_start;
|
1172
1286
|
}
|
1173
|
-
#line
|
1287
|
+
#line 409 "parser.rl"
|
1174
1288
|
json->memo = p;
|
1175
1289
|
|
1176
|
-
#line
|
1290
|
+
#line 1291 "parser.c"
|
1177
1291
|
{
|
1178
1292
|
if ( p == pe )
|
1179
1293
|
goto _out;
|
@@ -1197,19 +1311,19 @@ case 2:
|
|
1197
1311
|
goto st0;
|
1198
1312
|
goto st2;
|
1199
1313
|
tr2:
|
1200
|
-
#line
|
1314
|
+
#line 393 "parser.rl"
|
1201
1315
|
{
|
1202
1316
|
*result = json_string_unescape(json->memo + 1, p);
|
1203
1317
|
if (NIL_P(*result)) goto _out8; else {p = (( p + 1))-1;}
|
1204
1318
|
}
|
1205
|
-
#line
|
1319
|
+
#line 398 "parser.rl"
|
1206
1320
|
{ goto _out8; }
|
1207
1321
|
goto st8;
|
1208
1322
|
st8:
|
1209
1323
|
if ( ++p == pe )
|
1210
1324
|
goto _out8;
|
1211
1325
|
case 8:
|
1212
|
-
#line
|
1326
|
+
#line 1327 "parser.c"
|
1213
1327
|
goto st0;
|
1214
1328
|
st3:
|
1215
1329
|
if ( ++p == pe )
|
@@ -1284,7 +1398,7 @@ case 7:
|
|
1284
1398
|
|
1285
1399
|
_out: {}
|
1286
1400
|
}
|
1287
|
-
#line
|
1401
|
+
#line 411 "parser.rl"
|
1288
1402
|
|
1289
1403
|
if (cs >= JSON_string_first_final) {
|
1290
1404
|
return p + 1;
|
@@ -1295,14 +1409,14 @@ case 7:
|
|
1295
1409
|
|
1296
1410
|
|
1297
1411
|
|
1298
|
-
#line
|
1412
|
+
#line 1413 "parser.c"
|
1299
1413
|
static const int JSON_start = 1;
|
1300
1414
|
static const int JSON_first_final = 10;
|
1301
1415
|
static const int JSON_error = 0;
|
1302
1416
|
|
1303
1417
|
static const int JSON_en_main = 1;
|
1304
1418
|
|
1305
|
-
#line
|
1419
|
+
#line 445 "parser.rl"
|
1306
1420
|
|
1307
1421
|
|
1308
1422
|
/*
|
@@ -1329,7 +1443,11 @@ static const int JSON_en_main = 1;
|
|
1329
1443
|
*
|
1330
1444
|
* _opts_ can have the following keys:
|
1331
1445
|
* * *max_nesting*: The maximum depth of nesting allowed in the parsed data
|
1332
|
-
* structures. Disable depth checking with :max_nesting => false
|
1446
|
+
* structures. Disable depth checking with :max_nesting => false|nil|0, it
|
1447
|
+
* defaults to 19.
|
1448
|
+
* * *allow_nan*: If set to true, allow NaN, Infinity and -Infinity in
|
1449
|
+
* defiance of RFC 4627 to be parsed by the Parser. This option defaults to
|
1450
|
+
* false.
|
1333
1451
|
*/
|
1334
1452
|
static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
|
1335
1453
|
{
|
@@ -1345,14 +1463,15 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
|
|
1345
1463
|
rb_raise(eParserError, "A JSON text must at least contain two octets!");
|
1346
1464
|
}
|
1347
1465
|
json->max_nesting = 19;
|
1466
|
+
json->allow_nan = 0;
|
1348
1467
|
if (!NIL_P(opts)) {
|
1349
1468
|
opts = rb_convert_type(opts, T_HASH, "Hash", "to_hash");
|
1350
1469
|
if (NIL_P(opts)) {
|
1351
1470
|
rb_raise(rb_eArgError, "opts needs to be like a hash");
|
1352
1471
|
} else {
|
1353
|
-
VALUE
|
1354
|
-
if (st_lookup(RHASH(opts)->tbl,
|
1355
|
-
VALUE max_nesting = rb_hash_aref(opts,
|
1472
|
+
VALUE tmp = ID2SYM(i_max_nesting);
|
1473
|
+
if (st_lookup(RHASH(opts)->tbl, tmp, 0)) {
|
1474
|
+
VALUE max_nesting = rb_hash_aref(opts, tmp);
|
1356
1475
|
if (RTEST(max_nesting)) {
|
1357
1476
|
Check_Type(max_nesting, T_FIXNUM);
|
1358
1477
|
json->max_nesting = FIX2INT(max_nesting);
|
@@ -1360,6 +1479,11 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
|
|
1360
1479
|
json->max_nesting = 0;
|
1361
1480
|
}
|
1362
1481
|
}
|
1482
|
+
tmp = ID2SYM(i_allow_nan);
|
1483
|
+
if (st_lookup(RHASH(opts)->tbl, tmp, 0)) {
|
1484
|
+
VALUE allow_nan = rb_hash_aref(opts, tmp);
|
1485
|
+
if (RTEST(allow_nan)) json->allow_nan = 1;
|
1486
|
+
}
|
1363
1487
|
}
|
1364
1488
|
}
|
1365
1489
|
json->current_nesting = 0;
|
@@ -1396,15 +1520,15 @@ static VALUE cParser_parse(VALUE self)
|
|
1396
1520
|
GET_STRUCT;
|
1397
1521
|
|
1398
1522
|
|
1399
|
-
#line
|
1523
|
+
#line 1524 "parser.c"
|
1400
1524
|
{
|
1401
1525
|
cs = JSON_start;
|
1402
1526
|
}
|
1403
|
-
#line
|
1527
|
+
#line 548 "parser.rl"
|
1404
1528
|
p = json->source;
|
1405
1529
|
pe = p + json->len;
|
1406
1530
|
|
1407
|
-
#line
|
1531
|
+
#line 1532 "parser.c"
|
1408
1532
|
{
|
1409
1533
|
if ( p == pe )
|
1410
1534
|
goto _out;
|
@@ -1459,7 +1583,7 @@ case 5:
|
|
1459
1583
|
goto st1;
|
1460
1584
|
goto st5;
|
1461
1585
|
tr3:
|
1462
|
-
#line
|
1586
|
+
#line 434 "parser.rl"
|
1463
1587
|
{
|
1464
1588
|
char *np;
|
1465
1589
|
json->current_nesting = 1;
|
@@ -1468,7 +1592,7 @@ tr3:
|
|
1468
1592
|
}
|
1469
1593
|
goto st10;
|
1470
1594
|
tr4:
|
1471
|
-
#line
|
1595
|
+
#line 427 "parser.rl"
|
1472
1596
|
{
|
1473
1597
|
char *np;
|
1474
1598
|
json->current_nesting = 1;
|
@@ -1480,7 +1604,7 @@ st10:
|
|
1480
1604
|
if ( ++p == pe )
|
1481
1605
|
goto _out10;
|
1482
1606
|
case 10:
|
1483
|
-
#line
|
1607
|
+
#line 1608 "parser.c"
|
1484
1608
|
switch( (*p) ) {
|
1485
1609
|
case 13: goto st10;
|
1486
1610
|
case 32: goto st10;
|
@@ -1536,7 +1660,7 @@ case 9:
|
|
1536
1660
|
|
1537
1661
|
_out: {}
|
1538
1662
|
}
|
1539
|
-
#line
|
1663
|
+
#line 551 "parser.rl"
|
1540
1664
|
|
1541
1665
|
if (cs >= JSON_first_final && p == pe) {
|
1542
1666
|
return result;
|
@@ -1593,9 +1717,14 @@ void Init_parser()
|
|
1593
1717
|
rb_define_method(cParser, "parse", cParser_parse, 0);
|
1594
1718
|
rb_define_method(cParser, "source", cParser_source, 0);
|
1595
1719
|
|
1720
|
+
CNaN = rb_const_get(mJSON, rb_intern("NaN"));
|
1721
|
+
CInfinity = rb_const_get(mJSON, rb_intern("Infinity"));
|
1722
|
+
CMinusInfinity = rb_const_get(mJSON, rb_intern("MinusInfinity"));
|
1723
|
+
|
1596
1724
|
i_json_creatable_p = rb_intern("json_creatable?");
|
1597
1725
|
i_json_create = rb_intern("json_create");
|
1598
1726
|
i_create_id = rb_intern("create_id");
|
1599
1727
|
i_chr = rb_intern("chr");
|
1600
1728
|
i_max_nesting = rb_intern("max_nesting");
|
1729
|
+
i_allow_nan = rb_intern("allow_nan");
|
1601
1730
|
}
|