json 2.0.4 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -27,7 +27,7 @@ enc_raise(rb_encoding *enc, VALUE exc, const char *fmt, ...)
27
27
 
28
28
  /* unicode */
29
29
 
30
- static const char digit_values[256] = {
30
+ static const signed char digit_values[256] = {
31
31
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
32
32
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
33
33
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1,
@@ -46,7 +46,7 @@ static const char digit_values[256] = {
46
46
 
47
47
  static UTF32 unescape_unicode(const unsigned char *p)
48
48
  {
49
- char b;
49
+ signed char b;
50
50
  UTF32 result = 0;
51
51
  b = digit_values[p[0]];
52
52
  if (b < 0) return UNI_REPLACEMENT_CHAR;
@@ -91,18 +91,20 @@ static int convert_UTF32_to_UTF8(char *buf, UTF32 ch)
91
91
 
92
92
  static VALUE mJSON, mExt, cParser, eParserError, eNestingError;
93
93
  static VALUE CNaN, CInfinity, CMinusInfinity;
94
+ static VALUE cBigDecimal = Qundef;
94
95
 
95
96
  static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions,
96
97
  i_chr, i_max_nesting, i_allow_nan, i_symbolize_names,
97
- i_object_class, i_array_class, i_key_p, i_deep_const_get, i_match,
98
- i_match_string, i_aset, i_aref, i_leftshift;
98
+ i_object_class, i_array_class, i_decimal_class, i_key_p,
99
+ i_deep_const_get, i_match, i_match_string, i_aset, i_aref,
100
+ i_leftshift, i_new, i_BigDecimal;
99
101
 
100
102
 
101
- #line 124 "parser.rl"
103
+ #line 126 "parser.rl"
102
104
 
103
105
 
104
106
 
105
- #line 106 "parser.c"
107
+ #line 108 "parser.c"
106
108
  enum {JSON_object_start = 1};
107
109
  enum {JSON_object_first_final = 27};
108
110
  enum {JSON_object_error = 0};
@@ -110,7 +112,7 @@ enum {JSON_object_error = 0};
110
112
  enum {JSON_object_en_main = 1};
111
113
 
112
114
 
113
- #line 165 "parser.rl"
115
+ #line 167 "parser.rl"
114
116
 
115
117
 
116
118
  static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting)
@@ -126,14 +128,14 @@ static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *resu
126
128
  *result = NIL_P(object_class) ? rb_hash_new() : rb_class_new_instance(0, 0, object_class);
127
129
 
128
130
 
129
- #line 130 "parser.c"
131
+ #line 132 "parser.c"
130
132
  {
131
133
  cs = JSON_object_start;
132
134
  }
133
135
 
134
- #line 180 "parser.rl"
136
+ #line 182 "parser.rl"
135
137
 
136
- #line 137 "parser.c"
138
+ #line 139 "parser.c"
137
139
  {
138
140
  if ( p == pe )
139
141
  goto _test_eof;
@@ -161,7 +163,7 @@ case 2:
161
163
  goto st2;
162
164
  goto st0;
163
165
  tr2:
164
- #line 147 "parser.rl"
166
+ #line 149 "parser.rl"
165
167
  {
166
168
  char *np;
167
169
  json->parsing_name = 1;
@@ -174,7 +176,7 @@ st3:
174
176
  if ( ++p == pe )
175
177
  goto _test_eof3;
176
178
  case 3:
177
- #line 178 "parser.c"
179
+ #line 180 "parser.c"
178
180
  switch( (*p) ) {
179
181
  case 13: goto st3;
180
182
  case 32: goto st3;
@@ -241,7 +243,7 @@ case 8:
241
243
  goto st8;
242
244
  goto st0;
243
245
  tr11:
244
- #line 132 "parser.rl"
246
+ #line 134 "parser.rl"
245
247
  {
246
248
  VALUE v = Qnil;
247
249
  char *np = JSON_parse_value(json, p, pe, &v, current_nesting);
@@ -261,7 +263,7 @@ st9:
261
263
  if ( ++p == pe )
262
264
  goto _test_eof9;
263
265
  case 9:
264
- #line 265 "parser.c"
266
+ #line 267 "parser.c"
265
267
  switch( (*p) ) {
266
268
  case 13: goto st9;
267
269
  case 32: goto st9;
@@ -350,14 +352,14 @@ case 18:
350
352
  goto st9;
351
353
  goto st18;
352
354
  tr4:
353
- #line 155 "parser.rl"
355
+ #line 157 "parser.rl"
354
356
  { p--; {p++; cs = 27; goto _out;} }
355
357
  goto st27;
356
358
  st27:
357
359
  if ( ++p == pe )
358
360
  goto _test_eof27;
359
361
  case 27:
360
- #line 361 "parser.c"
362
+ #line 363 "parser.c"
361
363
  goto st0;
362
364
  st19:
363
365
  if ( ++p == pe )
@@ -455,7 +457,7 @@ case 26:
455
457
  _out: {}
456
458
  }
457
459
 
458
- #line 181 "parser.rl"
460
+ #line 183 "parser.rl"
459
461
 
460
462
  if (cs >= JSON_object_first_final) {
461
463
  if (json->create_additions) {
@@ -480,7 +482,7 @@ case 26:
480
482
 
481
483
 
482
484
 
483
- #line 484 "parser.c"
485
+ #line 486 "parser.c"
484
486
  enum {JSON_value_start = 1};
485
487
  enum {JSON_value_first_final = 29};
486
488
  enum {JSON_value_error = 0};
@@ -488,7 +490,7 @@ enum {JSON_value_error = 0};
488
490
  enum {JSON_value_en_main = 1};
489
491
 
490
492
 
491
- #line 281 "parser.rl"
493
+ #line 283 "parser.rl"
492
494
 
493
495
 
494
496
  static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting)
@@ -496,14 +498,14 @@ static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *resul
496
498
  int cs = EVIL;
497
499
 
498
500
 
499
- #line 500 "parser.c"
501
+ #line 502 "parser.c"
500
502
  {
501
503
  cs = JSON_value_start;
502
504
  }
503
505
 
504
- #line 288 "parser.rl"
506
+ #line 290 "parser.rl"
505
507
 
506
- #line 507 "parser.c"
508
+ #line 509 "parser.c"
507
509
  {
508
510
  if ( p == pe )
509
511
  goto _test_eof;
@@ -537,14 +539,14 @@ st0:
537
539
  cs = 0;
538
540
  goto _out;
539
541
  tr2:
540
- #line 233 "parser.rl"
542
+ #line 235 "parser.rl"
541
543
  {
542
544
  char *np = JSON_parse_string(json, p, pe, result);
543
545
  if (np == NULL) { p--; {p++; cs = 29; goto _out;} } else {p = (( np))-1;}
544
546
  }
545
547
  goto st29;
546
548
  tr3:
547
- #line 238 "parser.rl"
549
+ #line 240 "parser.rl"
548
550
  {
549
551
  char *np;
550
552
  if(pe > p + 8 && !strncmp(MinusInfinity, p, 9)) {
@@ -564,7 +566,7 @@ tr3:
564
566
  }
565
567
  goto st29;
566
568
  tr7:
567
- #line 256 "parser.rl"
569
+ #line 258 "parser.rl"
568
570
  {
569
571
  char *np;
570
572
  np = JSON_parse_array(json, p, pe, result, current_nesting + 1);
@@ -572,7 +574,7 @@ tr7:
572
574
  }
573
575
  goto st29;
574
576
  tr11:
575
- #line 262 "parser.rl"
577
+ #line 264 "parser.rl"
576
578
  {
577
579
  char *np;
578
580
  np = JSON_parse_object(json, p, pe, result, current_nesting + 1);
@@ -580,7 +582,7 @@ tr11:
580
582
  }
581
583
  goto st29;
582
584
  tr25:
583
- #line 226 "parser.rl"
585
+ #line 228 "parser.rl"
584
586
  {
585
587
  if (json->allow_nan) {
586
588
  *result = CInfinity;
@@ -590,7 +592,7 @@ tr25:
590
592
  }
591
593
  goto st29;
592
594
  tr27:
593
- #line 219 "parser.rl"
595
+ #line 221 "parser.rl"
594
596
  {
595
597
  if (json->allow_nan) {
596
598
  *result = CNaN;
@@ -600,19 +602,19 @@ tr27:
600
602
  }
601
603
  goto st29;
602
604
  tr31:
603
- #line 213 "parser.rl"
605
+ #line 215 "parser.rl"
604
606
  {
605
607
  *result = Qfalse;
606
608
  }
607
609
  goto st29;
608
610
  tr34:
609
- #line 210 "parser.rl"
611
+ #line 212 "parser.rl"
610
612
  {
611
613
  *result = Qnil;
612
614
  }
613
615
  goto st29;
614
616
  tr37:
615
- #line 216 "parser.rl"
617
+ #line 218 "parser.rl"
616
618
  {
617
619
  *result = Qtrue;
618
620
  }
@@ -621,9 +623,9 @@ st29:
621
623
  if ( ++p == pe )
622
624
  goto _test_eof29;
623
625
  case 29:
624
- #line 268 "parser.rl"
626
+ #line 270 "parser.rl"
625
627
  { p--; {p++; cs = 29; goto _out;} }
626
- #line 627 "parser.c"
628
+ #line 629 "parser.c"
627
629
  switch( (*p) ) {
628
630
  case 13: goto st29;
629
631
  case 32: goto st29;
@@ -864,7 +866,7 @@ case 28:
864
866
  _out: {}
865
867
  }
866
868
 
867
- #line 289 "parser.rl"
869
+ #line 291 "parser.rl"
868
870
 
869
871
  if (cs >= JSON_value_first_final) {
870
872
  return p;
@@ -874,7 +876,7 @@ case 28:
874
876
  }
875
877
 
876
878
 
877
- #line 878 "parser.c"
879
+ #line 880 "parser.c"
878
880
  enum {JSON_integer_start = 1};
879
881
  enum {JSON_integer_first_final = 3};
880
882
  enum {JSON_integer_error = 0};
@@ -882,7 +884,7 @@ enum {JSON_integer_error = 0};
882
884
  enum {JSON_integer_en_main = 1};
883
885
 
884
886
 
885
- #line 305 "parser.rl"
887
+ #line 307 "parser.rl"
886
888
 
887
889
 
888
890
  static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result)
@@ -890,15 +892,15 @@ static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *res
890
892
  int cs = EVIL;
891
893
 
892
894
 
893
- #line 894 "parser.c"
895
+ #line 896 "parser.c"
894
896
  {
895
897
  cs = JSON_integer_start;
896
898
  }
897
899
 
898
- #line 312 "parser.rl"
900
+ #line 314 "parser.rl"
899
901
  json->memo = p;
900
902
 
901
- #line 902 "parser.c"
903
+ #line 904 "parser.c"
902
904
  {
903
905
  if ( p == pe )
904
906
  goto _test_eof;
@@ -932,14 +934,14 @@ case 3:
932
934
  goto st0;
933
935
  goto tr4;
934
936
  tr4:
935
- #line 302 "parser.rl"
937
+ #line 304 "parser.rl"
936
938
  { p--; {p++; cs = 4; goto _out;} }
937
939
  goto st4;
938
940
  st4:
939
941
  if ( ++p == pe )
940
942
  goto _test_eof4;
941
943
  case 4:
942
- #line 943 "parser.c"
944
+ #line 945 "parser.c"
943
945
  goto st0;
944
946
  st5:
945
947
  if ( ++p == pe )
@@ -958,7 +960,7 @@ case 5:
958
960
  _out: {}
959
961
  }
960
962
 
961
- #line 314 "parser.rl"
963
+ #line 316 "parser.rl"
962
964
 
963
965
  if (cs >= JSON_integer_first_final) {
964
966
  long len = p - json->memo;
@@ -973,7 +975,7 @@ case 5:
973
975
  }
974
976
 
975
977
 
976
- #line 977 "parser.c"
978
+ #line 979 "parser.c"
977
979
  enum {JSON_float_start = 1};
978
980
  enum {JSON_float_first_final = 8};
979
981
  enum {JSON_float_error = 0};
@@ -981,23 +983,36 @@ enum {JSON_float_error = 0};
981
983
  enum {JSON_float_en_main = 1};
982
984
 
983
985
 
984
- #line 339 "parser.rl"
986
+ #line 341 "parser.rl"
985
987
 
986
988
 
989
+ static int is_bigdecimal_class(VALUE obj)
990
+ {
991
+ if (cBigDecimal == Qundef) {
992
+ if (rb_const_defined(rb_cObject, i_BigDecimal)) {
993
+ cBigDecimal = rb_const_get_at(rb_cObject, i_BigDecimal);
994
+ }
995
+ else {
996
+ return 0;
997
+ }
998
+ }
999
+ return obj == cBigDecimal;
1000
+ }
1001
+
987
1002
  static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result)
988
1003
  {
989
1004
  int cs = EVIL;
990
1005
 
991
1006
 
992
- #line 993 "parser.c"
1007
+ #line 1008 "parser.c"
993
1008
  {
994
1009
  cs = JSON_float_start;
995
1010
  }
996
1011
 
997
- #line 346 "parser.rl"
1012
+ #line 361 "parser.rl"
998
1013
  json->memo = p;
999
1014
 
1000
- #line 1001 "parser.c"
1015
+ #line 1016 "parser.c"
1001
1016
  {
1002
1017
  if ( p == pe )
1003
1018
  goto _test_eof;
@@ -1055,14 +1070,14 @@ case 8:
1055
1070
  goto st0;
1056
1071
  goto tr9;
1057
1072
  tr9:
1058
- #line 333 "parser.rl"
1073
+ #line 335 "parser.rl"
1059
1074
  { p--; {p++; cs = 9; goto _out;} }
1060
1075
  goto st9;
1061
1076
  st9:
1062
1077
  if ( ++p == pe )
1063
1078
  goto _test_eof9;
1064
1079
  case 9:
1065
- #line 1066 "parser.c"
1080
+ #line 1081 "parser.c"
1066
1081
  goto st0;
1067
1082
  st5:
1068
1083
  if ( ++p == pe )
@@ -1123,14 +1138,24 @@ case 7:
1123
1138
  _out: {}
1124
1139
  }
1125
1140
 
1126
- #line 348 "parser.rl"
1141
+ #line 363 "parser.rl"
1127
1142
 
1128
1143
  if (cs >= JSON_float_first_final) {
1129
1144
  long len = p - json->memo;
1130
1145
  fbuffer_clear(json->fbuffer);
1131
1146
  fbuffer_append(json->fbuffer, json->memo, len);
1132
1147
  fbuffer_append_char(json->fbuffer, '\0');
1133
- *result = rb_float_new(rb_cstr_to_dbl(FBUFFER_PTR(json->fbuffer), 1));
1148
+ if (NIL_P(json->decimal_class)) {
1149
+ *result = rb_float_new(rb_cstr_to_dbl(FBUFFER_PTR(json->fbuffer), 1));
1150
+ } else {
1151
+ VALUE text;
1152
+ text = rb_str_new2(FBUFFER_PTR(json->fbuffer));
1153
+ if (is_bigdecimal_class(json->decimal_class)) {
1154
+ *result = rb_funcall(Qnil, i_BigDecimal, 1, text);
1155
+ } else {
1156
+ *result = rb_funcall(json->decimal_class, i_new, 1, text);
1157
+ }
1158
+ }
1134
1159
  return p + 1;
1135
1160
  } else {
1136
1161
  return NULL;
@@ -1139,7 +1164,7 @@ case 7:
1139
1164
 
1140
1165
 
1141
1166
 
1142
- #line 1143 "parser.c"
1167
+ #line 1168 "parser.c"
1143
1168
  enum {JSON_array_start = 1};
1144
1169
  enum {JSON_array_first_final = 17};
1145
1170
  enum {JSON_array_error = 0};
@@ -1147,7 +1172,7 @@ enum {JSON_array_error = 0};
1147
1172
  enum {JSON_array_en_main = 1};
1148
1173
 
1149
1174
 
1150
- #line 391 "parser.rl"
1175
+ #line 416 "parser.rl"
1151
1176
 
1152
1177
 
1153
1178
  static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting)
@@ -1161,14 +1186,14 @@ static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *resul
1161
1186
  *result = NIL_P(array_class) ? rb_ary_new() : rb_class_new_instance(0, 0, array_class);
1162
1187
 
1163
1188
 
1164
- #line 1165 "parser.c"
1189
+ #line 1190 "parser.c"
1165
1190
  {
1166
1191
  cs = JSON_array_start;
1167
1192
  }
1168
1193
 
1169
- #line 404 "parser.rl"
1194
+ #line 429 "parser.rl"
1170
1195
 
1171
- #line 1172 "parser.c"
1196
+ #line 1197 "parser.c"
1172
1197
  {
1173
1198
  if ( p == pe )
1174
1199
  goto _test_eof;
@@ -1207,7 +1232,7 @@ case 2:
1207
1232
  goto st2;
1208
1233
  goto st0;
1209
1234
  tr2:
1210
- #line 368 "parser.rl"
1235
+ #line 393 "parser.rl"
1211
1236
  {
1212
1237
  VALUE v = Qnil;
1213
1238
  char *np = JSON_parse_value(json, p, pe, &v, current_nesting);
@@ -1227,7 +1252,7 @@ st3:
1227
1252
  if ( ++p == pe )
1228
1253
  goto _test_eof3;
1229
1254
  case 3:
1230
- #line 1231 "parser.c"
1255
+ #line 1256 "parser.c"
1231
1256
  switch( (*p) ) {
1232
1257
  case 13: goto st3;
1233
1258
  case 32: goto st3;
@@ -1327,14 +1352,14 @@ case 12:
1327
1352
  goto st3;
1328
1353
  goto st12;
1329
1354
  tr4:
1330
- #line 383 "parser.rl"
1355
+ #line 408 "parser.rl"
1331
1356
  { p--; {p++; cs = 17; goto _out;} }
1332
1357
  goto st17;
1333
1358
  st17:
1334
1359
  if ( ++p == pe )
1335
1360
  goto _test_eof17;
1336
1361
  case 17:
1337
- #line 1338 "parser.c"
1362
+ #line 1363 "parser.c"
1338
1363
  goto st0;
1339
1364
  st13:
1340
1365
  if ( ++p == pe )
@@ -1390,7 +1415,7 @@ case 16:
1390
1415
  _out: {}
1391
1416
  }
1392
1417
 
1393
- #line 405 "parser.rl"
1418
+ #line 430 "parser.rl"
1394
1419
 
1395
1420
  if(cs >= JSON_array_first_final) {
1396
1421
  return p + 1;
@@ -1479,7 +1504,7 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
1479
1504
  }
1480
1505
 
1481
1506
 
1482
- #line 1483 "parser.c"
1507
+ #line 1508 "parser.c"
1483
1508
  enum {JSON_string_start = 1};
1484
1509
  enum {JSON_string_first_final = 8};
1485
1510
  enum {JSON_string_error = 0};
@@ -1487,7 +1512,7 @@ enum {JSON_string_error = 0};
1487
1512
  enum {JSON_string_en_main = 1};
1488
1513
 
1489
1514
 
1490
- #line 512 "parser.rl"
1515
+ #line 537 "parser.rl"
1491
1516
 
1492
1517
 
1493
1518
  static int
@@ -1509,15 +1534,15 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
1509
1534
 
1510
1535
  *result = rb_str_buf_new(0);
1511
1536
 
1512
- #line 1513 "parser.c"
1537
+ #line 1538 "parser.c"
1513
1538
  {
1514
1539
  cs = JSON_string_start;
1515
1540
  }
1516
1541
 
1517
- #line 533 "parser.rl"
1542
+ #line 558 "parser.rl"
1518
1543
  json->memo = p;
1519
1544
 
1520
- #line 1521 "parser.c"
1545
+ #line 1546 "parser.c"
1521
1546
  {
1522
1547
  if ( p == pe )
1523
1548
  goto _test_eof;
@@ -1542,7 +1567,7 @@ case 2:
1542
1567
  goto st0;
1543
1568
  goto st2;
1544
1569
  tr2:
1545
- #line 498 "parser.rl"
1570
+ #line 523 "parser.rl"
1546
1571
  {
1547
1572
  *result = json_string_unescape(*result, json->memo + 1, p);
1548
1573
  if (NIL_P(*result)) {
@@ -1553,14 +1578,14 @@ tr2:
1553
1578
  {p = (( p + 1))-1;}
1554
1579
  }
1555
1580
  }
1556
- #line 509 "parser.rl"
1581
+ #line 534 "parser.rl"
1557
1582
  { p--; {p++; cs = 8; goto _out;} }
1558
1583
  goto st8;
1559
1584
  st8:
1560
1585
  if ( ++p == pe )
1561
1586
  goto _test_eof8;
1562
1587
  case 8:
1563
- #line 1564 "parser.c"
1588
+ #line 1589 "parser.c"
1564
1589
  goto st0;
1565
1590
  st3:
1566
1591
  if ( ++p == pe )
@@ -1636,7 +1661,7 @@ case 7:
1636
1661
  _out: {}
1637
1662
  }
1638
1663
 
1639
- #line 535 "parser.rl"
1664
+ #line 560 "parser.rl"
1640
1665
 
1641
1666
  if (json->create_additions && RTEST(match_string = json->match_string)) {
1642
1667
  VALUE klass;
@@ -1651,7 +1676,7 @@ case 7:
1651
1676
 
1652
1677
  if (json->symbolize_names && json->parsing_name) {
1653
1678
  *result = rb_str_intern(*result);
1654
- } else {
1679
+ } else if (RB_TYPE_P(*result, T_STRING)) {
1655
1680
  rb_str_resize(*result, RSTRING_LEN(*result));
1656
1681
  }
1657
1682
  if (cs >= JSON_string_first_final) {
@@ -1789,6 +1814,12 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
1789
1814
  } else {
1790
1815
  json->array_class = Qnil;
1791
1816
  }
1817
+ tmp = ID2SYM(i_decimal_class);
1818
+ if (option_given_p(opts, tmp)) {
1819
+ json->decimal_class = rb_hash_aref(opts, tmp);
1820
+ } else {
1821
+ json->decimal_class = Qnil;
1822
+ }
1792
1823
  tmp = ID2SYM(i_match_string);
1793
1824
  if (option_given_p(opts, tmp)) {
1794
1825
  VALUE match_string = rb_hash_aref(opts, tmp);
@@ -1802,10 +1833,11 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
1802
1833
  } else {
1803
1834
  json->max_nesting = 100;
1804
1835
  json->allow_nan = 0;
1805
- json->create_additions = 1;
1836
+ json->create_additions = 0;
1806
1837
  json->create_id = rb_funcall(mJSON, i_create_id, 0);
1807
1838
  json->object_class = Qnil;
1808
1839
  json->array_class = Qnil;
1840
+ json->decimal_class = Qnil;
1809
1841
  }
1810
1842
  source = convert_encoding(StringValue(source));
1811
1843
  StringValue(source);
@@ -1816,7 +1848,7 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
1816
1848
  }
1817
1849
 
1818
1850
 
1819
- #line 1820 "parser.c"
1851
+ #line 1852 "parser.c"
1820
1852
  enum {JSON_start = 1};
1821
1853
  enum {JSON_first_final = 10};
1822
1854
  enum {JSON_error = 0};
@@ -1824,7 +1856,7 @@ enum {JSON_error = 0};
1824
1856
  enum {JSON_en_main = 1};
1825
1857
 
1826
1858
 
1827
- #line 728 "parser.rl"
1859
+ #line 760 "parser.rl"
1828
1860
 
1829
1861
 
1830
1862
  /*
@@ -1841,16 +1873,16 @@ static VALUE cParser_parse(VALUE self)
1841
1873
  GET_PARSER;
1842
1874
 
1843
1875
 
1844
- #line 1845 "parser.c"
1876
+ #line 1877 "parser.c"
1845
1877
  {
1846
1878
  cs = JSON_start;
1847
1879
  }
1848
1880
 
1849
- #line 744 "parser.rl"
1881
+ #line 776 "parser.rl"
1850
1882
  p = json->source;
1851
1883
  pe = p + json->len;
1852
1884
 
1853
- #line 1854 "parser.c"
1885
+ #line 1886 "parser.c"
1854
1886
  {
1855
1887
  if ( p == pe )
1856
1888
  goto _test_eof;
@@ -1884,7 +1916,7 @@ st0:
1884
1916
  cs = 0;
1885
1917
  goto _out;
1886
1918
  tr2:
1887
- #line 720 "parser.rl"
1919
+ #line 752 "parser.rl"
1888
1920
  {
1889
1921
  char *np = JSON_parse_value(json, p, pe, &result, 0);
1890
1922
  if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
@@ -1894,7 +1926,7 @@ st10:
1894
1926
  if ( ++p == pe )
1895
1927
  goto _test_eof10;
1896
1928
  case 10:
1897
- #line 1898 "parser.c"
1929
+ #line 1930 "parser.c"
1898
1930
  switch( (*p) ) {
1899
1931
  case 13: goto st10;
1900
1932
  case 32: goto st10;
@@ -1983,7 +2015,7 @@ case 9:
1983
2015
  _out: {}
1984
2016
  }
1985
2017
 
1986
- #line 747 "parser.rl"
2018
+ #line 779 "parser.rl"
1987
2019
 
1988
2020
  if (cs >= JSON_first_final && p == pe) {
1989
2021
  return result;
@@ -2000,6 +2032,7 @@ static void JSON_mark(void *ptr)
2000
2032
  rb_gc_mark_maybe(json->create_id);
2001
2033
  rb_gc_mark_maybe(json->object_class);
2002
2034
  rb_gc_mark_maybe(json->array_class);
2035
+ rb_gc_mark_maybe(json->decimal_class);
2003
2036
  rb_gc_mark_maybe(json->match_string);
2004
2037
  }
2005
2038
 
@@ -2049,20 +2082,28 @@ static VALUE cParser_source(VALUE self)
2049
2082
 
2050
2083
  void Init_parser(void)
2051
2084
  {
2085
+ #undef rb_intern
2052
2086
  rb_require("json/common");
2053
2087
  mJSON = rb_define_module("JSON");
2054
2088
  mExt = rb_define_module_under(mJSON, "Ext");
2055
2089
  cParser = rb_define_class_under(mExt, "Parser", rb_cObject);
2056
2090
  eParserError = rb_path2class("JSON::ParserError");
2057
2091
  eNestingError = rb_path2class("JSON::NestingError");
2092
+ rb_gc_register_mark_object(eParserError);
2093
+ rb_gc_register_mark_object(eNestingError);
2058
2094
  rb_define_alloc_func(cParser, cJSON_parser_s_allocate);
2059
2095
  rb_define_method(cParser, "initialize", cParser_initialize, -1);
2060
2096
  rb_define_method(cParser, "parse", cParser_parse, 0);
2061
2097
  rb_define_method(cParser, "source", cParser_source, 0);
2062
2098
 
2063
2099
  CNaN = rb_const_get(mJSON, rb_intern("NaN"));
2100
+ rb_gc_register_mark_object(CNaN);
2101
+
2064
2102
  CInfinity = rb_const_get(mJSON, rb_intern("Infinity"));
2103
+ rb_gc_register_mark_object(CInfinity);
2104
+
2065
2105
  CMinusInfinity = rb_const_get(mJSON, rb_intern("MinusInfinity"));
2106
+ rb_gc_register_mark_object(CMinusInfinity);
2066
2107
 
2067
2108
  i_json_creatable_p = rb_intern("json_creatable?");
2068
2109
  i_json_create = rb_intern("json_create");
@@ -2074,6 +2115,7 @@ void Init_parser(void)
2074
2115
  i_symbolize_names = rb_intern("symbolize_names");
2075
2116
  i_object_class = rb_intern("object_class");
2076
2117
  i_array_class = rb_intern("array_class");
2118
+ i_decimal_class = rb_intern("decimal_class");
2077
2119
  i_match = rb_intern("match");
2078
2120
  i_match_string = rb_intern("match_string");
2079
2121
  i_key_p = rb_intern("key?");
@@ -2081,6 +2123,8 @@ void Init_parser(void)
2081
2123
  i_aset = rb_intern("[]=");
2082
2124
  i_aref = rb_intern("[]");
2083
2125
  i_leftshift = rb_intern("<<");
2126
+ i_new = rb_intern("new");
2127
+ i_BigDecimal = rb_intern("BigDecimal");
2084
2128
  }
2085
2129
 
2086
2130
  /*