json 1.1.3 → 1.1.4

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.

Files changed (67) hide show
  1. data/CHANGES +9 -0
  2. data/Rakefile +47 -53
  3. data/VERSION +1 -1
  4. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkComparison.log +52 -0
  5. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast-autocorrelation.dat +1000 -0
  6. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast.dat +1001 -0
  7. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty-autocorrelation.dat +900 -0
  8. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty.dat +901 -0
  9. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe-autocorrelation.dat +1000 -0
  10. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe.dat +1001 -0
  11. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt.log +261 -0
  12. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast-autocorrelation.dat +1000 -0
  13. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast.dat +1001 -0
  14. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty-autocorrelation.dat +1000 -0
  15. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty.dat +1001 -0
  16. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe-autocorrelation.dat +1000 -0
  17. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe.dat +1001 -0
  18. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure.log +262 -0
  19. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator-autocorrelation.dat +1000 -0
  20. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator.dat +1001 -0
  21. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails.log +82 -0
  22. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkComparison.log +34 -0
  23. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser-autocorrelation.dat +900 -0
  24. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser.dat +901 -0
  25. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt.log +81 -0
  26. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser-autocorrelation.dat +1000 -0
  27. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser.dat +1001 -0
  28. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure.log +82 -0
  29. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser-autocorrelation.dat +1000 -0
  30. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser.dat +1001 -0
  31. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails.log +82 -0
  32. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser-autocorrelation.dat +1000 -0
  33. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser.dat +1001 -0
  34. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML.log +82 -0
  35. data/benchmarks/generator_benchmark.rb +162 -0
  36. data/benchmarks/parser_benchmark.rb +193 -0
  37. data/bin/edit_json.rb +0 -1
  38. data/bin/prettify_json.rb +0 -1
  39. data/doc-templates/main.txt +284 -0
  40. data/ext/json/ext/generator/extconf.rb +2 -0
  41. data/ext/json/ext/generator/generator.c +62 -18
  42. data/ext/json/ext/parser/extconf.rb +2 -0
  43. data/ext/json/ext/parser/parser.c +128 -81
  44. data/ext/json/ext/parser/parser.rl +31 -7
  45. data/ext/json/ext/parser/unicode.c +4 -4
  46. data/lib/json.rb +0 -221
  47. data/lib/json/add/core.rb +1 -1
  48. data/lib/json/editor.rb +11 -2
  49. data/lib/json/ext.rb +2 -0
  50. data/lib/json/pure.rb +2 -0
  51. data/lib/json/pure/generator.rb +77 -41
  52. data/lib/json/pure/parser.rb +6 -2
  53. data/lib/json/version.rb +1 -1
  54. data/tests/test_json.rb +7 -4
  55. data/tests/test_json_addition.rb +8 -5
  56. data/tests/test_json_fixtures.rb +6 -2
  57. data/tests/test_json_generate.rb +8 -2
  58. data/tests/test_json_rails.rb +30 -2
  59. data/tests/test_json_unicode.rb +8 -7
  60. data/tools/fuzz.rb +0 -1
  61. data/tools/server.rb +0 -1
  62. metadata +46 -9
  63. data/benchmarks/benchmark.txt +0 -133
  64. data/benchmarks/benchmark_generator.rb +0 -48
  65. data/benchmarks/benchmark_parser.rb +0 -26
  66. data/benchmarks/benchmark_rails.rb +0 -26
  67. data/tests/runner.rb +0 -25
@@ -6,4 +6,6 @@ if CONFIG['CC'] =~ /gcc/
6
6
  #$CFLAGS += ' -O0 -ggdb'
7
7
  end
8
8
 
9
+ have_header("ruby/st.h") || have_header("st.h")
10
+ have_header("re.h")
9
11
  create_makefile 'parser'
@@ -1,11 +1,30 @@
1
+
1
2
  #line 1 "parser.rl"
2
3
  #include "ruby.h"
4
+ #include "unicode.h"
5
+ #if HAVE_RE_H
3
6
  #include "re.h"
7
+ #endif
8
+ #if HAVE_RUBY_ST_H
9
+ #include "ruby/st.h"
10
+ #endif
11
+ #if HAVE_ST_H
4
12
  #include "st.h"
5
- #include "unicode.h"
13
+ #endif
6
14
 
7
15
  #define EVIL 0x666
8
16
 
17
+ #ifndef RHASH_TBL
18
+ #define RHASH_TBL(hsh) (RHASH(hsh)->tbl)
19
+ #endif
20
+
21
+ #ifdef HAVE_RUBY_ENCODING_H
22
+ #include "ruby/encoding.h"
23
+ #define FORCE_UTF8(obj) rb_enc_associate((obj), rb_utf8_encoding())
24
+ #else
25
+ #define FORCE_UTF8(obj)
26
+ #endif
27
+
9
28
  static VALUE mJSON, mExt, cParser, eParserError, eNestingError;
10
29
  static VALUE CNaN, CInfinity, CMinusInfinity;
11
30
 
@@ -36,18 +55,20 @@ static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *resul
36
55
  JSON_Parser *json; \
37
56
  Data_Get_Struct(self, JSON_Parser, json);
38
57
 
39
- #line 64 "parser.rl"
40
58
 
59
+ #line 82 "parser.rl"
41
60
 
42
61
 
43
- #line 44 "parser.c"
62
+
63
+ #line 64 "parser.c"
44
64
  static const int JSON_object_start = 1;
45
65
  static const int JSON_object_first_final = 27;
46
66
  static const int JSON_object_error = 0;
47
67
 
48
68
  static const int JSON_object_en_main = 1;
49
69
 
50
- #line 97 "parser.rl"
70
+
71
+ #line 115 "parser.rl"
51
72
 
52
73
 
53
74
  static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result)
@@ -62,13 +83,14 @@ static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *resu
62
83
  *result = rb_hash_new();
63
84
 
64
85
 
65
- #line 66 "parser.c"
86
+ #line 87 "parser.c"
66
87
  {
67
88
  cs = JSON_object_start;
68
89
  }
69
- #line 111 "parser.rl"
90
+
91
+ #line 129 "parser.rl"
70
92
 
71
- #line 72 "parser.c"
93
+ #line 94 "parser.c"
72
94
  {
73
95
  if ( p == pe )
74
96
  goto _test_eof;
@@ -96,7 +118,7 @@ case 2:
96
118
  goto st2;
97
119
  goto st0;
98
120
  tr2:
99
- #line 83 "parser.rl"
121
+ #line 101 "parser.rl"
100
122
  {
101
123
  char *np = JSON_parse_string(json, p, pe, &last_name);
102
124
  if (np == NULL) { p--; {p++; cs = 3; goto _out;} } else {p = (( np))-1;}
@@ -106,7 +128,7 @@ st3:
106
128
  if ( ++p == pe )
107
129
  goto _test_eof3;
108
130
  case 3:
109
- #line 110 "parser.c"
131
+ #line 132 "parser.c"
110
132
  switch( (*p) ) {
111
133
  case 13: goto st3;
112
134
  case 32: goto st3;
@@ -173,7 +195,7 @@ case 8:
173
195
  goto st8;
174
196
  goto st0;
175
197
  tr11:
176
- #line 72 "parser.rl"
198
+ #line 90 "parser.rl"
177
199
  {
178
200
  VALUE v = Qnil;
179
201
  char *np = JSON_parse_value(json, p, pe, &v);
@@ -189,7 +211,7 @@ st9:
189
211
  if ( ++p == pe )
190
212
  goto _test_eof9;
191
213
  case 9:
192
- #line 193 "parser.c"
214
+ #line 215 "parser.c"
193
215
  switch( (*p) ) {
194
216
  case 13: goto st9;
195
217
  case 32: goto st9;
@@ -278,14 +300,14 @@ case 18:
278
300
  goto st9;
279
301
  goto st18;
280
302
  tr4:
281
- #line 88 "parser.rl"
303
+ #line 106 "parser.rl"
282
304
  { p--; {p++; cs = 27; goto _out;} }
283
305
  goto st27;
284
306
  st27:
285
307
  if ( ++p == pe )
286
308
  goto _test_eof27;
287
309
  case 27:
288
- #line 289 "parser.c"
310
+ #line 311 "parser.c"
289
311
  goto st0;
290
312
  st19:
291
313
  if ( ++p == pe )
@@ -382,7 +404,8 @@ case 26:
382
404
  _test_eof: {}
383
405
  _out: {}
384
406
  }
385
- #line 112 "parser.rl"
407
+
408
+ #line 130 "parser.rl"
386
409
 
387
410
  if (cs >= JSON_object_first_final) {
388
411
  if (RTEST(json->create_id)) {
@@ -401,14 +424,15 @@ case 26:
401
424
  }
402
425
 
403
426
 
404
- #line 405 "parser.c"
427
+ #line 428 "parser.c"
405
428
  static const int JSON_value_start = 1;
406
429
  static const int JSON_value_first_final = 21;
407
430
  static const int JSON_value_error = 0;
408
431
 
409
432
  static const int JSON_value_en_main = 1;
410
433
 
411
- #line 210 "parser.rl"
434
+
435
+ #line 228 "parser.rl"
412
436
 
413
437
 
414
438
  static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result)
@@ -416,13 +440,14 @@ static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *resul
416
440
  int cs = EVIL;
417
441
 
418
442
 
419
- #line 420 "parser.c"
443
+ #line 444 "parser.c"
420
444
  {
421
445
  cs = JSON_value_start;
422
446
  }
423
- #line 217 "parser.rl"
447
+
448
+ #line 235 "parser.rl"
424
449
 
425
- #line 426 "parser.c"
450
+ #line 451 "parser.c"
426
451
  {
427
452
  if ( p == pe )
428
453
  goto _test_eof;
@@ -447,14 +472,14 @@ st0:
447
472
  cs = 0;
448
473
  goto _out;
449
474
  tr0:
450
- #line 158 "parser.rl"
475
+ #line 176 "parser.rl"
451
476
  {
452
477
  char *np = JSON_parse_string(json, p, pe, result);
453
478
  if (np == NULL) { p--; {p++; cs = 21; goto _out;} } else {p = (( np))-1;}
454
479
  }
455
480
  goto st21;
456
481
  tr2:
457
- #line 163 "parser.rl"
482
+ #line 181 "parser.rl"
458
483
  {
459
484
  char *np;
460
485
  if(pe > p + 9 && !strncmp(MinusInfinity, p, 9)) {
@@ -474,7 +499,7 @@ tr2:
474
499
  }
475
500
  goto st21;
476
501
  tr5:
477
- #line 181 "parser.rl"
502
+ #line 199 "parser.rl"
478
503
  {
479
504
  char *np;
480
505
  json->current_nesting++;
@@ -484,7 +509,7 @@ tr5:
484
509
  }
485
510
  goto st21;
486
511
  tr9:
487
- #line 189 "parser.rl"
512
+ #line 207 "parser.rl"
488
513
  {
489
514
  char *np;
490
515
  json->current_nesting++;
@@ -494,7 +519,7 @@ tr9:
494
519
  }
495
520
  goto st21;
496
521
  tr16:
497
- #line 151 "parser.rl"
522
+ #line 169 "parser.rl"
498
523
  {
499
524
  if (json->allow_nan) {
500
525
  *result = CInfinity;
@@ -504,7 +529,7 @@ tr16:
504
529
  }
505
530
  goto st21;
506
531
  tr18:
507
- #line 144 "parser.rl"
532
+ #line 162 "parser.rl"
508
533
  {
509
534
  if (json->allow_nan) {
510
535
  *result = CNaN;
@@ -514,19 +539,19 @@ tr18:
514
539
  }
515
540
  goto st21;
516
541
  tr22:
517
- #line 138 "parser.rl"
542
+ #line 156 "parser.rl"
518
543
  {
519
544
  *result = Qfalse;
520
545
  }
521
546
  goto st21;
522
547
  tr25:
523
- #line 135 "parser.rl"
548
+ #line 153 "parser.rl"
524
549
  {
525
550
  *result = Qnil;
526
551
  }
527
552
  goto st21;
528
553
  tr28:
529
- #line 141 "parser.rl"
554
+ #line 159 "parser.rl"
530
555
  {
531
556
  *result = Qtrue;
532
557
  }
@@ -535,9 +560,9 @@ st21:
535
560
  if ( ++p == pe )
536
561
  goto _test_eof21;
537
562
  case 21:
538
- #line 197 "parser.rl"
563
+ #line 215 "parser.rl"
539
564
  { p--; {p++; cs = 21; goto _out;} }
540
- #line 541 "parser.c"
565
+ #line 566 "parser.c"
541
566
  goto st0;
542
567
  st2:
543
568
  if ( ++p == pe )
@@ -697,7 +722,8 @@ case 20:
697
722
  _test_eof: {}
698
723
  _out: {}
699
724
  }
700
- #line 218 "parser.rl"
725
+
726
+ #line 236 "parser.rl"
701
727
 
702
728
  if (cs >= JSON_value_first_final) {
703
729
  return p;
@@ -707,14 +733,15 @@ case 20:
707
733
  }
708
734
 
709
735
 
710
- #line 711 "parser.c"
736
+ #line 737 "parser.c"
711
737
  static const int JSON_integer_start = 1;
712
738
  static const int JSON_integer_first_final = 5;
713
739
  static const int JSON_integer_error = 0;
714
740
 
715
741
  static const int JSON_integer_en_main = 1;
716
742
 
717
- #line 234 "parser.rl"
743
+
744
+ #line 252 "parser.rl"
718
745
 
719
746
 
720
747
  static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result)
@@ -722,14 +749,15 @@ static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *res
722
749
  int cs = EVIL;
723
750
 
724
751
 
725
- #line 726 "parser.c"
752
+ #line 753 "parser.c"
726
753
  {
727
754
  cs = JSON_integer_start;
728
755
  }
729
- #line 241 "parser.rl"
756
+
757
+ #line 259 "parser.rl"
730
758
  json->memo = p;
731
759
 
732
- #line 733 "parser.c"
760
+ #line 761 "parser.c"
733
761
  {
734
762
  if ( p == pe )
735
763
  goto _test_eof;
@@ -763,14 +791,14 @@ case 3:
763
791
  goto st0;
764
792
  goto tr4;
765
793
  tr4:
766
- #line 231 "parser.rl"
794
+ #line 249 "parser.rl"
767
795
  { p--; {p++; cs = 5; goto _out;} }
768
796
  goto st5;
769
797
  st5:
770
798
  if ( ++p == pe )
771
799
  goto _test_eof5;
772
800
  case 5:
773
- #line 774 "parser.c"
801
+ #line 802 "parser.c"
774
802
  goto st0;
775
803
  st4:
776
804
  if ( ++p == pe )
@@ -788,7 +816,8 @@ case 4:
788
816
  _test_eof: {}
789
817
  _out: {}
790
818
  }
791
- #line 243 "parser.rl"
819
+
820
+ #line 261 "parser.rl"
792
821
 
793
822
  if (cs >= JSON_integer_first_final) {
794
823
  long len = p - json->memo;
@@ -800,14 +829,15 @@ case 4:
800
829
  }
801
830
 
802
831
 
803
- #line 804 "parser.c"
832
+ #line 833 "parser.c"
804
833
  static const int JSON_float_start = 1;
805
834
  static const int JSON_float_first_final = 10;
806
835
  static const int JSON_float_error = 0;
807
836
 
808
837
  static const int JSON_float_en_main = 1;
809
838
 
810
- #line 265 "parser.rl"
839
+
840
+ #line 283 "parser.rl"
811
841
 
812
842
 
813
843
  static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result)
@@ -815,14 +845,15 @@ static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *resul
815
845
  int cs = EVIL;
816
846
 
817
847
 
818
- #line 819 "parser.c"
848
+ #line 849 "parser.c"
819
849
  {
820
850
  cs = JSON_float_start;
821
851
  }
822
- #line 272 "parser.rl"
852
+
853
+ #line 290 "parser.rl"
823
854
  json->memo = p;
824
855
 
825
- #line 826 "parser.c"
856
+ #line 857 "parser.c"
826
857
  {
827
858
  if ( p == pe )
828
859
  goto _test_eof;
@@ -880,14 +911,14 @@ case 5:
880
911
  goto st0;
881
912
  goto tr7;
882
913
  tr7:
883
- #line 259 "parser.rl"
914
+ #line 277 "parser.rl"
884
915
  { p--; {p++; cs = 10; goto _out;} }
885
916
  goto st10;
886
917
  st10:
887
918
  if ( ++p == pe )
888
919
  goto _test_eof10;
889
920
  case 10:
890
- #line 891 "parser.c"
921
+ #line 922 "parser.c"
891
922
  goto st0;
892
923
  st6:
893
924
  if ( ++p == pe )
@@ -947,7 +978,8 @@ case 9:
947
978
  _test_eof: {}
948
979
  _out: {}
949
980
  }
950
- #line 274 "parser.rl"
981
+
982
+ #line 292 "parser.rl"
951
983
 
952
984
  if (cs >= JSON_float_first_final) {
953
985
  long len = p - json->memo;
@@ -960,14 +992,15 @@ case 9:
960
992
 
961
993
 
962
994
 
963
- #line 964 "parser.c"
995
+ #line 996 "parser.c"
964
996
  static const int JSON_array_start = 1;
965
997
  static const int JSON_array_first_final = 17;
966
998
  static const int JSON_array_error = 0;
967
999
 
968
1000
  static const int JSON_array_en_main = 1;
969
1001
 
970
- #line 310 "parser.rl"
1002
+
1003
+ #line 328 "parser.rl"
971
1004
 
972
1005
 
973
1006
  static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result)
@@ -980,13 +1013,14 @@ static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *resul
980
1013
  *result = rb_ary_new();
981
1014
 
982
1015
 
983
- #line 984 "parser.c"
1016
+ #line 1017 "parser.c"
984
1017
  {
985
1018
  cs = JSON_array_start;
986
1019
  }
987
- #line 322 "parser.rl"
1020
+
1021
+ #line 340 "parser.rl"
988
1022
 
989
- #line 990 "parser.c"
1023
+ #line 1024 "parser.c"
990
1024
  {
991
1025
  if ( p == pe )
992
1026
  goto _test_eof;
@@ -1025,7 +1059,7 @@ case 2:
1025
1059
  goto st2;
1026
1060
  goto st0;
1027
1061
  tr2:
1028
- #line 291 "parser.rl"
1062
+ #line 309 "parser.rl"
1029
1063
  {
1030
1064
  VALUE v = Qnil;
1031
1065
  char *np = JSON_parse_value(json, p, pe, &v);
@@ -1041,7 +1075,7 @@ st3:
1041
1075
  if ( ++p == pe )
1042
1076
  goto _test_eof3;
1043
1077
  case 3:
1044
- #line 1045 "parser.c"
1078
+ #line 1079 "parser.c"
1045
1079
  switch( (*p) ) {
1046
1080
  case 13: goto st3;
1047
1081
  case 32: goto st3;
@@ -1141,14 +1175,14 @@ case 12:
1141
1175
  goto st3;
1142
1176
  goto st12;
1143
1177
  tr4:
1144
- #line 302 "parser.rl"
1178
+ #line 320 "parser.rl"
1145
1179
  { p--; {p++; cs = 17; goto _out;} }
1146
1180
  goto st17;
1147
1181
  st17:
1148
1182
  if ( ++p == pe )
1149
1183
  goto _test_eof17;
1150
1184
  case 17:
1151
- #line 1152 "parser.c"
1185
+ #line 1186 "parser.c"
1152
1186
  goto st0;
1153
1187
  st13:
1154
1188
  if ( ++p == pe )
@@ -1203,7 +1237,8 @@ case 16:
1203
1237
  _test_eof: {}
1204
1238
  _out: {}
1205
1239
  }
1206
- #line 323 "parser.rl"
1240
+
1241
+ #line 341 "parser.rl"
1207
1242
 
1208
1243
  if(cs >= JSON_array_first_final) {
1209
1244
  return p + 1;
@@ -1269,14 +1304,15 @@ static VALUE json_string_unescape(char *p, char *pe)
1269
1304
  }
1270
1305
 
1271
1306
 
1272
- #line 1273 "parser.c"
1307
+ #line 1308 "parser.c"
1273
1308
  static const int JSON_string_start = 1;
1274
1309
  static const int JSON_string_first_final = 8;
1275
1310
  static const int JSON_string_error = 0;
1276
1311
 
1277
1312
  static const int JSON_string_en_main = 1;
1278
1313
 
1279
- #line 401 "parser.rl"
1314
+
1315
+ #line 425 "parser.rl"
1280
1316
 
1281
1317
 
1282
1318
  static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *result)
@@ -1285,14 +1321,15 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
1285
1321
 
1286
1322
  *result = rb_str_new("", 0);
1287
1323
 
1288
- #line 1289 "parser.c"
1324
+ #line 1325 "parser.c"
1289
1325
  {
1290
1326
  cs = JSON_string_start;
1291
1327
  }
1292
- #line 409 "parser.rl"
1328
+
1329
+ #line 433 "parser.rl"
1293
1330
  json->memo = p;
1294
1331
 
1295
- #line 1296 "parser.c"
1332
+ #line 1333 "parser.c"
1296
1333
  {
1297
1334
  if ( p == pe )
1298
1335
  goto _test_eof;
@@ -1317,19 +1354,25 @@ case 2:
1317
1354
  goto st0;
1318
1355
  goto st2;
1319
1356
  tr2:
1320
- #line 393 "parser.rl"
1357
+ #line 411 "parser.rl"
1321
1358
  {
1322
1359
  *result = json_string_unescape(json->memo + 1, p);
1323
- if (NIL_P(*result)) { p--; {p++; cs = 8; goto _out;} } else {p = (( p + 1))-1;}
1324
- }
1325
- #line 398 "parser.rl"
1360
+ if (NIL_P(*result)) {
1361
+ p--;
1362
+ {p++; cs = 8; goto _out;}
1363
+ } else {
1364
+ FORCE_UTF8(*result);
1365
+ {p = (( p + 1))-1;}
1366
+ }
1367
+ }
1368
+ #line 422 "parser.rl"
1326
1369
  { p--; {p++; cs = 8; goto _out;} }
1327
1370
  goto st8;
1328
1371
  st8:
1329
1372
  if ( ++p == pe )
1330
1373
  goto _test_eof8;
1331
1374
  case 8:
1332
- #line 1333 "parser.c"
1375
+ #line 1376 "parser.c"
1333
1376
  goto st0;
1334
1377
  st3:
1335
1378
  if ( ++p == pe )
@@ -1404,7 +1447,8 @@ case 7:
1404
1447
  _test_eof: {}
1405
1448
  _out: {}
1406
1449
  }
1407
- #line 411 "parser.rl"
1450
+
1451
+ #line 435 "parser.rl"
1408
1452
 
1409
1453
  if (cs >= JSON_string_first_final) {
1410
1454
  return p + 1;
@@ -1415,14 +1459,15 @@ case 7:
1415
1459
 
1416
1460
 
1417
1461
 
1418
- #line 1419 "parser.c"
1462
+ #line 1463 "parser.c"
1419
1463
  static const int JSON_start = 1;
1420
1464
  static const int JSON_first_final = 10;
1421
1465
  static const int JSON_error = 0;
1422
1466
 
1423
1467
  static const int JSON_en_main = 1;
1424
1468
 
1425
- #line 445 "parser.rl"
1469
+
1470
+ #line 469 "parser.rl"
1426
1471
 
1427
1472
 
1428
1473
  /*
@@ -1477,7 +1522,7 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
1477
1522
  rb_raise(rb_eArgError, "opts needs to be like a hash");
1478
1523
  } else {
1479
1524
  VALUE tmp = ID2SYM(i_max_nesting);
1480
- if (st_lookup(RHASH(opts)->tbl, tmp, 0)) {
1525
+ if (st_lookup(RHASH_TBL(opts), tmp, 0)) {
1481
1526
  VALUE max_nesting = rb_hash_aref(opts, tmp);
1482
1527
  if (RTEST(max_nesting)) {
1483
1528
  Check_Type(max_nesting, T_FIXNUM);
@@ -1489,14 +1534,14 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
1489
1534
  json->max_nesting = 19;
1490
1535
  }
1491
1536
  tmp = ID2SYM(i_allow_nan);
1492
- if (st_lookup(RHASH(opts)->tbl, tmp, 0)) {
1537
+ if (st_lookup(RHASH_TBL(opts), tmp, 0)) {
1493
1538
  VALUE allow_nan = rb_hash_aref(opts, tmp);
1494
1539
  json->allow_nan = RTEST(allow_nan) ? 1 : 0;
1495
1540
  } else {
1496
1541
  json->allow_nan = 0;
1497
1542
  }
1498
1543
  tmp = ID2SYM(i_create_additions);
1499
- if (st_lookup(RHASH(opts)->tbl, tmp, 0)) {
1544
+ if (st_lookup(RHASH_TBL(opts), tmp, 0)) {
1500
1545
  VALUE create_additions = rb_hash_aref(opts, tmp);
1501
1546
  if (RTEST(create_additions)) {
1502
1547
  json->create_id = rb_funcall(mJSON, i_create_id, 0);
@@ -1545,15 +1590,16 @@ static VALUE cParser_parse(VALUE self)
1545
1590
  GET_STRUCT;
1546
1591
 
1547
1592
 
1548
- #line 1549 "parser.c"
1593
+ #line 1594 "parser.c"
1549
1594
  {
1550
1595
  cs = JSON_start;
1551
1596
  }
1552
- #line 567 "parser.rl"
1597
+
1598
+ #line 591 "parser.rl"
1553
1599
  p = json->source;
1554
1600
  pe = p + json->len;
1555
1601
 
1556
- #line 1557 "parser.c"
1602
+ #line 1603 "parser.c"
1557
1603
  {
1558
1604
  if ( p == pe )
1559
1605
  goto _test_eof;
@@ -1609,7 +1655,7 @@ case 5:
1609
1655
  goto st1;
1610
1656
  goto st5;
1611
1657
  tr3:
1612
- #line 434 "parser.rl"
1658
+ #line 458 "parser.rl"
1613
1659
  {
1614
1660
  char *np;
1615
1661
  json->current_nesting = 1;
@@ -1618,7 +1664,7 @@ tr3:
1618
1664
  }
1619
1665
  goto st10;
1620
1666
  tr4:
1621
- #line 427 "parser.rl"
1667
+ #line 451 "parser.rl"
1622
1668
  {
1623
1669
  char *np;
1624
1670
  json->current_nesting = 1;
@@ -1630,7 +1676,7 @@ st10:
1630
1676
  if ( ++p == pe )
1631
1677
  goto _test_eof10;
1632
1678
  case 10:
1633
- #line 1634 "parser.c"
1679
+ #line 1680 "parser.c"
1634
1680
  switch( (*p) ) {
1635
1681
  case 13: goto st10;
1636
1682
  case 32: goto st10;
@@ -1686,7 +1732,8 @@ case 9:
1686
1732
  _test_eof: {}
1687
1733
  _out: {}
1688
1734
  }
1689
- #line 570 "parser.rl"
1735
+
1736
+ #line 594 "parser.rl"
1690
1737
 
1691
1738
  if (cs >= JSON_first_final && p == pe) {
1692
1739
  return result;
@@ -1710,7 +1757,7 @@ static void JSON_mark(JSON_Parser *json)
1710
1757
 
1711
1758
  static void JSON_free(JSON_Parser *json)
1712
1759
  {
1713
- free(json);
1760
+ ruby_xfree(json);
1714
1761
  }
1715
1762
 
1716
1763
  static VALUE cJSON_parser_s_allocate(VALUE klass)