json 1.8.0 → 2.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +5 -5
  2. data/{CHANGES → CHANGES.md} +262 -87
  3. data/{COPYING-json-jruby → LICENSE} +5 -6
  4. data/README.md +425 -0
  5. data/VERSION +1 -1
  6. data/ext/json/ext/fbuffer/fbuffer.h +10 -4
  7. data/ext/json/ext/generator/extconf.rb +0 -10
  8. data/ext/json/ext/generator/generator.c +308 -135
  9. data/ext/json/ext/generator/generator.h +35 -9
  10. data/ext/json/ext/parser/extconf.rb +25 -6
  11. data/ext/json/ext/parser/parser.c +3044 -1901
  12. data/ext/json/ext/parser/parser.h +29 -10
  13. data/ext/json/ext/parser/parser.rl +270 -211
  14. data/ext/json/extconf.rb +3 -0
  15. data/json.gemspec +57 -27
  16. data/lib/json/add/bigdecimal.rb +3 -2
  17. data/lib/json/add/complex.rb +9 -3
  18. data/lib/json/add/core.rb +1 -0
  19. data/lib/json/add/date.rb +1 -1
  20. data/lib/json/add/date_time.rb +1 -1
  21. data/lib/json/add/exception.rb +1 -1
  22. data/lib/json/add/ostruct.rb +3 -3
  23. data/lib/json/add/range.rb +1 -1
  24. data/lib/json/add/rational.rb +8 -3
  25. data/lib/json/add/regexp.rb +3 -3
  26. data/lib/json/add/set.rb +29 -0
  27. data/lib/json/add/struct.rb +1 -1
  28. data/lib/json/add/symbol.rb +1 -1
  29. data/lib/json/add/time.rb +2 -2
  30. data/lib/json/common.rb +383 -167
  31. data/lib/json/ext.rb +0 -6
  32. data/lib/json/generic_object.rb +5 -4
  33. data/lib/json/pure/generator.rb +83 -126
  34. data/lib/json/pure/parser.rb +63 -85
  35. data/lib/json/pure.rb +2 -8
  36. data/lib/json/version.rb +2 -1
  37. data/lib/json.rb +550 -29
  38. metadata +29 -136
  39. data/.gitignore +0 -12
  40. data/.travis.yml +0 -20
  41. data/COPYING +0 -58
  42. data/GPL +0 -340
  43. data/Gemfile +0 -11
  44. data/README-json-jruby.markdown +0 -33
  45. data/README.rdoc +0 -358
  46. data/Rakefile +0 -412
  47. data/TODO +0 -1
  48. data/data/example.json +0 -1
  49. data/data/index.html +0 -38
  50. data/data/prototype.js +0 -4184
  51. data/diagrams/.keep +0 -0
  52. data/install.rb +0 -23
  53. data/java/src/json/ext/ByteListTranscoder.java +0 -167
  54. data/java/src/json/ext/Generator.java +0 -444
  55. data/java/src/json/ext/GeneratorMethods.java +0 -232
  56. data/java/src/json/ext/GeneratorService.java +0 -43
  57. data/java/src/json/ext/GeneratorState.java +0 -543
  58. data/java/src/json/ext/OptionsReader.java +0 -114
  59. data/java/src/json/ext/Parser.java +0 -2644
  60. data/java/src/json/ext/Parser.rl +0 -968
  61. data/java/src/json/ext/ParserService.java +0 -35
  62. data/java/src/json/ext/RuntimeInfo.java +0 -121
  63. data/java/src/json/ext/StringDecoder.java +0 -167
  64. data/java/src/json/ext/StringEncoder.java +0 -106
  65. data/java/src/json/ext/Utils.java +0 -89
  66. data/json-java.gemspec +0 -23
  67. data/json_pure.gemspec +0 -39
  68. data/lib/json/ext/.keep +0 -0
  69. data/tests/fixtures/fail1.json +0 -1
  70. data/tests/fixtures/fail10.json +0 -1
  71. data/tests/fixtures/fail11.json +0 -1
  72. data/tests/fixtures/fail12.json +0 -1
  73. data/tests/fixtures/fail13.json +0 -1
  74. data/tests/fixtures/fail14.json +0 -1
  75. data/tests/fixtures/fail18.json +0 -1
  76. data/tests/fixtures/fail19.json +0 -1
  77. data/tests/fixtures/fail2.json +0 -1
  78. data/tests/fixtures/fail20.json +0 -1
  79. data/tests/fixtures/fail21.json +0 -1
  80. data/tests/fixtures/fail22.json +0 -1
  81. data/tests/fixtures/fail23.json +0 -1
  82. data/tests/fixtures/fail24.json +0 -1
  83. data/tests/fixtures/fail25.json +0 -1
  84. data/tests/fixtures/fail27.json +0 -2
  85. data/tests/fixtures/fail28.json +0 -2
  86. data/tests/fixtures/fail3.json +0 -1
  87. data/tests/fixtures/fail4.json +0 -1
  88. data/tests/fixtures/fail5.json +0 -1
  89. data/tests/fixtures/fail6.json +0 -1
  90. data/tests/fixtures/fail7.json +0 -1
  91. data/tests/fixtures/fail8.json +0 -1
  92. data/tests/fixtures/fail9.json +0 -1
  93. data/tests/fixtures/pass1.json +0 -56
  94. data/tests/fixtures/pass15.json +0 -1
  95. data/tests/fixtures/pass16.json +0 -1
  96. data/tests/fixtures/pass17.json +0 -1
  97. data/tests/fixtures/pass2.json +0 -1
  98. data/tests/fixtures/pass26.json +0 -1
  99. data/tests/fixtures/pass3.json +0 -6
  100. data/tests/setup_variant.rb +0 -11
  101. data/tests/test_json.rb +0 -545
  102. data/tests/test_json_addition.rb +0 -196
  103. data/tests/test_json_encoding.rb +0 -65
  104. data/tests/test_json_fixtures.rb +0 -35
  105. data/tests/test_json_generate.rb +0 -322
  106. data/tests/test_json_generic_object.rb +0 -75
  107. data/tests/test_json_string_matching.rb +0 -39
  108. data/tests/test_json_unicode.rb +0 -72
  109. data/tools/fuzz.rb +0 -139
  110. data/tools/server.rb +0 -62
@@ -1,2204 +1,3347 @@
1
-
1
+ /* This file is automatically generated from parser.rl by using ragel */
2
2
  #line 1 "parser.rl"
3
3
  #include "../fbuffer/fbuffer.h"
4
4
  #include "parser.h"
5
5
 
6
+ #if defined HAVE_RUBY_ENCODING_H
7
+ # define EXC_ENCODING rb_utf8_encoding(),
8
+ # ifndef HAVE_RB_ENC_RAISE
9
+ static void
10
+ enc_raise(rb_encoding *enc, VALUE exc, const char *fmt, ...)
11
+ {
12
+ va_list args;
13
+ VALUE mesg;
14
+
15
+ va_start(args, fmt);
16
+ mesg = rb_enc_vsprintf(enc, fmt, args);
17
+ va_end(args);
18
+
19
+ rb_exc_raise(rb_exc_new3(exc, mesg));
20
+ }
21
+ # define rb_enc_raise enc_raise
22
+ # endif
23
+ #else
24
+ # define EXC_ENCODING /* nothing */
25
+ # define rb_enc_raise rb_raise
26
+ #endif
27
+
6
28
  /* unicode */
7
29
 
8
- static const char digit_values[256] = {
9
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
10
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
11
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1,
12
- -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1,
13
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
14
- 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
15
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
16
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
17
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
18
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
19
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
20
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
21
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
22
- -1, -1, -1, -1, -1, -1, -1
30
+ static const signed char digit_values[256] = {
31
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
32
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
33
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1,
34
+ -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1,
35
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
36
+ 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
37
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
38
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
39
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
40
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
41
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
42
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
43
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
44
+ -1, -1, -1, -1, -1, -1, -1
23
45
  };
24
46
 
25
47
  static UTF32 unescape_unicode(const unsigned char *p)
26
48
  {
27
- char b;
28
- UTF32 result = 0;
29
- b = digit_values[p[0]];
30
- if (b < 0) return UNI_REPLACEMENT_CHAR;
31
- result = (result << 4) | b;
32
- b = digit_values[p[1]];
33
- result = (result << 4) | b;
34
- if (b < 0) return UNI_REPLACEMENT_CHAR;
35
- b = digit_values[p[2]];
36
- result = (result << 4) | b;
37
- if (b < 0) return UNI_REPLACEMENT_CHAR;
38
- b = digit_values[p[3]];
39
- result = (result << 4) | b;
40
- if (b < 0) return UNI_REPLACEMENT_CHAR;
41
- return result;
49
+ signed char b;
50
+ UTF32 result = 0;
51
+ b = digit_values[p[0]];
52
+ if (b < 0) return UNI_REPLACEMENT_CHAR;
53
+ result = (result << 4) | (unsigned char)b;
54
+ b = digit_values[p[1]];
55
+ if (b < 0) return UNI_REPLACEMENT_CHAR;
56
+ result = (result << 4) | (unsigned char)b;
57
+ b = digit_values[p[2]];
58
+ if (b < 0) return UNI_REPLACEMENT_CHAR;
59
+ result = (result << 4) | (unsigned char)b;
60
+ b = digit_values[p[3]];
61
+ if (b < 0) return UNI_REPLACEMENT_CHAR;
62
+ result = (result << 4) | (unsigned char)b;
63
+ return result;
42
64
  }
43
65
 
44
66
  static int convert_UTF32_to_UTF8(char *buf, UTF32 ch)
45
67
  {
46
- int len = 1;
47
- if (ch <= 0x7F) {
48
- buf[0] = (char) ch;
49
- } else if (ch <= 0x07FF) {
50
- buf[0] = (char) ((ch >> 6) | 0xC0);
51
- buf[1] = (char) ((ch & 0x3F) | 0x80);
52
- len++;
53
- } else if (ch <= 0xFFFF) {
54
- buf[0] = (char) ((ch >> 12) | 0xE0);
55
- buf[1] = (char) (((ch >> 6) & 0x3F) | 0x80);
56
- buf[2] = (char) ((ch & 0x3F) | 0x80);
57
- len += 2;
58
- } else if (ch <= 0x1fffff) {
59
- buf[0] =(char) ((ch >> 18) | 0xF0);
60
- buf[1] =(char) (((ch >> 12) & 0x3F) | 0x80);
61
- buf[2] =(char) (((ch >> 6) & 0x3F) | 0x80);
62
- buf[3] =(char) ((ch & 0x3F) | 0x80);
63
- len += 3;
64
- } else {
65
- buf[0] = '?';
66
- }
67
- return len;
68
+ int len = 1;
69
+ if (ch <= 0x7F) {
70
+ buf[0] = (char) ch;
71
+ } else if (ch <= 0x07FF) {
72
+ buf[0] = (char) ((ch >> 6) | 0xC0);
73
+ buf[1] = (char) ((ch & 0x3F) | 0x80);
74
+ len++;
75
+ } else if (ch <= 0xFFFF) {
76
+ buf[0] = (char) ((ch >> 12) | 0xE0);
77
+ buf[1] = (char) (((ch >> 6) & 0x3F) | 0x80);
78
+ buf[2] = (char) ((ch & 0x3F) | 0x80);
79
+ len += 2;
80
+ } else if (ch <= 0x1fffff) {
81
+ buf[0] =(char) ((ch >> 18) | 0xF0);
82
+ buf[1] =(char) (((ch >> 12) & 0x3F) | 0x80);
83
+ buf[2] =(char) (((ch >> 6) & 0x3F) | 0x80);
84
+ buf[3] =(char) ((ch & 0x3F) | 0x80);
85
+ len += 3;
86
+ } else {
87
+ buf[0] = '?';
88
+ }
89
+ return len;
68
90
  }
69
91
 
70
- #ifdef HAVE_RUBY_ENCODING_H
71
- static VALUE CEncoding_ASCII_8BIT, CEncoding_UTF_8, CEncoding_UTF_16BE,
72
- CEncoding_UTF_16LE, CEncoding_UTF_32BE, CEncoding_UTF_32LE;
73
- static ID i_encoding, i_encode;
74
- #else
75
- static ID i_iconv;
76
- #endif
77
-
78
92
  static VALUE mJSON, mExt, cParser, eParserError, eNestingError;
79
93
  static VALUE CNaN, CInfinity, CMinusInfinity;
80
94
 
81
95
  static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions,
82
- i_chr, i_max_nesting, i_allow_nan, i_symbolize_names, i_quirks_mode,
83
- i_object_class, i_array_class, i_key_p, i_deep_const_get, i_match,
84
- i_match_string, i_aset, i_aref, i_leftshift;
96
+ i_chr, i_max_nesting, i_allow_nan, i_symbolize_names,
97
+ i_object_class, i_array_class, i_decimal_class, i_key_p,
98
+ i_deep_const_get, i_match, i_match_string, i_aset, i_aref,
99
+ i_leftshift, i_new, i_try_convert, i_freeze, i_uminus;
100
+
101
+
102
+ #line 125 "parser.rl"
103
+
104
+
85
105
 
106
+ enum {JSON_object_start = 1};
107
+ enum {JSON_object_first_final = 27};
108
+ enum {JSON_object_error = 0};
86
109
 
87
- #line 110 "parser.rl"
110
+ enum {JSON_object_en_main = 1};
88
111
 
112
+ static const char MAYBE_UNUSED(_JSON_object_nfa_targs)[] = {
113
+ 0, 0
114
+ };
89
115
 
116
+ static const char MAYBE_UNUSED(_JSON_object_nfa_offsets)[] = {
117
+ 0, 0, 0, 0, 0, 0, 0, 0,
118
+ 0, 0, 0, 0, 0, 0, 0, 0,
119
+ 0, 0, 0, 0, 0, 0, 0, 0,
120
+ 0, 0, 0, 0, 0
121
+ };
90
122
 
91
- #line 92 "parser.c"
92
- static const int JSON_object_start = 1;
93
- static const int JSON_object_first_final = 27;
94
- static const int JSON_object_error = 0;
123
+ static const char MAYBE_UNUSED(_JSON_object_nfa_push_actions)[] = {
124
+ 0, 0
125
+ };
95
126
 
96
- static const int JSON_object_en_main = 1;
127
+ static const char MAYBE_UNUSED(_JSON_object_nfa_pop_trans)[] = {
128
+ 0, 0
129
+ };
97
130
 
98
131
 
99
- #line 151 "parser.rl"
132
+ #line 167 "parser.rl"
100
133
 
101
134
 
102
- static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result)
135
+ static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting)
103
136
  {
104
- int cs = EVIL;
105
- VALUE last_name = Qnil;
106
- VALUE object_class = json->object_class;
137
+ int cs = EVIL;
138
+ VALUE last_name = Qnil;
139
+ VALUE object_class = json->object_class;
107
140
 
108
- if (json->max_nesting && json->current_nesting > json->max_nesting) {
109
- rb_raise(eNestingError, "nesting of %d is too deep", json->current_nesting);
110
- }
141
+ if (json->max_nesting && current_nesting > json->max_nesting) {
142
+ rb_raise(eNestingError, "nesting of %d is too deep", current_nesting);
143
+ }
111
144
 
112
- *result = NIL_P(object_class) ? rb_hash_new() : rb_class_new_instance(0, 0, object_class);
145
+ *result = NIL_P(object_class) ? rb_hash_new() : rb_class_new_instance(0, 0, object_class);
113
146
 
114
147
 
115
- #line 116 "parser.c"
116
148
  {
117
- cs = JSON_object_start;
149
+ cs = (int)JSON_object_start;
118
150
  }
119
151
 
120
- #line 166 "parser.rl"
152
+ #line 182 "parser.rl"
153
+
121
154
 
122
- #line 123 "parser.c"
123
155
  {
124
- if ( p == pe )
156
+ if ( p == pe )
125
157
  goto _test_eof;
126
- switch ( cs )
127
- {
128
- case 1:
129
- if ( (*p) == 123 )
130
- goto st2;
131
- goto st0;
132
- st0:
133
- cs = 0;
134
- goto _out;
135
- st2:
136
- if ( ++p == pe )
158
+ switch ( cs )
159
+ {
160
+ case 1:
161
+ goto st_case_1;
162
+ case 0:
163
+ goto st_case_0;
164
+ case 2:
165
+ goto st_case_2;
166
+ case 3:
167
+ goto st_case_3;
168
+ case 4:
169
+ goto st_case_4;
170
+ case 5:
171
+ goto st_case_5;
172
+ case 6:
173
+ goto st_case_6;
174
+ case 7:
175
+ goto st_case_7;
176
+ case 8:
177
+ goto st_case_8;
178
+ case 9:
179
+ goto st_case_9;
180
+ case 10:
181
+ goto st_case_10;
182
+ case 11:
183
+ goto st_case_11;
184
+ case 12:
185
+ goto st_case_12;
186
+ case 13:
187
+ goto st_case_13;
188
+ case 14:
189
+ goto st_case_14;
190
+ case 15:
191
+ goto st_case_15;
192
+ case 16:
193
+ goto st_case_16;
194
+ case 17:
195
+ goto st_case_17;
196
+ case 18:
197
+ goto st_case_18;
198
+ case 27:
199
+ goto st_case_27;
200
+ case 19:
201
+ goto st_case_19;
202
+ case 20:
203
+ goto st_case_20;
204
+ case 21:
205
+ goto st_case_21;
206
+ case 22:
207
+ goto st_case_22;
208
+ case 23:
209
+ goto st_case_23;
210
+ case 24:
211
+ goto st_case_24;
212
+ case 25:
213
+ goto st_case_25;
214
+ case 26:
215
+ goto st_case_26;
216
+ }
217
+ goto st_out;
218
+ st_case_1:
219
+ if ( ( (*( p))) == 123 ) {
220
+ goto st2;
221
+ }
222
+ {
223
+ goto st0;
224
+ }
225
+ st_case_0:
226
+ st0:
227
+ cs = 0;
228
+ goto _out;
229
+ st2:
230
+ p+= 1;
231
+ if ( p == pe )
137
232
  goto _test_eof2;
138
- case 2:
139
- switch( (*p) ) {
140
- case 13: goto st2;
141
- case 32: goto st2;
142
- case 34: goto tr2;
143
- case 47: goto st23;
144
- case 125: goto tr4;
145
- }
146
- if ( 9 <= (*p) && (*p) <= 10 )
147
- goto st2;
148
- goto st0;
149
- tr2:
150
- #line 133 "parser.rl"
151
- {
152
- char *np;
153
- json->parsing_name = 1;
154
- np = JSON_parse_string(json, p, pe, &last_name);
155
- json->parsing_name = 0;
156
- if (np == NULL) { p--; {p++; cs = 3; goto _out;} } else {p = (( np))-1;}
157
- }
158
- goto st3;
159
- st3:
160
- if ( ++p == pe )
161
- goto _test_eof3;
162
- case 3:
163
- #line 164 "parser.c"
164
- switch( (*p) ) {
165
- case 13: goto st3;
166
- case 32: goto st3;
167
- case 47: goto st4;
168
- case 58: goto st8;
169
- }
170
- if ( 9 <= (*p) && (*p) <= 10 )
233
+ st_case_2:
234
+ switch( ( (*( p))) ) {
235
+ case 13: {
236
+ goto st2;
237
+ }
238
+ case 32: {
239
+ goto st2;
240
+ }
241
+ case 34: {
242
+ goto ctr2;
243
+ }
244
+ case 47: {
245
+ goto st23;
246
+ }
247
+ case 125: {
248
+ goto ctr4;
249
+ }
250
+ }
251
+ if ( 9 <= ( (*( p))) && ( (*( p))) <= 10 ) {
252
+ goto st2;
253
+ }
254
+ {
255
+ goto st0;
256
+ }
257
+ ctr2:
258
+ {
259
+ #line 149 "parser.rl"
260
+
261
+ char *np;
262
+ json->parsing_name = 1;
263
+ np = JSON_parse_string(json, p, pe, &last_name);
264
+ json->parsing_name = 0;
265
+ if (np == NULL) { {p = p - 1; } {p+= 1; cs = 3; goto _out;} } else {p = (( np))-1;}
266
+
267
+ }
268
+
171
269
  goto st3;
172
- goto st0;
173
- st4:
174
- if ( ++p == pe )
270
+ st3:
271
+ p+= 1;
272
+ if ( p == pe )
273
+ goto _test_eof3;
274
+ st_case_3:
275
+ switch( ( (*( p))) ) {
276
+ case 13: {
277
+ goto st3;
278
+ }
279
+ case 32: {
280
+ goto st3;
281
+ }
282
+ case 47: {
283
+ goto st4;
284
+ }
285
+ case 58: {
286
+ goto st8;
287
+ }
288
+ }
289
+ if ( 9 <= ( (*( p))) && ( (*( p))) <= 10 ) {
290
+ goto st3;
291
+ }
292
+ {
293
+ goto st0;
294
+ }
295
+ st4:
296
+ p+= 1;
297
+ if ( p == pe )
175
298
  goto _test_eof4;
176
- case 4:
177
- switch( (*p) ) {
178
- case 42: goto st5;
179
- case 47: goto st7;
180
- }
181
- goto st0;
182
- st5:
183
- if ( ++p == pe )
299
+ st_case_4:
300
+ switch( ( (*( p))) ) {
301
+ case 42: {
302
+ goto st5;
303
+ }
304
+ case 47: {
305
+ goto st7;
306
+ }
307
+ }
308
+ {
309
+ goto st0;
310
+ }
311
+ st5:
312
+ p+= 1;
313
+ if ( p == pe )
184
314
  goto _test_eof5;
185
- case 5:
186
- if ( (*p) == 42 )
187
- goto st6;
188
- goto st5;
189
- st6:
190
- if ( ++p == pe )
315
+ st_case_5:
316
+ if ( ( (*( p))) == 42 ) {
317
+ goto st6;
318
+ }
319
+ {
320
+ goto st5;
321
+ }
322
+ st6:
323
+ p+= 1;
324
+ if ( p == pe )
191
325
  goto _test_eof6;
192
- case 6:
193
- switch( (*p) ) {
194
- case 42: goto st6;
195
- case 47: goto st3;
196
- }
197
- goto st5;
198
- st7:
199
- if ( ++p == pe )
326
+ st_case_6:
327
+ switch( ( (*( p))) ) {
328
+ case 42: {
329
+ goto st6;
330
+ }
331
+ case 47: {
332
+ goto st3;
333
+ }
334
+ }
335
+ {
336
+ goto st5;
337
+ }
338
+ st7:
339
+ p+= 1;
340
+ if ( p == pe )
200
341
  goto _test_eof7;
201
- case 7:
202
- if ( (*p) == 10 )
203
- goto st3;
204
- goto st7;
205
- st8:
206
- if ( ++p == pe )
342
+ st_case_7:
343
+ if ( ( (*( p))) == 10 ) {
344
+ goto st3;
345
+ }
346
+ {
347
+ goto st7;
348
+ }
349
+ st8:
350
+ p+= 1;
351
+ if ( p == pe )
207
352
  goto _test_eof8;
208
- case 8:
209
- switch( (*p) ) {
210
- case 13: goto st8;
211
- case 32: goto st8;
212
- case 34: goto tr11;
213
- case 45: goto tr11;
214
- case 47: goto st19;
215
- case 73: goto tr11;
216
- case 78: goto tr11;
217
- case 91: goto tr11;
218
- case 102: goto tr11;
219
- case 110: goto tr11;
220
- case 116: goto tr11;
221
- case 123: goto tr11;
222
- }
223
- if ( (*p) > 10 ) {
224
- if ( 48 <= (*p) && (*p) <= 57 )
225
- goto tr11;
226
- } else if ( (*p) >= 9 )
227
- goto st8;
228
- goto st0;
229
- tr11:
230
- #line 118 "parser.rl"
231
- {
232
- VALUE v = Qnil;
233
- char *np = JSON_parse_value(json, p, pe, &v);
234
- if (np == NULL) {
235
- p--; {p++; cs = 9; goto _out;}
236
- } else {
237
- if (NIL_P(json->object_class)) {
238
- rb_hash_aset(*result, last_name, v);
239
- } else {
240
- rb_funcall(*result, i_aset, 2, last_name, v);
241
- }
242
- {p = (( np))-1;}
243
- }
244
- }
245
- goto st9;
246
- st9:
247
- if ( ++p == pe )
248
- goto _test_eof9;
249
- case 9:
250
- #line 251 "parser.c"
251
- switch( (*p) ) {
252
- case 13: goto st9;
253
- case 32: goto st9;
254
- case 44: goto st10;
255
- case 47: goto st15;
256
- case 125: goto tr4;
257
- }
258
- if ( 9 <= (*p) && (*p) <= 10 )
353
+ st_case_8:
354
+ switch( ( (*( p))) ) {
355
+ case 13: {
356
+ goto st8;
357
+ }
358
+ case 32: {
359
+ goto st8;
360
+ }
361
+ case 34: {
362
+ goto ctr11;
363
+ }
364
+ case 45: {
365
+ goto ctr11;
366
+ }
367
+ case 47: {
368
+ goto st19;
369
+ }
370
+ case 73: {
371
+ goto ctr11;
372
+ }
373
+ case 78: {
374
+ goto ctr11;
375
+ }
376
+ case 91: {
377
+ goto ctr11;
378
+ }
379
+ case 102: {
380
+ goto ctr11;
381
+ }
382
+ case 110: {
383
+ goto ctr11;
384
+ }
385
+ case 116: {
386
+ goto ctr11;
387
+ }
388
+ case 123: {
389
+ goto ctr11;
390
+ }
391
+ }
392
+ if ( ( (*( p))) > 10 ) {
393
+ if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) {
394
+ goto ctr11;
395
+ }
396
+ } else if ( ( (*( p))) >= 9 ) {
397
+ goto st8;
398
+ }
399
+ {
400
+ goto st0;
401
+ }
402
+ ctr11:
403
+ {
404
+ #line 133 "parser.rl"
405
+
406
+ VALUE v = Qnil;
407
+ char *np = JSON_parse_value(json, p, pe, &v, current_nesting);
408
+ if (np == NULL) {
409
+ {p = p - 1; } {p+= 1; cs = 9; goto _out;}
410
+ } else {
411
+ if (NIL_P(json->object_class)) {
412
+ OBJ_FREEZE(last_name);
413
+ rb_hash_aset(*result, last_name, v);
414
+ } else {
415
+ rb_funcall(*result, i_aset, 2, last_name, v);
416
+ }
417
+ {p = (( np))-1;}
418
+
419
+ }
420
+ }
421
+
259
422
  goto st9;
260
- goto st0;
261
- st10:
262
- if ( ++p == pe )
423
+ st9:
424
+ p+= 1;
425
+ if ( p == pe )
426
+ goto _test_eof9;
427
+ st_case_9:
428
+ switch( ( (*( p))) ) {
429
+ case 13: {
430
+ goto st9;
431
+ }
432
+ case 32: {
433
+ goto st9;
434
+ }
435
+ case 44: {
436
+ goto st10;
437
+ }
438
+ case 47: {
439
+ goto st15;
440
+ }
441
+ case 125: {
442
+ goto ctr4;
443
+ }
444
+ }
445
+ if ( 9 <= ( (*( p))) && ( (*( p))) <= 10 ) {
446
+ goto st9;
447
+ }
448
+ {
449
+ goto st0;
450
+ }
451
+ st10:
452
+ p+= 1;
453
+ if ( p == pe )
263
454
  goto _test_eof10;
264
- case 10:
265
- switch( (*p) ) {
266
- case 13: goto st10;
267
- case 32: goto st10;
268
- case 34: goto tr2;
269
- case 47: goto st11;
270
- }
271
- if ( 9 <= (*p) && (*p) <= 10 )
272
- goto st10;
273
- goto st0;
274
- st11:
275
- if ( ++p == pe )
455
+ st_case_10:
456
+ switch( ( (*( p))) ) {
457
+ case 13: {
458
+ goto st10;
459
+ }
460
+ case 32: {
461
+ goto st10;
462
+ }
463
+ case 34: {
464
+ goto ctr2;
465
+ }
466
+ case 47: {
467
+ goto st11;
468
+ }
469
+ }
470
+ if ( 9 <= ( (*( p))) && ( (*( p))) <= 10 ) {
471
+ goto st10;
472
+ }
473
+ {
474
+ goto st0;
475
+ }
476
+ st11:
477
+ p+= 1;
478
+ if ( p == pe )
276
479
  goto _test_eof11;
277
- case 11:
278
- switch( (*p) ) {
279
- case 42: goto st12;
280
- case 47: goto st14;
281
- }
282
- goto st0;
283
- st12:
284
- if ( ++p == pe )
480
+ st_case_11:
481
+ switch( ( (*( p))) ) {
482
+ case 42: {
483
+ goto st12;
484
+ }
485
+ case 47: {
486
+ goto st14;
487
+ }
488
+ }
489
+ {
490
+ goto st0;
491
+ }
492
+ st12:
493
+ p+= 1;
494
+ if ( p == pe )
285
495
  goto _test_eof12;
286
- case 12:
287
- if ( (*p) == 42 )
288
- goto st13;
289
- goto st12;
290
- st13:
291
- if ( ++p == pe )
496
+ st_case_12:
497
+ if ( ( (*( p))) == 42 ) {
498
+ goto st13;
499
+ }
500
+ {
501
+ goto st12;
502
+ }
503
+ st13:
504
+ p+= 1;
505
+ if ( p == pe )
292
506
  goto _test_eof13;
293
- case 13:
294
- switch( (*p) ) {
295
- case 42: goto st13;
296
- case 47: goto st10;
297
- }
298
- goto st12;
299
- st14:
300
- if ( ++p == pe )
507
+ st_case_13:
508
+ switch( ( (*( p))) ) {
509
+ case 42: {
510
+ goto st13;
511
+ }
512
+ case 47: {
513
+ goto st10;
514
+ }
515
+ }
516
+ {
517
+ goto st12;
518
+ }
519
+ st14:
520
+ p+= 1;
521
+ if ( p == pe )
301
522
  goto _test_eof14;
302
- case 14:
303
- if ( (*p) == 10 )
304
- goto st10;
305
- goto st14;
306
- st15:
307
- if ( ++p == pe )
523
+ st_case_14:
524
+ if ( ( (*( p))) == 10 ) {
525
+ goto st10;
526
+ }
527
+ {
528
+ goto st14;
529
+ }
530
+ st15:
531
+ p+= 1;
532
+ if ( p == pe )
308
533
  goto _test_eof15;
309
- case 15:
310
- switch( (*p) ) {
311
- case 42: goto st16;
312
- case 47: goto st18;
313
- }
314
- goto st0;
315
- st16:
316
- if ( ++p == pe )
534
+ st_case_15:
535
+ switch( ( (*( p))) ) {
536
+ case 42: {
537
+ goto st16;
538
+ }
539
+ case 47: {
540
+ goto st18;
541
+ }
542
+ }
543
+ {
544
+ goto st0;
545
+ }
546
+ st16:
547
+ p+= 1;
548
+ if ( p == pe )
317
549
  goto _test_eof16;
318
- case 16:
319
- if ( (*p) == 42 )
320
- goto st17;
321
- goto st16;
322
- st17:
323
- if ( ++p == pe )
550
+ st_case_16:
551
+ if ( ( (*( p))) == 42 ) {
552
+ goto st17;
553
+ }
554
+ {
555
+ goto st16;
556
+ }
557
+ st17:
558
+ p+= 1;
559
+ if ( p == pe )
324
560
  goto _test_eof17;
325
- case 17:
326
- switch( (*p) ) {
327
- case 42: goto st17;
328
- case 47: goto st9;
329
- }
330
- goto st16;
331
- st18:
332
- if ( ++p == pe )
561
+ st_case_17:
562
+ switch( ( (*( p))) ) {
563
+ case 42: {
564
+ goto st17;
565
+ }
566
+ case 47: {
567
+ goto st9;
568
+ }
569
+ }
570
+ {
571
+ goto st16;
572
+ }
573
+ st18:
574
+ p+= 1;
575
+ if ( p == pe )
333
576
  goto _test_eof18;
334
- case 18:
335
- if ( (*p) == 10 )
336
- goto st9;
337
- goto st18;
338
- tr4:
339
- #line 141 "parser.rl"
340
- { p--; {p++; cs = 27; goto _out;} }
341
- goto st27;
342
- st27:
343
- if ( ++p == pe )
577
+ st_case_18:
578
+ if ( ( (*( p))) == 10 ) {
579
+ goto st9;
580
+ }
581
+ {
582
+ goto st18;
583
+ }
584
+ ctr4:
585
+ {
586
+ #line 157 "parser.rl"
587
+ {p = p - 1; } {p+= 1; cs = 27; goto _out;} }
588
+
589
+ goto st27;
590
+ st27:
591
+ p+= 1;
592
+ if ( p == pe )
344
593
  goto _test_eof27;
345
- case 27:
346
- #line 347 "parser.c"
347
- goto st0;
348
- st19:
349
- if ( ++p == pe )
594
+ st_case_27:
595
+ {
596
+ goto st0;
597
+ }
598
+ st19:
599
+ p+= 1;
600
+ if ( p == pe )
350
601
  goto _test_eof19;
351
- case 19:
352
- switch( (*p) ) {
353
- case 42: goto st20;
354
- case 47: goto st22;
355
- }
356
- goto st0;
357
- st20:
358
- if ( ++p == pe )
602
+ st_case_19:
603
+ switch( ( (*( p))) ) {
604
+ case 42: {
605
+ goto st20;
606
+ }
607
+ case 47: {
608
+ goto st22;
609
+ }
610
+ }
611
+ {
612
+ goto st0;
613
+ }
614
+ st20:
615
+ p+= 1;
616
+ if ( p == pe )
359
617
  goto _test_eof20;
360
- case 20:
361
- if ( (*p) == 42 )
362
- goto st21;
363
- goto st20;
364
- st21:
365
- if ( ++p == pe )
618
+ st_case_20:
619
+ if ( ( (*( p))) == 42 ) {
620
+ goto st21;
621
+ }
622
+ {
623
+ goto st20;
624
+ }
625
+ st21:
626
+ p+= 1;
627
+ if ( p == pe )
366
628
  goto _test_eof21;
367
- case 21:
368
- switch( (*p) ) {
369
- case 42: goto st21;
370
- case 47: goto st8;
371
- }
372
- goto st20;
373
- st22:
374
- if ( ++p == pe )
629
+ st_case_21:
630
+ switch( ( (*( p))) ) {
631
+ case 42: {
632
+ goto st21;
633
+ }
634
+ case 47: {
635
+ goto st8;
636
+ }
637
+ }
638
+ {
639
+ goto st20;
640
+ }
641
+ st22:
642
+ p+= 1;
643
+ if ( p == pe )
375
644
  goto _test_eof22;
376
- case 22:
377
- if ( (*p) == 10 )
378
- goto st8;
379
- goto st22;
380
- st23:
381
- if ( ++p == pe )
645
+ st_case_22:
646
+ if ( ( (*( p))) == 10 ) {
647
+ goto st8;
648
+ }
649
+ {
650
+ goto st22;
651
+ }
652
+ st23:
653
+ p+= 1;
654
+ if ( p == pe )
382
655
  goto _test_eof23;
383
- case 23:
384
- switch( (*p) ) {
385
- case 42: goto st24;
386
- case 47: goto st26;
387
- }
388
- goto st0;
389
- st24:
390
- if ( ++p == pe )
656
+ st_case_23:
657
+ switch( ( (*( p))) ) {
658
+ case 42: {
659
+ goto st24;
660
+ }
661
+ case 47: {
662
+ goto st26;
663
+ }
664
+ }
665
+ {
666
+ goto st0;
667
+ }
668
+ st24:
669
+ p+= 1;
670
+ if ( p == pe )
391
671
  goto _test_eof24;
392
- case 24:
393
- if ( (*p) == 42 )
394
- goto st25;
395
- goto st24;
396
- st25:
397
- if ( ++p == pe )
672
+ st_case_24:
673
+ if ( ( (*( p))) == 42 ) {
674
+ goto st25;
675
+ }
676
+ {
677
+ goto st24;
678
+ }
679
+ st25:
680
+ p+= 1;
681
+ if ( p == pe )
398
682
  goto _test_eof25;
399
- case 25:
400
- switch( (*p) ) {
401
- case 42: goto st25;
402
- case 47: goto st2;
403
- }
404
- goto st24;
405
- st26:
406
- if ( ++p == pe )
683
+ st_case_25:
684
+ switch( ( (*( p))) ) {
685
+ case 42: {
686
+ goto st25;
687
+ }
688
+ case 47: {
689
+ goto st2;
690
+ }
691
+ }
692
+ {
693
+ goto st24;
694
+ }
695
+ st26:
696
+ p+= 1;
697
+ if ( p == pe )
407
698
  goto _test_eof26;
408
- case 26:
409
- if ( (*p) == 10 )
410
- goto st2;
411
- goto st26;
412
- }
413
- _test_eof2: cs = 2; goto _test_eof;
414
- _test_eof3: cs = 3; goto _test_eof;
415
- _test_eof4: cs = 4; goto _test_eof;
416
- _test_eof5: cs = 5; goto _test_eof;
417
- _test_eof6: cs = 6; goto _test_eof;
418
- _test_eof7: cs = 7; goto _test_eof;
419
- _test_eof8: cs = 8; goto _test_eof;
420
- _test_eof9: cs = 9; goto _test_eof;
421
- _test_eof10: cs = 10; goto _test_eof;
422
- _test_eof11: cs = 11; goto _test_eof;
423
- _test_eof12: cs = 12; goto _test_eof;
424
- _test_eof13: cs = 13; goto _test_eof;
425
- _test_eof14: cs = 14; goto _test_eof;
426
- _test_eof15: cs = 15; goto _test_eof;
427
- _test_eof16: cs = 16; goto _test_eof;
428
- _test_eof17: cs = 17; goto _test_eof;
429
- _test_eof18: cs = 18; goto _test_eof;
430
- _test_eof27: cs = 27; goto _test_eof;
431
- _test_eof19: cs = 19; goto _test_eof;
432
- _test_eof20: cs = 20; goto _test_eof;
433
- _test_eof21: cs = 21; goto _test_eof;
434
- _test_eof22: cs = 22; goto _test_eof;
435
- _test_eof23: cs = 23; goto _test_eof;
436
- _test_eof24: cs = 24; goto _test_eof;
437
- _test_eof25: cs = 25; goto _test_eof;
438
- _test_eof26: cs = 26; goto _test_eof;
439
-
440
- _test_eof: {}
441
- _out: {}
699
+ st_case_26:
700
+ if ( ( (*( p))) == 10 ) {
701
+ goto st2;
702
+ }
703
+ {
704
+ goto st26;
705
+ }
706
+ st_out:
707
+ _test_eof2: cs = 2; goto _test_eof;
708
+ _test_eof3: cs = 3; goto _test_eof;
709
+ _test_eof4: cs = 4; goto _test_eof;
710
+ _test_eof5: cs = 5; goto _test_eof;
711
+ _test_eof6: cs = 6; goto _test_eof;
712
+ _test_eof7: cs = 7; goto _test_eof;
713
+ _test_eof8: cs = 8; goto _test_eof;
714
+ _test_eof9: cs = 9; goto _test_eof;
715
+ _test_eof10: cs = 10; goto _test_eof;
716
+ _test_eof11: cs = 11; goto _test_eof;
717
+ _test_eof12: cs = 12; goto _test_eof;
718
+ _test_eof13: cs = 13; goto _test_eof;
719
+ _test_eof14: cs = 14; goto _test_eof;
720
+ _test_eof15: cs = 15; goto _test_eof;
721
+ _test_eof16: cs = 16; goto _test_eof;
722
+ _test_eof17: cs = 17; goto _test_eof;
723
+ _test_eof18: cs = 18; goto _test_eof;
724
+ _test_eof27: cs = 27; goto _test_eof;
725
+ _test_eof19: cs = 19; goto _test_eof;
726
+ _test_eof20: cs = 20; goto _test_eof;
727
+ _test_eof21: cs = 21; goto _test_eof;
728
+ _test_eof22: cs = 22; goto _test_eof;
729
+ _test_eof23: cs = 23; goto _test_eof;
730
+ _test_eof24: cs = 24; goto _test_eof;
731
+ _test_eof25: cs = 25; goto _test_eof;
732
+ _test_eof26: cs = 26; goto _test_eof;
733
+
734
+ _test_eof: {}
735
+ _out: {}
736
+ }
737
+
738
+ #line 183 "parser.rl"
739
+
740
+
741
+ if (cs >= JSON_object_first_final) {
742
+ if (json->create_additions) {
743
+ VALUE klassname;
744
+ if (NIL_P(json->object_class)) {
745
+ klassname = rb_hash_aref(*result, json->create_id);
746
+ } else {
747
+ klassname = rb_funcall(*result, i_aref, 1, json->create_id);
748
+ }
749
+ if (!NIL_P(klassname)) {
750
+ VALUE klass = rb_funcall(mJSON, i_deep_const_get, 1, klassname);
751
+ if (RTEST(rb_funcall(klass, i_json_creatable_p, 0))) {
752
+ *result = rb_funcall(klass, i_json_create, 1, *result);
753
+ }
754
+ }
755
+ }
756
+ return p + 1;
757
+ } else {
758
+ return NULL;
442
759
  }
760
+ }
443
761
 
444
- #line 167 "parser.rl"
445
762
 
446
- if (cs >= JSON_object_first_final) {
447
- if (json->create_additions) {
448
- VALUE klassname;
449
- if (NIL_P(json->object_class)) {
450
- klassname = rb_hash_aref(*result, json->create_id);
451
- } else {
452
- klassname = rb_funcall(*result, i_aref, 1, json->create_id);
453
- }
454
- if (!NIL_P(klassname)) {
455
- VALUE klass = rb_funcall(mJSON, i_deep_const_get, 1, klassname);
456
- if (RTEST(rb_funcall(klass, i_json_creatable_p, 0))) {
457
- *result = rb_funcall(klass, i_json_create, 1, *result);
458
- }
459
- }
460
- }
461
- return p + 1;
462
- } else {
463
- return NULL;
464
- }
465
- }
466
763
 
764
+ enum {JSON_value_start = 1};
765
+ enum {JSON_value_first_final = 29};
766
+ enum {JSON_value_error = 0};
467
767
 
768
+ enum {JSON_value_en_main = 1};
468
769
 
469
- #line 470 "parser.c"
470
- static const int JSON_value_start = 1;
471
- static const int JSON_value_first_final = 21;
472
- static const int JSON_value_error = 0;
770
+ static const char MAYBE_UNUSED(_JSON_value_nfa_targs)[] = {
771
+ 0, 0
772
+ };
473
773
 
474
- static const int JSON_value_en_main = 1;
774
+ static const char MAYBE_UNUSED(_JSON_value_nfa_offsets)[] = {
775
+ 0, 0, 0, 0, 0, 0, 0, 0,
776
+ 0, 0, 0, 0, 0, 0, 0, 0,
777
+ 0, 0, 0, 0, 0, 0, 0, 0,
778
+ 0, 0, 0, 0, 0, 0, 0
779
+ };
780
+
781
+ static const char MAYBE_UNUSED(_JSON_value_nfa_push_actions)[] = {
782
+ 0, 0
783
+ };
784
+
785
+ static const char MAYBE_UNUSED(_JSON_value_nfa_pop_trans)[] = {
786
+ 0, 0
787
+ };
475
788
 
476
789
 
477
- #line 271 "parser.rl"
790
+ #line 283 "parser.rl"
478
791
 
479
792
 
480
- static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result)
793
+ static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting)
481
794
  {
482
- int cs = EVIL;
795
+ int cs = EVIL;
483
796
 
484
797
 
485
- #line 486 "parser.c"
486
798
  {
487
- cs = JSON_value_start;
799
+ cs = (int)JSON_value_start;
488
800
  }
489
801
 
490
- #line 278 "parser.rl"
802
+ #line 290 "parser.rl"
803
+
491
804
 
492
- #line 493 "parser.c"
493
805
  {
494
- if ( p == pe )
806
+ if ( p == pe )
495
807
  goto _test_eof;
496
- switch ( cs )
497
- {
498
- case 1:
499
- switch( (*p) ) {
500
- case 34: goto tr0;
501
- case 45: goto tr2;
502
- case 73: goto st2;
503
- case 78: goto st9;
504
- case 91: goto tr5;
505
- case 102: goto st11;
506
- case 110: goto st15;
507
- case 116: goto st18;
508
- case 123: goto tr9;
509
- }
510
- if ( 48 <= (*p) && (*p) <= 57 )
511
- goto tr2;
512
- goto st0;
513
- st0:
514
- cs = 0;
515
- goto _out;
516
- tr0:
517
- #line 219 "parser.rl"
518
- {
519
- char *np = JSON_parse_string(json, p, pe, result);
520
- if (np == NULL) { p--; {p++; cs = 21; goto _out;} } else {p = (( np))-1;}
521
- }
522
- goto st21;
523
- tr2:
524
- #line 224 "parser.rl"
525
- {
526
- char *np;
527
- if(pe > p + 9 - json->quirks_mode && !strncmp(MinusInfinity, p, 9)) {
528
- if (json->allow_nan) {
529
- *result = CMinusInfinity;
530
- {p = (( p + 10))-1;}
531
- p--; {p++; cs = 21; goto _out;}
532
- } else {
533
- rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p);
534
- }
535
- }
536
- np = JSON_parse_float(json, p, pe, result);
537
- if (np != NULL) {p = (( np))-1;}
538
- np = JSON_parse_integer(json, p, pe, result);
539
- if (np != NULL) {p = (( np))-1;}
540
- p--; {p++; cs = 21; goto _out;}
541
- }
542
- goto st21;
543
- tr5:
544
- #line 242 "parser.rl"
545
- {
546
- char *np;
547
- json->current_nesting++;
548
- np = JSON_parse_array(json, p, pe, result);
549
- json->current_nesting--;
550
- if (np == NULL) { p--; {p++; cs = 21; goto _out;} } else {p = (( np))-1;}
551
- }
552
- goto st21;
553
- tr9:
554
- #line 250 "parser.rl"
555
- {
556
- char *np;
557
- json->current_nesting++;
558
- np = JSON_parse_object(json, p, pe, result);
559
- json->current_nesting--;
560
- if (np == NULL) { p--; {p++; cs = 21; goto _out;} } else {p = (( np))-1;}
561
- }
562
- goto st21;
563
- tr16:
564
- #line 212 "parser.rl"
565
- {
566
- if (json->allow_nan) {
567
- *result = CInfinity;
568
- } else {
569
- rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p - 8);
570
- }
571
- }
572
- goto st21;
573
- tr18:
574
- #line 205 "parser.rl"
575
- {
576
- if (json->allow_nan) {
577
- *result = CNaN;
578
- } else {
579
- rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p - 2);
580
- }
581
- }
582
- goto st21;
583
- tr22:
584
- #line 199 "parser.rl"
585
- {
586
- *result = Qfalse;
587
- }
588
- goto st21;
589
- tr25:
590
- #line 196 "parser.rl"
591
- {
592
- *result = Qnil;
593
- }
594
- goto st21;
595
- tr28:
596
- #line 202 "parser.rl"
597
- {
598
- *result = Qtrue;
599
- }
600
- goto st21;
601
- st21:
602
- if ( ++p == pe )
603
- goto _test_eof21;
604
- case 21:
605
- #line 258 "parser.rl"
606
- { p--; {p++; cs = 21; goto _out;} }
607
- #line 608 "parser.c"
608
- goto st0;
609
- st2:
610
- if ( ++p == pe )
808
+ switch ( cs )
809
+ {
810
+ case 1:
811
+ goto st_case_1;
812
+ case 0:
813
+ goto st_case_0;
814
+ case 29:
815
+ goto st_case_29;
816
+ case 2:
817
+ goto st_case_2;
818
+ case 3:
819
+ goto st_case_3;
820
+ case 4:
821
+ goto st_case_4;
822
+ case 5:
823
+ goto st_case_5;
824
+ case 6:
825
+ goto st_case_6;
826
+ case 7:
827
+ goto st_case_7;
828
+ case 8:
829
+ goto st_case_8;
830
+ case 9:
831
+ goto st_case_9;
832
+ case 10:
833
+ goto st_case_10;
834
+ case 11:
835
+ goto st_case_11;
836
+ case 12:
837
+ goto st_case_12;
838
+ case 13:
839
+ goto st_case_13;
840
+ case 14:
841
+ goto st_case_14;
842
+ case 15:
843
+ goto st_case_15;
844
+ case 16:
845
+ goto st_case_16;
846
+ case 17:
847
+ goto st_case_17;
848
+ case 18:
849
+ goto st_case_18;
850
+ case 19:
851
+ goto st_case_19;
852
+ case 20:
853
+ goto st_case_20;
854
+ case 21:
855
+ goto st_case_21;
856
+ case 22:
857
+ goto st_case_22;
858
+ case 23:
859
+ goto st_case_23;
860
+ case 24:
861
+ goto st_case_24;
862
+ case 25:
863
+ goto st_case_25;
864
+ case 26:
865
+ goto st_case_26;
866
+ case 27:
867
+ goto st_case_27;
868
+ case 28:
869
+ goto st_case_28;
870
+ }
871
+ goto st_out;
872
+ st1:
873
+ p+= 1;
874
+ if ( p == pe )
875
+ goto _test_eof1;
876
+ st_case_1:
877
+ switch( ( (*( p))) ) {
878
+ case 13: {
879
+ goto st1;
880
+ }
881
+ case 32: {
882
+ goto st1;
883
+ }
884
+ case 34: {
885
+ goto ctr2;
886
+ }
887
+ case 45: {
888
+ goto ctr3;
889
+ }
890
+ case 47: {
891
+ goto st6;
892
+ }
893
+ case 73: {
894
+ goto st10;
895
+ }
896
+ case 78: {
897
+ goto st17;
898
+ }
899
+ case 91: {
900
+ goto ctr7;
901
+ }
902
+ case 102: {
903
+ goto st19;
904
+ }
905
+ case 110: {
906
+ goto st23;
907
+ }
908
+ case 116: {
909
+ goto st26;
910
+ }
911
+ case 123: {
912
+ goto ctr11;
913
+ }
914
+ }
915
+ if ( ( (*( p))) > 10 ) {
916
+ if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) {
917
+ goto ctr3;
918
+ }
919
+ } else if ( ( (*( p))) >= 9 ) {
920
+ goto st1;
921
+ }
922
+ {
923
+ goto st0;
924
+ }
925
+ st_case_0:
926
+ st0:
927
+ cs = 0;
928
+ goto _out;
929
+ ctr2:
930
+ {
931
+ #line 235 "parser.rl"
932
+
933
+ char *np = JSON_parse_string(json, p, pe, result);
934
+ if (np == NULL) { {p = p - 1; } {p+= 1; cs = 29; goto _out;} } else {p = (( np))-1;}
935
+
936
+ }
937
+
938
+ goto st29;
939
+ ctr3:
940
+ {
941
+ #line 240 "parser.rl"
942
+
943
+ char *np;
944
+ if(pe > p + 8 && !strncmp(MinusInfinity, p, 9)) {
945
+ if (json->allow_nan) {
946
+ *result = CMinusInfinity;
947
+ {p = (( p + 10))-1;}
948
+
949
+ {p = p - 1; } {p+= 1; cs = 29; goto _out;}
950
+ } else {
951
+ rb_enc_raise(EXC_ENCODING eParserError, "%u: unexpected token at '%s'", __LINE__, p);
952
+ }
953
+ }
954
+ np = JSON_parse_float(json, p, pe, result);
955
+ if (np != NULL) {p = (( np))-1;}
956
+
957
+ np = JSON_parse_integer(json, p, pe, result);
958
+ if (np != NULL) {p = (( np))-1;}
959
+
960
+ {p = p - 1; } {p+= 1; cs = 29; goto _out;}
961
+ }
962
+
963
+ goto st29;
964
+ ctr7:
965
+ {
966
+ #line 258 "parser.rl"
967
+
968
+ char *np;
969
+ np = JSON_parse_array(json, p, pe, result, current_nesting + 1);
970
+ if (np == NULL) { {p = p - 1; } {p+= 1; cs = 29; goto _out;} } else {p = (( np))-1;}
971
+
972
+ }
973
+
974
+ goto st29;
975
+ ctr11:
976
+ {
977
+ #line 264 "parser.rl"
978
+
979
+ char *np;
980
+ np = JSON_parse_object(json, p, pe, result, current_nesting + 1);
981
+ if (np == NULL) { {p = p - 1; } {p+= 1; cs = 29; goto _out;} } else {p = (( np))-1;}
982
+
983
+ }
984
+
985
+ goto st29;
986
+ ctr25:
987
+ {
988
+ #line 228 "parser.rl"
989
+
990
+ if (json->allow_nan) {
991
+ *result = CInfinity;
992
+ } else {
993
+ rb_enc_raise(EXC_ENCODING eParserError, "%u: unexpected token at '%s'", __LINE__, p - 8);
994
+ }
995
+ }
996
+
997
+ goto st29;
998
+ ctr27:
999
+ {
1000
+ #line 221 "parser.rl"
1001
+
1002
+ if (json->allow_nan) {
1003
+ *result = CNaN;
1004
+ } else {
1005
+ rb_enc_raise(EXC_ENCODING eParserError, "%u: unexpected token at '%s'", __LINE__, p - 2);
1006
+ }
1007
+ }
1008
+
1009
+ goto st29;
1010
+ ctr31:
1011
+ {
1012
+ #line 215 "parser.rl"
1013
+
1014
+ *result = Qfalse;
1015
+ }
1016
+
1017
+ goto st29;
1018
+ ctr34:
1019
+ {
1020
+ #line 212 "parser.rl"
1021
+
1022
+ *result = Qnil;
1023
+ }
1024
+
1025
+ goto st29;
1026
+ ctr37:
1027
+ {
1028
+ #line 218 "parser.rl"
1029
+
1030
+ *result = Qtrue;
1031
+ }
1032
+
1033
+ goto st29;
1034
+ st29:
1035
+ p+= 1;
1036
+ if ( p == pe )
1037
+ goto _test_eof29;
1038
+ st_case_29:
1039
+ {
1040
+ #line 270 "parser.rl"
1041
+ {p = p - 1; } {p+= 1; cs = 29; goto _out;} }
1042
+ switch( ( (*( p))) ) {
1043
+ case 13: {
1044
+ goto st29;
1045
+ }
1046
+ case 32: {
1047
+ goto st29;
1048
+ }
1049
+ case 47: {
1050
+ goto st2;
1051
+ }
1052
+ }
1053
+ if ( 9 <= ( (*( p))) && ( (*( p))) <= 10 ) {
1054
+ goto st29;
1055
+ }
1056
+ {
1057
+ goto st0;
1058
+ }
1059
+ st2:
1060
+ p+= 1;
1061
+ if ( p == pe )
611
1062
  goto _test_eof2;
612
- case 2:
613
- if ( (*p) == 110 )
614
- goto st3;
615
- goto st0;
616
- st3:
617
- if ( ++p == pe )
1063
+ st_case_2:
1064
+ switch( ( (*( p))) ) {
1065
+ case 42: {
1066
+ goto st3;
1067
+ }
1068
+ case 47: {
1069
+ goto st5;
1070
+ }
1071
+ }
1072
+ {
1073
+ goto st0;
1074
+ }
1075
+ st3:
1076
+ p+= 1;
1077
+ if ( p == pe )
618
1078
  goto _test_eof3;
619
- case 3:
620
- if ( (*p) == 102 )
621
- goto st4;
622
- goto st0;
623
- st4:
624
- if ( ++p == pe )
1079
+ st_case_3:
1080
+ if ( ( (*( p))) == 42 ) {
1081
+ goto st4;
1082
+ }
1083
+ {
1084
+ goto st3;
1085
+ }
1086
+ st4:
1087
+ p+= 1;
1088
+ if ( p == pe )
625
1089
  goto _test_eof4;
626
- case 4:
627
- if ( (*p) == 105 )
628
- goto st5;
629
- goto st0;
630
- st5:
631
- if ( ++p == pe )
1090
+ st_case_4:
1091
+ switch( ( (*( p))) ) {
1092
+ case 42: {
1093
+ goto st4;
1094
+ }
1095
+ case 47: {
1096
+ goto st29;
1097
+ }
1098
+ }
1099
+ {
1100
+ goto st3;
1101
+ }
1102
+ st5:
1103
+ p+= 1;
1104
+ if ( p == pe )
632
1105
  goto _test_eof5;
633
- case 5:
634
- if ( (*p) == 110 )
635
- goto st6;
636
- goto st0;
637
- st6:
638
- if ( ++p == pe )
1106
+ st_case_5:
1107
+ if ( ( (*( p))) == 10 ) {
1108
+ goto st29;
1109
+ }
1110
+ {
1111
+ goto st5;
1112
+ }
1113
+ st6:
1114
+ p+= 1;
1115
+ if ( p == pe )
639
1116
  goto _test_eof6;
640
- case 6:
641
- if ( (*p) == 105 )
642
- goto st7;
643
- goto st0;
644
- st7:
645
- if ( ++p == pe )
1117
+ st_case_6:
1118
+ switch( ( (*( p))) ) {
1119
+ case 42: {
1120
+ goto st7;
1121
+ }
1122
+ case 47: {
1123
+ goto st9;
1124
+ }
1125
+ }
1126
+ {
1127
+ goto st0;
1128
+ }
1129
+ st7:
1130
+ p+= 1;
1131
+ if ( p == pe )
646
1132
  goto _test_eof7;
647
- case 7:
648
- if ( (*p) == 116 )
649
- goto st8;
650
- goto st0;
651
- st8:
652
- if ( ++p == pe )
1133
+ st_case_7:
1134
+ if ( ( (*( p))) == 42 ) {
1135
+ goto st8;
1136
+ }
1137
+ {
1138
+ goto st7;
1139
+ }
1140
+ st8:
1141
+ p+= 1;
1142
+ if ( p == pe )
653
1143
  goto _test_eof8;
654
- case 8:
655
- if ( (*p) == 121 )
656
- goto tr16;
657
- goto st0;
658
- st9:
659
- if ( ++p == pe )
1144
+ st_case_8:
1145
+ switch( ( (*( p))) ) {
1146
+ case 42: {
1147
+ goto st8;
1148
+ }
1149
+ case 47: {
1150
+ goto st1;
1151
+ }
1152
+ }
1153
+ {
1154
+ goto st7;
1155
+ }
1156
+ st9:
1157
+ p+= 1;
1158
+ if ( p == pe )
660
1159
  goto _test_eof9;
661
- case 9:
662
- if ( (*p) == 97 )
663
- goto st10;
664
- goto st0;
665
- st10:
666
- if ( ++p == pe )
1160
+ st_case_9:
1161
+ if ( ( (*( p))) == 10 ) {
1162
+ goto st1;
1163
+ }
1164
+ {
1165
+ goto st9;
1166
+ }
1167
+ st10:
1168
+ p+= 1;
1169
+ if ( p == pe )
667
1170
  goto _test_eof10;
668
- case 10:
669
- if ( (*p) == 78 )
670
- goto tr18;
671
- goto st0;
672
- st11:
673
- if ( ++p == pe )
1171
+ st_case_10:
1172
+ if ( ( (*( p))) == 110 ) {
1173
+ goto st11;
1174
+ }
1175
+ {
1176
+ goto st0;
1177
+ }
1178
+ st11:
1179
+ p+= 1;
1180
+ if ( p == pe )
674
1181
  goto _test_eof11;
675
- case 11:
676
- if ( (*p) == 97 )
677
- goto st12;
678
- goto st0;
679
- st12:
680
- if ( ++p == pe )
1182
+ st_case_11:
1183
+ if ( ( (*( p))) == 102 ) {
1184
+ goto st12;
1185
+ }
1186
+ {
1187
+ goto st0;
1188
+ }
1189
+ st12:
1190
+ p+= 1;
1191
+ if ( p == pe )
681
1192
  goto _test_eof12;
682
- case 12:
683
- if ( (*p) == 108 )
684
- goto st13;
685
- goto st0;
686
- st13:
687
- if ( ++p == pe )
1193
+ st_case_12:
1194
+ if ( ( (*( p))) == 105 ) {
1195
+ goto st13;
1196
+ }
1197
+ {
1198
+ goto st0;
1199
+ }
1200
+ st13:
1201
+ p+= 1;
1202
+ if ( p == pe )
688
1203
  goto _test_eof13;
689
- case 13:
690
- if ( (*p) == 115 )
691
- goto st14;
692
- goto st0;
693
- st14:
694
- if ( ++p == pe )
1204
+ st_case_13:
1205
+ if ( ( (*( p))) == 110 ) {
1206
+ goto st14;
1207
+ }
1208
+ {
1209
+ goto st0;
1210
+ }
1211
+ st14:
1212
+ p+= 1;
1213
+ if ( p == pe )
695
1214
  goto _test_eof14;
696
- case 14:
697
- if ( (*p) == 101 )
698
- goto tr22;
699
- goto st0;
700
- st15:
701
- if ( ++p == pe )
1215
+ st_case_14:
1216
+ if ( ( (*( p))) == 105 ) {
1217
+ goto st15;
1218
+ }
1219
+ {
1220
+ goto st0;
1221
+ }
1222
+ st15:
1223
+ p+= 1;
1224
+ if ( p == pe )
702
1225
  goto _test_eof15;
703
- case 15:
704
- if ( (*p) == 117 )
705
- goto st16;
706
- goto st0;
707
- st16:
708
- if ( ++p == pe )
1226
+ st_case_15:
1227
+ if ( ( (*( p))) == 116 ) {
1228
+ goto st16;
1229
+ }
1230
+ {
1231
+ goto st0;
1232
+ }
1233
+ st16:
1234
+ p+= 1;
1235
+ if ( p == pe )
709
1236
  goto _test_eof16;
710
- case 16:
711
- if ( (*p) == 108 )
712
- goto st17;
713
- goto st0;
714
- st17:
715
- if ( ++p == pe )
1237
+ st_case_16:
1238
+ if ( ( (*( p))) == 121 ) {
1239
+ goto ctr25;
1240
+ }
1241
+ {
1242
+ goto st0;
1243
+ }
1244
+ st17:
1245
+ p+= 1;
1246
+ if ( p == pe )
716
1247
  goto _test_eof17;
717
- case 17:
718
- if ( (*p) == 108 )
719
- goto tr25;
720
- goto st0;
721
- st18:
722
- if ( ++p == pe )
1248
+ st_case_17:
1249
+ if ( ( (*( p))) == 97 ) {
1250
+ goto st18;
1251
+ }
1252
+ {
1253
+ goto st0;
1254
+ }
1255
+ st18:
1256
+ p+= 1;
1257
+ if ( p == pe )
723
1258
  goto _test_eof18;
724
- case 18:
725
- if ( (*p) == 114 )
726
- goto st19;
727
- goto st0;
728
- st19:
729
- if ( ++p == pe )
1259
+ st_case_18:
1260
+ if ( ( (*( p))) == 78 ) {
1261
+ goto ctr27;
1262
+ }
1263
+ {
1264
+ goto st0;
1265
+ }
1266
+ st19:
1267
+ p+= 1;
1268
+ if ( p == pe )
730
1269
  goto _test_eof19;
731
- case 19:
732
- if ( (*p) == 117 )
733
- goto st20;
734
- goto st0;
735
- st20:
736
- if ( ++p == pe )
1270
+ st_case_19:
1271
+ if ( ( (*( p))) == 97 ) {
1272
+ goto st20;
1273
+ }
1274
+ {
1275
+ goto st0;
1276
+ }
1277
+ st20:
1278
+ p+= 1;
1279
+ if ( p == pe )
737
1280
  goto _test_eof20;
738
- case 20:
739
- if ( (*p) == 101 )
740
- goto tr28;
741
- goto st0;
742
- }
743
- _test_eof21: cs = 21; goto _test_eof;
744
- _test_eof2: cs = 2; goto _test_eof;
745
- _test_eof3: cs = 3; goto _test_eof;
746
- _test_eof4: cs = 4; goto _test_eof;
747
- _test_eof5: cs = 5; goto _test_eof;
748
- _test_eof6: cs = 6; goto _test_eof;
749
- _test_eof7: cs = 7; goto _test_eof;
750
- _test_eof8: cs = 8; goto _test_eof;
751
- _test_eof9: cs = 9; goto _test_eof;
752
- _test_eof10: cs = 10; goto _test_eof;
753
- _test_eof11: cs = 11; goto _test_eof;
754
- _test_eof12: cs = 12; goto _test_eof;
755
- _test_eof13: cs = 13; goto _test_eof;
756
- _test_eof14: cs = 14; goto _test_eof;
757
- _test_eof15: cs = 15; goto _test_eof;
758
- _test_eof16: cs = 16; goto _test_eof;
759
- _test_eof17: cs = 17; goto _test_eof;
760
- _test_eof18: cs = 18; goto _test_eof;
761
- _test_eof19: cs = 19; goto _test_eof;
762
- _test_eof20: cs = 20; goto _test_eof;
763
-
764
- _test_eof: {}
765
- _out: {}
1281
+ st_case_20:
1282
+ if ( ( (*( p))) == 108 ) {
1283
+ goto st21;
1284
+ }
1285
+ {
1286
+ goto st0;
1287
+ }
1288
+ st21:
1289
+ p+= 1;
1290
+ if ( p == pe )
1291
+ goto _test_eof21;
1292
+ st_case_21:
1293
+ if ( ( (*( p))) == 115 ) {
1294
+ goto st22;
1295
+ }
1296
+ {
1297
+ goto st0;
1298
+ }
1299
+ st22:
1300
+ p+= 1;
1301
+ if ( p == pe )
1302
+ goto _test_eof22;
1303
+ st_case_22:
1304
+ if ( ( (*( p))) == 101 ) {
1305
+ goto ctr31;
1306
+ }
1307
+ {
1308
+ goto st0;
1309
+ }
1310
+ st23:
1311
+ p+= 1;
1312
+ if ( p == pe )
1313
+ goto _test_eof23;
1314
+ st_case_23:
1315
+ if ( ( (*( p))) == 117 ) {
1316
+ goto st24;
1317
+ }
1318
+ {
1319
+ goto st0;
1320
+ }
1321
+ st24:
1322
+ p+= 1;
1323
+ if ( p == pe )
1324
+ goto _test_eof24;
1325
+ st_case_24:
1326
+ if ( ( (*( p))) == 108 ) {
1327
+ goto st25;
1328
+ }
1329
+ {
1330
+ goto st0;
1331
+ }
1332
+ st25:
1333
+ p+= 1;
1334
+ if ( p == pe )
1335
+ goto _test_eof25;
1336
+ st_case_25:
1337
+ if ( ( (*( p))) == 108 ) {
1338
+ goto ctr34;
1339
+ }
1340
+ {
1341
+ goto st0;
1342
+ }
1343
+ st26:
1344
+ p+= 1;
1345
+ if ( p == pe )
1346
+ goto _test_eof26;
1347
+ st_case_26:
1348
+ if ( ( (*( p))) == 114 ) {
1349
+ goto st27;
1350
+ }
1351
+ {
1352
+ goto st0;
1353
+ }
1354
+ st27:
1355
+ p+= 1;
1356
+ if ( p == pe )
1357
+ goto _test_eof27;
1358
+ st_case_27:
1359
+ if ( ( (*( p))) == 117 ) {
1360
+ goto st28;
1361
+ }
1362
+ {
1363
+ goto st0;
1364
+ }
1365
+ st28:
1366
+ p+= 1;
1367
+ if ( p == pe )
1368
+ goto _test_eof28;
1369
+ st_case_28:
1370
+ if ( ( (*( p))) == 101 ) {
1371
+ goto ctr37;
1372
+ }
1373
+ {
1374
+ goto st0;
1375
+ }
1376
+ st_out:
1377
+ _test_eof1: cs = 1; goto _test_eof;
1378
+ _test_eof29: cs = 29; goto _test_eof;
1379
+ _test_eof2: cs = 2; goto _test_eof;
1380
+ _test_eof3: cs = 3; goto _test_eof;
1381
+ _test_eof4: cs = 4; goto _test_eof;
1382
+ _test_eof5: cs = 5; goto _test_eof;
1383
+ _test_eof6: cs = 6; goto _test_eof;
1384
+ _test_eof7: cs = 7; goto _test_eof;
1385
+ _test_eof8: cs = 8; goto _test_eof;
1386
+ _test_eof9: cs = 9; goto _test_eof;
1387
+ _test_eof10: cs = 10; goto _test_eof;
1388
+ _test_eof11: cs = 11; goto _test_eof;
1389
+ _test_eof12: cs = 12; goto _test_eof;
1390
+ _test_eof13: cs = 13; goto _test_eof;
1391
+ _test_eof14: cs = 14; goto _test_eof;
1392
+ _test_eof15: cs = 15; goto _test_eof;
1393
+ _test_eof16: cs = 16; goto _test_eof;
1394
+ _test_eof17: cs = 17; goto _test_eof;
1395
+ _test_eof18: cs = 18; goto _test_eof;
1396
+ _test_eof19: cs = 19; goto _test_eof;
1397
+ _test_eof20: cs = 20; goto _test_eof;
1398
+ _test_eof21: cs = 21; goto _test_eof;
1399
+ _test_eof22: cs = 22; goto _test_eof;
1400
+ _test_eof23: cs = 23; goto _test_eof;
1401
+ _test_eof24: cs = 24; goto _test_eof;
1402
+ _test_eof25: cs = 25; goto _test_eof;
1403
+ _test_eof26: cs = 26; goto _test_eof;
1404
+ _test_eof27: cs = 27; goto _test_eof;
1405
+ _test_eof28: cs = 28; goto _test_eof;
1406
+
1407
+ _test_eof: {}
1408
+ _out: {}
1409
+ }
1410
+
1411
+ #line 291 "parser.rl"
1412
+
1413
+
1414
+ if (json->freeze) {
1415
+ OBJ_FREEZE(*result);
1416
+ }
1417
+
1418
+ if (cs >= JSON_value_first_final) {
1419
+ return p;
1420
+ } else {
1421
+ return NULL;
766
1422
  }
1423
+ }
767
1424
 
768
- #line 279 "parser.rl"
769
1425
 
770
- if (cs >= JSON_value_first_final) {
771
- return p;
772
- } else {
773
- return NULL;
774
- }
775
- }
1426
+ enum {JSON_integer_start = 1};
1427
+ enum {JSON_integer_first_final = 3};
1428
+ enum {JSON_integer_error = 0};
776
1429
 
1430
+ enum {JSON_integer_en_main = 1};
777
1431
 
778
- #line 779 "parser.c"
779
- static const int JSON_integer_start = 1;
780
- static const int JSON_integer_first_final = 3;
781
- static const int JSON_integer_error = 0;
1432
+ static const char MAYBE_UNUSED(_JSON_integer_nfa_targs)[] = {
1433
+ 0, 0
1434
+ };
782
1435
 
783
- static const int JSON_integer_en_main = 1;
1436
+ static const char MAYBE_UNUSED(_JSON_integer_nfa_offsets)[] = {
1437
+ 0, 0, 0, 0, 0, 0, 0
1438
+ };
1439
+
1440
+ static const char MAYBE_UNUSED(_JSON_integer_nfa_push_actions)[] = {
1441
+ 0, 0
1442
+ };
1443
+
1444
+ static const char MAYBE_UNUSED(_JSON_integer_nfa_pop_trans)[] = {
1445
+ 0, 0
1446
+ };
784
1447
 
785
1448
 
786
- #line 295 "parser.rl"
1449
+ #line 311 "parser.rl"
787
1450
 
788
1451
 
789
1452
  static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result)
790
1453
  {
791
- int cs = EVIL;
1454
+ int cs = EVIL;
792
1455
 
793
1456
 
794
- #line 795 "parser.c"
795
1457
  {
796
- cs = JSON_integer_start;
1458
+ cs = (int)JSON_integer_start;
797
1459
  }
798
1460
 
799
- #line 302 "parser.rl"
800
- json->memo = p;
1461
+ #line 318 "parser.rl"
1462
+
1463
+ json->memo = p;
801
1464
 
802
- #line 803 "parser.c"
803
1465
  {
804
- if ( p == pe )
1466
+ if ( p == pe )
805
1467
  goto _test_eof;
806
- switch ( cs )
807
- {
808
- case 1:
809
- switch( (*p) ) {
810
- case 45: goto st2;
811
- case 48: goto st3;
812
- }
813
- if ( 49 <= (*p) && (*p) <= 57 )
814
- goto st5;
815
- goto st0;
816
- st0:
817
- cs = 0;
818
- goto _out;
819
- st2:
820
- if ( ++p == pe )
1468
+ switch ( cs )
1469
+ {
1470
+ case 1:
1471
+ goto st_case_1;
1472
+ case 0:
1473
+ goto st_case_0;
1474
+ case 2:
1475
+ goto st_case_2;
1476
+ case 3:
1477
+ goto st_case_3;
1478
+ case 4:
1479
+ goto st_case_4;
1480
+ case 5:
1481
+ goto st_case_5;
1482
+ }
1483
+ goto st_out;
1484
+ st_case_1:
1485
+ switch( ( (*( p))) ) {
1486
+ case 45: {
1487
+ goto st2;
1488
+ }
1489
+ case 48: {
1490
+ goto st3;
1491
+ }
1492
+ }
1493
+ if ( 49 <= ( (*( p))) && ( (*( p))) <= 57 ) {
1494
+ goto st5;
1495
+ }
1496
+ {
1497
+ goto st0;
1498
+ }
1499
+ st_case_0:
1500
+ st0:
1501
+ cs = 0;
1502
+ goto _out;
1503
+ st2:
1504
+ p+= 1;
1505
+ if ( p == pe )
821
1506
  goto _test_eof2;
822
- case 2:
823
- if ( (*p) == 48 )
824
- goto st3;
825
- if ( 49 <= (*p) && (*p) <= 57 )
826
- goto st5;
827
- goto st0;
828
- st3:
829
- if ( ++p == pe )
1507
+ st_case_2:
1508
+ if ( ( (*( p))) == 48 ) {
1509
+ goto st3;
1510
+ }
1511
+ if ( 49 <= ( (*( p))) && ( (*( p))) <= 57 ) {
1512
+ goto st5;
1513
+ }
1514
+ {
1515
+ goto st0;
1516
+ }
1517
+ st3:
1518
+ p+= 1;
1519
+ if ( p == pe )
830
1520
  goto _test_eof3;
831
- case 3:
832
- if ( 48 <= (*p) && (*p) <= 57 )
833
- goto st0;
834
- goto tr4;
835
- tr4:
836
- #line 292 "parser.rl"
837
- { p--; {p++; cs = 4; goto _out;} }
838
- goto st4;
839
- st4:
840
- if ( ++p == pe )
1521
+ st_case_3:
1522
+ if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) {
1523
+ goto st0;
1524
+ }
1525
+ {
1526
+ goto ctr4;
1527
+ }
1528
+ ctr4:
1529
+ {
1530
+ #line 308 "parser.rl"
1531
+ {p = p - 1; } {p+= 1; cs = 4; goto _out;} }
1532
+
1533
+ goto st4;
1534
+ st4:
1535
+ p+= 1;
1536
+ if ( p == pe )
841
1537
  goto _test_eof4;
842
- case 4:
843
- #line 844 "parser.c"
844
- goto st0;
845
- st5:
846
- if ( ++p == pe )
1538
+ st_case_4:
1539
+ {
1540
+ goto st0;
1541
+ }
1542
+ st5:
1543
+ p+= 1;
1544
+ if ( p == pe )
847
1545
  goto _test_eof5;
848
- case 5:
849
- if ( 48 <= (*p) && (*p) <= 57 )
850
- goto st5;
851
- goto tr4;
852
- }
853
- _test_eof2: cs = 2; goto _test_eof;
854
- _test_eof3: cs = 3; goto _test_eof;
855
- _test_eof4: cs = 4; goto _test_eof;
856
- _test_eof5: cs = 5; goto _test_eof;
1546
+ st_case_5:
1547
+ if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) {
1548
+ goto st5;
1549
+ }
1550
+ {
1551
+ goto ctr4;
1552
+ }
1553
+ st_out:
1554
+ _test_eof2: cs = 2; goto _test_eof;
1555
+ _test_eof3: cs = 3; goto _test_eof;
1556
+ _test_eof4: cs = 4; goto _test_eof;
1557
+ _test_eof5: cs = 5; goto _test_eof;
857
1558
 
858
- _test_eof: {}
859
- _out: {}
1559
+ _test_eof: {}
1560
+ _out: {}
860
1561
  }
861
1562
 
862
- #line 304 "parser.rl"
863
-
864
- if (cs >= JSON_integer_first_final) {
865
- long len = p - json->memo;
866
- fbuffer_clear(json->fbuffer);
867
- fbuffer_append(json->fbuffer, json->memo, len);
868
- fbuffer_append_char(json->fbuffer, '\0');
869
- *result = rb_cstr2inum(FBUFFER_PTR(json->fbuffer), 10);
870
- return p + 1;
871
- } else {
872
- return NULL;
873
- }
1563
+ #line 320 "parser.rl"
1564
+
1565
+
1566
+ if (cs >= JSON_integer_first_final) {
1567
+ long len = p - json->memo;
1568
+ fbuffer_clear(json->fbuffer);
1569
+ fbuffer_append(json->fbuffer, json->memo, len);
1570
+ fbuffer_append_char(json->fbuffer, '\0');
1571
+ *result = rb_cstr2inum(FBUFFER_PTR(json->fbuffer), 10);
1572
+ return p + 1;
1573
+ } else {
1574
+ return NULL;
1575
+ }
874
1576
  }
875
1577
 
876
1578
 
877
- #line 878 "parser.c"
878
- static const int JSON_float_start = 1;
879
- static const int JSON_float_first_final = 8;
880
- static const int JSON_float_error = 0;
1579
+ enum {JSON_float_start = 1};
1580
+ enum {JSON_float_first_final = 8};
1581
+ enum {JSON_float_error = 0};
1582
+
1583
+ enum {JSON_float_en_main = 1};
881
1584
 
882
- static const int JSON_float_en_main = 1;
1585
+ static const char MAYBE_UNUSED(_JSON_float_nfa_targs)[] = {
1586
+ 0, 0
1587
+ };
1588
+
1589
+ static const char MAYBE_UNUSED(_JSON_float_nfa_offsets)[] = {
1590
+ 0, 0, 0, 0, 0, 0, 0, 0,
1591
+ 0, 0, 0, 0
1592
+ };
1593
+
1594
+ static const char MAYBE_UNUSED(_JSON_float_nfa_push_actions)[] = {
1595
+ 0, 0
1596
+ };
1597
+
1598
+ static const char MAYBE_UNUSED(_JSON_float_nfa_pop_trans)[] = {
1599
+ 0, 0
1600
+ };
883
1601
 
884
1602
 
885
- #line 329 "parser.rl"
1603
+ #line 345 "parser.rl"
886
1604
 
887
1605
 
888
1606
  static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result)
889
1607
  {
890
- int cs = EVIL;
1608
+ int cs = EVIL;
891
1609
 
892
1610
 
893
- #line 894 "parser.c"
894
1611
  {
895
- cs = JSON_float_start;
1612
+ cs = (int)JSON_float_start;
896
1613
  }
897
1614
 
898
- #line 336 "parser.rl"
899
- json->memo = p;
1615
+ #line 352 "parser.rl"
1616
+
1617
+ json->memo = p;
900
1618
 
901
- #line 902 "parser.c"
902
1619
  {
903
- if ( p == pe )
1620
+ if ( p == pe )
904
1621
  goto _test_eof;
905
- switch ( cs )
906
- {
907
- case 1:
908
- switch( (*p) ) {
909
- case 45: goto st2;
910
- case 48: goto st3;
911
- }
912
- if ( 49 <= (*p) && (*p) <= 57 )
913
- goto st7;
914
- goto st0;
915
- st0:
916
- cs = 0;
917
- goto _out;
918
- st2:
919
- if ( ++p == pe )
1622
+ switch ( cs )
1623
+ {
1624
+ case 1:
1625
+ goto st_case_1;
1626
+ case 0:
1627
+ goto st_case_0;
1628
+ case 2:
1629
+ goto st_case_2;
1630
+ case 3:
1631
+ goto st_case_3;
1632
+ case 4:
1633
+ goto st_case_4;
1634
+ case 8:
1635
+ goto st_case_8;
1636
+ case 9:
1637
+ goto st_case_9;
1638
+ case 5:
1639
+ goto st_case_5;
1640
+ case 6:
1641
+ goto st_case_6;
1642
+ case 10:
1643
+ goto st_case_10;
1644
+ case 7:
1645
+ goto st_case_7;
1646
+ }
1647
+ goto st_out;
1648
+ st_case_1:
1649
+ switch( ( (*( p))) ) {
1650
+ case 45: {
1651
+ goto st2;
1652
+ }
1653
+ case 48: {
1654
+ goto st3;
1655
+ }
1656
+ }
1657
+ if ( 49 <= ( (*( p))) && ( (*( p))) <= 57 ) {
1658
+ goto st7;
1659
+ }
1660
+ {
1661
+ goto st0;
1662
+ }
1663
+ st_case_0:
1664
+ st0:
1665
+ cs = 0;
1666
+ goto _out;
1667
+ st2:
1668
+ p+= 1;
1669
+ if ( p == pe )
920
1670
  goto _test_eof2;
921
- case 2:
922
- if ( (*p) == 48 )
923
- goto st3;
924
- if ( 49 <= (*p) && (*p) <= 57 )
925
- goto st7;
926
- goto st0;
927
- st3:
928
- if ( ++p == pe )
1671
+ st_case_2:
1672
+ if ( ( (*( p))) == 48 ) {
1673
+ goto st3;
1674
+ }
1675
+ if ( 49 <= ( (*( p))) && ( (*( p))) <= 57 ) {
1676
+ goto st7;
1677
+ }
1678
+ {
1679
+ goto st0;
1680
+ }
1681
+ st3:
1682
+ p+= 1;
1683
+ if ( p == pe )
929
1684
  goto _test_eof3;
930
- case 3:
931
- switch( (*p) ) {
932
- case 46: goto st4;
933
- case 69: goto st5;
934
- case 101: goto st5;
935
- }
936
- goto st0;
937
- st4:
938
- if ( ++p == pe )
1685
+ st_case_3:
1686
+ switch( ( (*( p))) ) {
1687
+ case 46: {
1688
+ goto st4;
1689
+ }
1690
+ case 69: {
1691
+ goto st5;
1692
+ }
1693
+ case 101: {
1694
+ goto st5;
1695
+ }
1696
+ }
1697
+ {
1698
+ goto st0;
1699
+ }
1700
+ st4:
1701
+ p+= 1;
1702
+ if ( p == pe )
939
1703
  goto _test_eof4;
940
- case 4:
941
- if ( 48 <= (*p) && (*p) <= 57 )
942
- goto st8;
943
- goto st0;
944
- st8:
945
- if ( ++p == pe )
946
- goto _test_eof8;
947
- case 8:
948
- switch( (*p) ) {
949
- case 69: goto st5;
950
- case 101: goto st5;
951
- }
952
- if ( (*p) > 46 ) {
953
- if ( 48 <= (*p) && (*p) <= 57 )
1704
+ st_case_4:
1705
+ if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) {
954
1706
  goto st8;
955
- } else if ( (*p) >= 45 )
956
- goto st0;
957
- goto tr9;
958
- tr9:
959
- #line 323 "parser.rl"
960
- { p--; {p++; cs = 9; goto _out;} }
961
- goto st9;
962
- st9:
963
- if ( ++p == pe )
1707
+ }
1708
+ {
1709
+ goto st0;
1710
+ }
1711
+ st8:
1712
+ p+= 1;
1713
+ if ( p == pe )
1714
+ goto _test_eof8;
1715
+ st_case_8:
1716
+ switch( ( (*( p))) ) {
1717
+ case 69: {
1718
+ goto st5;
1719
+ }
1720
+ case 101: {
1721
+ goto st5;
1722
+ }
1723
+ }
1724
+ if ( ( (*( p))) > 46 ) {
1725
+ if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) {
1726
+ goto st8;
1727
+ }
1728
+ } else if ( ( (*( p))) >= 45 ) {
1729
+ goto st0;
1730
+ }
1731
+ {
1732
+ goto ctr9;
1733
+ }
1734
+ ctr9:
1735
+ {
1736
+ #line 339 "parser.rl"
1737
+ {p = p - 1; } {p+= 1; cs = 9; goto _out;} }
1738
+
1739
+ goto st9;
1740
+ st9:
1741
+ p+= 1;
1742
+ if ( p == pe )
964
1743
  goto _test_eof9;
965
- case 9:
966
- #line 967 "parser.c"
967
- goto st0;
968
- st5:
969
- if ( ++p == pe )
1744
+ st_case_9:
1745
+ {
1746
+ goto st0;
1747
+ }
1748
+ st5:
1749
+ p+= 1;
1750
+ if ( p == pe )
970
1751
  goto _test_eof5;
971
- case 5:
972
- switch( (*p) ) {
973
- case 43: goto st6;
974
- case 45: goto st6;
975
- }
976
- if ( 48 <= (*p) && (*p) <= 57 )
977
- goto st10;
978
- goto st0;
979
- st6:
980
- if ( ++p == pe )
1752
+ st_case_5:
1753
+ switch( ( (*( p))) ) {
1754
+ case 43: {
1755
+ goto st6;
1756
+ }
1757
+ case 45: {
1758
+ goto st6;
1759
+ }
1760
+ }
1761
+ if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) {
1762
+ goto st10;
1763
+ }
1764
+ {
1765
+ goto st0;
1766
+ }
1767
+ st6:
1768
+ p+= 1;
1769
+ if ( p == pe )
981
1770
  goto _test_eof6;
982
- case 6:
983
- if ( 48 <= (*p) && (*p) <= 57 )
984
- goto st10;
985
- goto st0;
986
- st10:
987
- if ( ++p == pe )
988
- goto _test_eof10;
989
- case 10:
990
- switch( (*p) ) {
991
- case 69: goto st0;
992
- case 101: goto st0;
993
- }
994
- if ( (*p) > 46 ) {
995
- if ( 48 <= (*p) && (*p) <= 57 )
1771
+ st_case_6:
1772
+ if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) {
996
1773
  goto st10;
997
- } else if ( (*p) >= 45 )
998
- goto st0;
999
- goto tr9;
1000
- st7:
1001
- if ( ++p == pe )
1774
+ }
1775
+ {
1776
+ goto st0;
1777
+ }
1778
+ st10:
1779
+ p+= 1;
1780
+ if ( p == pe )
1781
+ goto _test_eof10;
1782
+ st_case_10:
1783
+ switch( ( (*( p))) ) {
1784
+ case 69: {
1785
+ goto st0;
1786
+ }
1787
+ case 101: {
1788
+ goto st0;
1789
+ }
1790
+ }
1791
+ if ( ( (*( p))) > 46 ) {
1792
+ if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) {
1793
+ goto st10;
1794
+ }
1795
+ } else if ( ( (*( p))) >= 45 ) {
1796
+ goto st0;
1797
+ }
1798
+ {
1799
+ goto ctr9;
1800
+ }
1801
+ st7:
1802
+ p+= 1;
1803
+ if ( p == pe )
1002
1804
  goto _test_eof7;
1003
- case 7:
1004
- switch( (*p) ) {
1005
- case 46: goto st4;
1006
- case 69: goto st5;
1007
- case 101: goto st5;
1008
- }
1009
- if ( 48 <= (*p) && (*p) <= 57 )
1010
- goto st7;
1011
- goto st0;
1012
- }
1013
- _test_eof2: cs = 2; goto _test_eof;
1014
- _test_eof3: cs = 3; goto _test_eof;
1015
- _test_eof4: cs = 4; goto _test_eof;
1016
- _test_eof8: cs = 8; goto _test_eof;
1017
- _test_eof9: cs = 9; goto _test_eof;
1018
- _test_eof5: cs = 5; goto _test_eof;
1019
- _test_eof6: cs = 6; goto _test_eof;
1020
- _test_eof10: cs = 10; goto _test_eof;
1021
- _test_eof7: cs = 7; goto _test_eof;
1022
-
1023
- _test_eof: {}
1024
- _out: {}
1805
+ st_case_7:
1806
+ switch( ( (*( p))) ) {
1807
+ case 46: {
1808
+ goto st4;
1809
+ }
1810
+ case 69: {
1811
+ goto st5;
1812
+ }
1813
+ case 101: {
1814
+ goto st5;
1815
+ }
1816
+ }
1817
+ if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) {
1818
+ goto st7;
1819
+ }
1820
+ {
1821
+ goto st0;
1822
+ }
1823
+ st_out:
1824
+ _test_eof2: cs = 2; goto _test_eof;
1825
+ _test_eof3: cs = 3; goto _test_eof;
1826
+ _test_eof4: cs = 4; goto _test_eof;
1827
+ _test_eof8: cs = 8; goto _test_eof;
1828
+ _test_eof9: cs = 9; goto _test_eof;
1829
+ _test_eof5: cs = 5; goto _test_eof;
1830
+ _test_eof6: cs = 6; goto _test_eof;
1831
+ _test_eof10: cs = 10; goto _test_eof;
1832
+ _test_eof7: cs = 7; goto _test_eof;
1833
+
1834
+ _test_eof: {}
1835
+ _out: {}
1836
+ }
1837
+
1838
+ #line 354 "parser.rl"
1839
+
1840
+
1841
+ if (cs >= JSON_float_first_final) {
1842
+ VALUE mod = Qnil;
1843
+ ID method_id = 0;
1844
+ if (rb_respond_to(json->decimal_class, i_try_convert)) {
1845
+ mod = json->decimal_class;
1846
+ method_id = i_try_convert;
1847
+ } else if (rb_respond_to(json->decimal_class, i_new)) {
1848
+ mod = json->decimal_class;
1849
+ method_id = i_new;
1850
+ } else if (RB_TYPE_P(json->decimal_class, T_CLASS)) {
1851
+ VALUE name = rb_class_name(json->decimal_class);
1852
+ const char *name_cstr = RSTRING_PTR(name);
1853
+ const char *last_colon = strrchr(name_cstr, ':');
1854
+ if (last_colon) {
1855
+ const char *mod_path_end = last_colon - 1;
1856
+ VALUE mod_path = rb_str_substr(name, 0, mod_path_end - name_cstr);
1857
+ mod = rb_path_to_class(mod_path);
1858
+
1859
+ const char *method_name_beg = last_colon + 1;
1860
+ long before_len = method_name_beg - name_cstr;
1861
+ long len = RSTRING_LEN(name) - before_len;
1862
+ VALUE method_name = rb_str_substr(name, before_len, len);
1863
+ method_id = SYM2ID(rb_str_intern(method_name));
1864
+ } else {
1865
+ mod = rb_mKernel;
1866
+ method_id = SYM2ID(rb_str_intern(name));
1867
+ }
1868
+ }
1869
+
1870
+ long len = p - json->memo;
1871
+ fbuffer_clear(json->fbuffer);
1872
+ fbuffer_append(json->fbuffer, json->memo, len);
1873
+ fbuffer_append_char(json->fbuffer, '\0');
1874
+
1875
+ if (method_id) {
1876
+ VALUE text = rb_str_new2(FBUFFER_PTR(json->fbuffer));
1877
+ *result = rb_funcallv(mod, method_id, 1, &text);
1878
+ } else {
1879
+ *result = DBL2NUM(rb_cstr_to_dbl(FBUFFER_PTR(json->fbuffer), 1));
1880
+ }
1881
+
1882
+ return p + 1;
1883
+ } else {
1884
+ return NULL;
1025
1885
  }
1026
-
1027
- #line 338 "parser.rl"
1028
-
1029
- if (cs >= JSON_float_first_final) {
1030
- long len = p - json->memo;
1031
- fbuffer_clear(json->fbuffer);
1032
- fbuffer_append(json->fbuffer, json->memo, len);
1033
- fbuffer_append_char(json->fbuffer, '\0');
1034
- *result = rb_float_new(rb_cstr_to_dbl(FBUFFER_PTR(json->fbuffer), 1));
1035
- return p + 1;
1036
- } else {
1037
- return NULL;
1038
- }
1039
1886
  }
1040
1887
 
1041
1888
 
1042
1889
 
1043
- #line 1044 "parser.c"
1044
- static const int JSON_array_start = 1;
1045
- static const int JSON_array_first_final = 17;
1046
- static const int JSON_array_error = 0;
1890
+ enum {JSON_array_start = 1};
1891
+ enum {JSON_array_first_final = 17};
1892
+ enum {JSON_array_error = 0};
1893
+
1894
+ enum {JSON_array_en_main = 1};
1895
+
1896
+ static const char MAYBE_UNUSED(_JSON_array_nfa_targs)[] = {
1897
+ 0, 0
1898
+ };
1899
+
1900
+ static const char MAYBE_UNUSED(_JSON_array_nfa_offsets)[] = {
1901
+ 0, 0, 0, 0, 0, 0, 0, 0,
1902
+ 0, 0, 0, 0, 0, 0, 0, 0,
1903
+ 0, 0, 0
1904
+ };
1047
1905
 
1048
- static const int JSON_array_en_main = 1;
1906
+ static const char MAYBE_UNUSED(_JSON_array_nfa_push_actions)[] = {
1907
+ 0, 0
1908
+ };
1909
+
1910
+ static const char MAYBE_UNUSED(_JSON_array_nfa_pop_trans)[] = {
1911
+ 0, 0
1912
+ };
1049
1913
 
1050
1914
 
1051
- #line 381 "parser.rl"
1915
+ #line 432 "parser.rl"
1052
1916
 
1053
1917
 
1054
- static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result)
1918
+ static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting)
1055
1919
  {
1056
- int cs = EVIL;
1057
- VALUE array_class = json->array_class;
1920
+ int cs = EVIL;
1921
+ VALUE array_class = json->array_class;
1058
1922
 
1059
- if (json->max_nesting && json->current_nesting > json->max_nesting) {
1060
- rb_raise(eNestingError, "nesting of %d is too deep", json->current_nesting);
1061
- }
1062
- *result = NIL_P(array_class) ? rb_ary_new() : rb_class_new_instance(0, 0, array_class);
1923
+ if (json->max_nesting && current_nesting > json->max_nesting) {
1924
+ rb_raise(eNestingError, "nesting of %d is too deep", current_nesting);
1925
+ }
1926
+ *result = NIL_P(array_class) ? rb_ary_new() : rb_class_new_instance(0, 0, array_class);
1063
1927
 
1064
1928
 
1065
- #line 1066 "parser.c"
1066
1929
  {
1067
- cs = JSON_array_start;
1930
+ cs = (int)JSON_array_start;
1068
1931
  }
1069
1932
 
1070
- #line 394 "parser.rl"
1933
+ #line 445 "parser.rl"
1934
+
1071
1935
 
1072
- #line 1073 "parser.c"
1073
1936
  {
1074
- if ( p == pe )
1937
+ if ( p == pe )
1075
1938
  goto _test_eof;
1076
- switch ( cs )
1077
- {
1078
- case 1:
1079
- if ( (*p) == 91 )
1080
- goto st2;
1081
- goto st0;
1082
- st0:
1083
- cs = 0;
1084
- goto _out;
1085
- st2:
1086
- if ( ++p == pe )
1939
+ switch ( cs )
1940
+ {
1941
+ case 1:
1942
+ goto st_case_1;
1943
+ case 0:
1944
+ goto st_case_0;
1945
+ case 2:
1946
+ goto st_case_2;
1947
+ case 3:
1948
+ goto st_case_3;
1949
+ case 4:
1950
+ goto st_case_4;
1951
+ case 5:
1952
+ goto st_case_5;
1953
+ case 6:
1954
+ goto st_case_6;
1955
+ case 7:
1956
+ goto st_case_7;
1957
+ case 8:
1958
+ goto st_case_8;
1959
+ case 9:
1960
+ goto st_case_9;
1961
+ case 10:
1962
+ goto st_case_10;
1963
+ case 11:
1964
+ goto st_case_11;
1965
+ case 12:
1966
+ goto st_case_12;
1967
+ case 17:
1968
+ goto st_case_17;
1969
+ case 13:
1970
+ goto st_case_13;
1971
+ case 14:
1972
+ goto st_case_14;
1973
+ case 15:
1974
+ goto st_case_15;
1975
+ case 16:
1976
+ goto st_case_16;
1977
+ }
1978
+ goto st_out;
1979
+ st_case_1:
1980
+ if ( ( (*( p))) == 91 ) {
1981
+ goto st2;
1982
+ }
1983
+ {
1984
+ goto st0;
1985
+ }
1986
+ st_case_0:
1987
+ st0:
1988
+ cs = 0;
1989
+ goto _out;
1990
+ st2:
1991
+ p+= 1;
1992
+ if ( p == pe )
1087
1993
  goto _test_eof2;
1088
- case 2:
1089
- switch( (*p) ) {
1090
- case 13: goto st2;
1091
- case 32: goto st2;
1092
- case 34: goto tr2;
1093
- case 45: goto tr2;
1094
- case 47: goto st13;
1095
- case 73: goto tr2;
1096
- case 78: goto tr2;
1097
- case 91: goto tr2;
1098
- case 93: goto tr4;
1099
- case 102: goto tr2;
1100
- case 110: goto tr2;
1101
- case 116: goto tr2;
1102
- case 123: goto tr2;
1103
- }
1104
- if ( (*p) > 10 ) {
1105
- if ( 48 <= (*p) && (*p) <= 57 )
1106
- goto tr2;
1107
- } else if ( (*p) >= 9 )
1108
- goto st2;
1109
- goto st0;
1110
- tr2:
1111
- #line 358 "parser.rl"
1112
- {
1113
- VALUE v = Qnil;
1114
- char *np = JSON_parse_value(json, p, pe, &v);
1115
- if (np == NULL) {
1116
- p--; {p++; cs = 3; goto _out;}
1117
- } else {
1118
- if (NIL_P(json->array_class)) {
1119
- rb_ary_push(*result, v);
1120
- } else {
1121
- rb_funcall(*result, i_leftshift, 1, v);
1122
- }
1123
- {p = (( np))-1;}
1124
- }
1125
- }
1126
- goto st3;
1127
- st3:
1128
- if ( ++p == pe )
1129
- goto _test_eof3;
1130
- case 3:
1131
- #line 1132 "parser.c"
1132
- switch( (*p) ) {
1133
- case 13: goto st3;
1134
- case 32: goto st3;
1135
- case 44: goto st4;
1136
- case 47: goto st9;
1137
- case 93: goto tr4;
1138
- }
1139
- if ( 9 <= (*p) && (*p) <= 10 )
1994
+ st_case_2:
1995
+ switch( ( (*( p))) ) {
1996
+ case 13: {
1997
+ goto st2;
1998
+ }
1999
+ case 32: {
2000
+ goto st2;
2001
+ }
2002
+ case 34: {
2003
+ goto ctr2;
2004
+ }
2005
+ case 45: {
2006
+ goto ctr2;
2007
+ }
2008
+ case 47: {
2009
+ goto st13;
2010
+ }
2011
+ case 73: {
2012
+ goto ctr2;
2013
+ }
2014
+ case 78: {
2015
+ goto ctr2;
2016
+ }
2017
+ case 91: {
2018
+ goto ctr2;
2019
+ }
2020
+ case 93: {
2021
+ goto ctr4;
2022
+ }
2023
+ case 102: {
2024
+ goto ctr2;
2025
+ }
2026
+ case 110: {
2027
+ goto ctr2;
2028
+ }
2029
+ case 116: {
2030
+ goto ctr2;
2031
+ }
2032
+ case 123: {
2033
+ goto ctr2;
2034
+ }
2035
+ }
2036
+ if ( ( (*( p))) > 10 ) {
2037
+ if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) {
2038
+ goto ctr2;
2039
+ }
2040
+ } else if ( ( (*( p))) >= 9 ) {
2041
+ goto st2;
2042
+ }
2043
+ {
2044
+ goto st0;
2045
+ }
2046
+ ctr2:
2047
+ {
2048
+ #line 409 "parser.rl"
2049
+
2050
+ VALUE v = Qnil;
2051
+ char *np = JSON_parse_value(json, p, pe, &v, current_nesting);
2052
+ if (np == NULL) {
2053
+ {p = p - 1; } {p+= 1; cs = 3; goto _out;}
2054
+ } else {
2055
+ if (NIL_P(json->array_class)) {
2056
+ rb_ary_push(*result, v);
2057
+ } else {
2058
+ rb_funcall(*result, i_leftshift, 1, v);
2059
+ }
2060
+ {p = (( np))-1;}
2061
+
2062
+ }
2063
+ }
2064
+
1140
2065
  goto st3;
1141
- goto st0;
1142
- st4:
1143
- if ( ++p == pe )
2066
+ st3:
2067
+ p+= 1;
2068
+ if ( p == pe )
2069
+ goto _test_eof3;
2070
+ st_case_3:
2071
+ switch( ( (*( p))) ) {
2072
+ case 13: {
2073
+ goto st3;
2074
+ }
2075
+ case 32: {
2076
+ goto st3;
2077
+ }
2078
+ case 44: {
2079
+ goto st4;
2080
+ }
2081
+ case 47: {
2082
+ goto st9;
2083
+ }
2084
+ case 93: {
2085
+ goto ctr4;
2086
+ }
2087
+ }
2088
+ if ( 9 <= ( (*( p))) && ( (*( p))) <= 10 ) {
2089
+ goto st3;
2090
+ }
2091
+ {
2092
+ goto st0;
2093
+ }
2094
+ st4:
2095
+ p+= 1;
2096
+ if ( p == pe )
1144
2097
  goto _test_eof4;
1145
- case 4:
1146
- switch( (*p) ) {
1147
- case 13: goto st4;
1148
- case 32: goto st4;
1149
- case 34: goto tr2;
1150
- case 45: goto tr2;
1151
- case 47: goto st5;
1152
- case 73: goto tr2;
1153
- case 78: goto tr2;
1154
- case 91: goto tr2;
1155
- case 102: goto tr2;
1156
- case 110: goto tr2;
1157
- case 116: goto tr2;
1158
- case 123: goto tr2;
1159
- }
1160
- if ( (*p) > 10 ) {
1161
- if ( 48 <= (*p) && (*p) <= 57 )
1162
- goto tr2;
1163
- } else if ( (*p) >= 9 )
1164
- goto st4;
1165
- goto st0;
1166
- st5:
1167
- if ( ++p == pe )
2098
+ st_case_4:
2099
+ switch( ( (*( p))) ) {
2100
+ case 13: {
2101
+ goto st4;
2102
+ }
2103
+ case 32: {
2104
+ goto st4;
2105
+ }
2106
+ case 34: {
2107
+ goto ctr2;
2108
+ }
2109
+ case 45: {
2110
+ goto ctr2;
2111
+ }
2112
+ case 47: {
2113
+ goto st5;
2114
+ }
2115
+ case 73: {
2116
+ goto ctr2;
2117
+ }
2118
+ case 78: {
2119
+ goto ctr2;
2120
+ }
2121
+ case 91: {
2122
+ goto ctr2;
2123
+ }
2124
+ case 102: {
2125
+ goto ctr2;
2126
+ }
2127
+ case 110: {
2128
+ goto ctr2;
2129
+ }
2130
+ case 116: {
2131
+ goto ctr2;
2132
+ }
2133
+ case 123: {
2134
+ goto ctr2;
2135
+ }
2136
+ }
2137
+ if ( ( (*( p))) > 10 ) {
2138
+ if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) {
2139
+ goto ctr2;
2140
+ }
2141
+ } else if ( ( (*( p))) >= 9 ) {
2142
+ goto st4;
2143
+ }
2144
+ {
2145
+ goto st0;
2146
+ }
2147
+ st5:
2148
+ p+= 1;
2149
+ if ( p == pe )
1168
2150
  goto _test_eof5;
1169
- case 5:
1170
- switch( (*p) ) {
1171
- case 42: goto st6;
1172
- case 47: goto st8;
1173
- }
1174
- goto st0;
1175
- st6:
1176
- if ( ++p == pe )
2151
+ st_case_5:
2152
+ switch( ( (*( p))) ) {
2153
+ case 42: {
2154
+ goto st6;
2155
+ }
2156
+ case 47: {
2157
+ goto st8;
2158
+ }
2159
+ }
2160
+ {
2161
+ goto st0;
2162
+ }
2163
+ st6:
2164
+ p+= 1;
2165
+ if ( p == pe )
1177
2166
  goto _test_eof6;
1178
- case 6:
1179
- if ( (*p) == 42 )
1180
- goto st7;
1181
- goto st6;
1182
- st7:
1183
- if ( ++p == pe )
2167
+ st_case_6:
2168
+ if ( ( (*( p))) == 42 ) {
2169
+ goto st7;
2170
+ }
2171
+ {
2172
+ goto st6;
2173
+ }
2174
+ st7:
2175
+ p+= 1;
2176
+ if ( p == pe )
1184
2177
  goto _test_eof7;
1185
- case 7:
1186
- switch( (*p) ) {
1187
- case 42: goto st7;
1188
- case 47: goto st4;
1189
- }
1190
- goto st6;
1191
- st8:
1192
- if ( ++p == pe )
2178
+ st_case_7:
2179
+ switch( ( (*( p))) ) {
2180
+ case 42: {
2181
+ goto st7;
2182
+ }
2183
+ case 47: {
2184
+ goto st4;
2185
+ }
2186
+ }
2187
+ {
2188
+ goto st6;
2189
+ }
2190
+ st8:
2191
+ p+= 1;
2192
+ if ( p == pe )
1193
2193
  goto _test_eof8;
1194
- case 8:
1195
- if ( (*p) == 10 )
1196
- goto st4;
1197
- goto st8;
1198
- st9:
1199
- if ( ++p == pe )
2194
+ st_case_8:
2195
+ if ( ( (*( p))) == 10 ) {
2196
+ goto st4;
2197
+ }
2198
+ {
2199
+ goto st8;
2200
+ }
2201
+ st9:
2202
+ p+= 1;
2203
+ if ( p == pe )
1200
2204
  goto _test_eof9;
1201
- case 9:
1202
- switch( (*p) ) {
1203
- case 42: goto st10;
1204
- case 47: goto st12;
1205
- }
1206
- goto st0;
1207
- st10:
1208
- if ( ++p == pe )
2205
+ st_case_9:
2206
+ switch( ( (*( p))) ) {
2207
+ case 42: {
2208
+ goto st10;
2209
+ }
2210
+ case 47: {
2211
+ goto st12;
2212
+ }
2213
+ }
2214
+ {
2215
+ goto st0;
2216
+ }
2217
+ st10:
2218
+ p+= 1;
2219
+ if ( p == pe )
1209
2220
  goto _test_eof10;
1210
- case 10:
1211
- if ( (*p) == 42 )
1212
- goto st11;
1213
- goto st10;
1214
- st11:
1215
- if ( ++p == pe )
2221
+ st_case_10:
2222
+ if ( ( (*( p))) == 42 ) {
2223
+ goto st11;
2224
+ }
2225
+ {
2226
+ goto st10;
2227
+ }
2228
+ st11:
2229
+ p+= 1;
2230
+ if ( p == pe )
1216
2231
  goto _test_eof11;
1217
- case 11:
1218
- switch( (*p) ) {
1219
- case 42: goto st11;
1220
- case 47: goto st3;
1221
- }
1222
- goto st10;
1223
- st12:
1224
- if ( ++p == pe )
2232
+ st_case_11:
2233
+ switch( ( (*( p))) ) {
2234
+ case 42: {
2235
+ goto st11;
2236
+ }
2237
+ case 47: {
2238
+ goto st3;
2239
+ }
2240
+ }
2241
+ {
2242
+ goto st10;
2243
+ }
2244
+ st12:
2245
+ p+= 1;
2246
+ if ( p == pe )
1225
2247
  goto _test_eof12;
1226
- case 12:
1227
- if ( (*p) == 10 )
1228
- goto st3;
1229
- goto st12;
1230
- tr4:
1231
- #line 373 "parser.rl"
1232
- { p--; {p++; cs = 17; goto _out;} }
1233
- goto st17;
1234
- st17:
1235
- if ( ++p == pe )
2248
+ st_case_12:
2249
+ if ( ( (*( p))) == 10 ) {
2250
+ goto st3;
2251
+ }
2252
+ {
2253
+ goto st12;
2254
+ }
2255
+ ctr4:
2256
+ {
2257
+ #line 424 "parser.rl"
2258
+ {p = p - 1; } {p+= 1; cs = 17; goto _out;} }
2259
+
2260
+ goto st17;
2261
+ st17:
2262
+ p+= 1;
2263
+ if ( p == pe )
1236
2264
  goto _test_eof17;
1237
- case 17:
1238
- #line 1239 "parser.c"
1239
- goto st0;
1240
- st13:
1241
- if ( ++p == pe )
2265
+ st_case_17:
2266
+ {
2267
+ goto st0;
2268
+ }
2269
+ st13:
2270
+ p+= 1;
2271
+ if ( p == pe )
1242
2272
  goto _test_eof13;
1243
- case 13:
1244
- switch( (*p) ) {
1245
- case 42: goto st14;
1246
- case 47: goto st16;
1247
- }
1248
- goto st0;
1249
- st14:
1250
- if ( ++p == pe )
2273
+ st_case_13:
2274
+ switch( ( (*( p))) ) {
2275
+ case 42: {
2276
+ goto st14;
2277
+ }
2278
+ case 47: {
2279
+ goto st16;
2280
+ }
2281
+ }
2282
+ {
2283
+ goto st0;
2284
+ }
2285
+ st14:
2286
+ p+= 1;
2287
+ if ( p == pe )
1251
2288
  goto _test_eof14;
1252
- case 14:
1253
- if ( (*p) == 42 )
1254
- goto st15;
1255
- goto st14;
1256
- st15:
1257
- if ( ++p == pe )
2289
+ st_case_14:
2290
+ if ( ( (*( p))) == 42 ) {
2291
+ goto st15;
2292
+ }
2293
+ {
2294
+ goto st14;
2295
+ }
2296
+ st15:
2297
+ p+= 1;
2298
+ if ( p == pe )
1258
2299
  goto _test_eof15;
1259
- case 15:
1260
- switch( (*p) ) {
1261
- case 42: goto st15;
1262
- case 47: goto st2;
1263
- }
1264
- goto st14;
1265
- st16:
1266
- if ( ++p == pe )
2300
+ st_case_15:
2301
+ switch( ( (*( p))) ) {
2302
+ case 42: {
2303
+ goto st15;
2304
+ }
2305
+ case 47: {
2306
+ goto st2;
2307
+ }
2308
+ }
2309
+ {
2310
+ goto st14;
2311
+ }
2312
+ st16:
2313
+ p+= 1;
2314
+ if ( p == pe )
1267
2315
  goto _test_eof16;
1268
- case 16:
1269
- if ( (*p) == 10 )
1270
- goto st2;
1271
- goto st16;
1272
- }
1273
- _test_eof2: cs = 2; goto _test_eof;
1274
- _test_eof3: cs = 3; goto _test_eof;
1275
- _test_eof4: cs = 4; goto _test_eof;
1276
- _test_eof5: cs = 5; goto _test_eof;
1277
- _test_eof6: cs = 6; goto _test_eof;
1278
- _test_eof7: cs = 7; goto _test_eof;
1279
- _test_eof8: cs = 8; goto _test_eof;
1280
- _test_eof9: cs = 9; goto _test_eof;
1281
- _test_eof10: cs = 10; goto _test_eof;
1282
- _test_eof11: cs = 11; goto _test_eof;
1283
- _test_eof12: cs = 12; goto _test_eof;
1284
- _test_eof17: cs = 17; goto _test_eof;
1285
- _test_eof13: cs = 13; goto _test_eof;
1286
- _test_eof14: cs = 14; goto _test_eof;
1287
- _test_eof15: cs = 15; goto _test_eof;
1288
- _test_eof16: cs = 16; goto _test_eof;
1289
-
1290
- _test_eof: {}
1291
- _out: {}
2316
+ st_case_16:
2317
+ if ( ( (*( p))) == 10 ) {
2318
+ goto st2;
2319
+ }
2320
+ {
2321
+ goto st16;
2322
+ }
2323
+ st_out:
2324
+ _test_eof2: cs = 2; goto _test_eof;
2325
+ _test_eof3: cs = 3; goto _test_eof;
2326
+ _test_eof4: cs = 4; goto _test_eof;
2327
+ _test_eof5: cs = 5; goto _test_eof;
2328
+ _test_eof6: cs = 6; goto _test_eof;
2329
+ _test_eof7: cs = 7; goto _test_eof;
2330
+ _test_eof8: cs = 8; goto _test_eof;
2331
+ _test_eof9: cs = 9; goto _test_eof;
2332
+ _test_eof10: cs = 10; goto _test_eof;
2333
+ _test_eof11: cs = 11; goto _test_eof;
2334
+ _test_eof12: cs = 12; goto _test_eof;
2335
+ _test_eof17: cs = 17; goto _test_eof;
2336
+ _test_eof13: cs = 13; goto _test_eof;
2337
+ _test_eof14: cs = 14; goto _test_eof;
2338
+ _test_eof15: cs = 15; goto _test_eof;
2339
+ _test_eof16: cs = 16; goto _test_eof;
2340
+
2341
+ _test_eof: {}
2342
+ _out: {}
2343
+ }
2344
+
2345
+ #line 446 "parser.rl"
2346
+
2347
+
2348
+ if(cs >= JSON_array_first_final) {
2349
+ return p + 1;
2350
+ } else {
2351
+ rb_enc_raise(EXC_ENCODING eParserError, "%u: unexpected token at '%s'", __LINE__, p);
2352
+ return NULL;
1292
2353
  }
1293
-
1294
- #line 395 "parser.rl"
1295
-
1296
- if(cs >= JSON_array_first_final) {
1297
- return p + 1;
1298
- } else {
1299
- rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p);
1300
- return NULL;
1301
- }
1302
2354
  }
1303
2355
 
1304
- static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
2356
+ static const size_t MAX_STACK_BUFFER_SIZE = 128;
2357
+ static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int symbolize)
1305
2358
  {
1306
- char *p = string, *pe = string, *unescape;
1307
- int unescape_len;
1308
- char buf[4];
1309
-
1310
- while (pe < stringEnd) {
1311
- if (*pe == '\\') {
1312
- unescape = (char *) "?";
1313
- unescape_len = 1;
1314
- if (pe > p) rb_str_buf_cat(result, p, pe - p);
1315
- switch (*++pe) {
1316
- case 'n':
1317
- unescape = (char *) "\n";
1318
- break;
1319
- case 'r':
1320
- unescape = (char *) "\r";
1321
- break;
1322
- case 't':
1323
- unescape = (char *) "\t";
1324
- break;
1325
- case '"':
1326
- unescape = (char *) "\"";
1327
- break;
1328
- case '\\':
1329
- unescape = (char *) "\\";
1330
- break;
1331
- case 'b':
1332
- unescape = (char *) "\b";
1333
- break;
1334
- case 'f':
1335
- unescape = (char *) "\f";
1336
- break;
1337
- case 'u':
1338
- if (pe > stringEnd - 4) {
1339
- return Qnil;
1340
- } else {
1341
- UTF32 ch = unescape_unicode((unsigned char *) ++pe);
1342
- pe += 3;
1343
- if (UNI_SUR_HIGH_START == (ch & 0xFC00)) {
1344
- pe++;
1345
- if (pe > stringEnd - 6) return Qnil;
1346
- if (pe[0] == '\\' && pe[1] == 'u') {
1347
- UTF32 sur = unescape_unicode((unsigned char *) pe + 2);
1348
- ch = (((ch & 0x3F) << 10) | ((((ch >> 6) & 0xF) + 1) << 16)
1349
- | (sur & 0x3FF));
1350
- pe += 5;
1351
- } else {
1352
- unescape = (char *) "?";
1353
- break;
1354
- }
1355
- }
1356
- unescape_len = convert_UTF32_to_UTF8(buf, ch);
1357
- unescape = buf;
1358
- }
1359
- break;
1360
- default:
1361
- p = pe;
1362
- continue;
1363
- }
1364
- rb_str_buf_cat(result, unescape, unescape_len);
1365
- p = ++pe;
1366
- } else {
1367
- pe++;
1368
- }
1369
- }
1370
- rb_str_buf_cat(result, p, pe - p);
1371
- return result;
2359
+ VALUE result = Qnil;
2360
+ size_t bufferSize = stringEnd - string;
2361
+ char *p = string, *pe = string, *unescape, *bufferStart, *buffer;
2362
+ int unescape_len;
2363
+ char buf[4];
2364
+
2365
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
2366
+ # ifdef HAVE_RB_ENC_INTERNED_STR
2367
+ bufferStart = buffer = ALLOC_N(char, bufferSize ? bufferSize : 1);
2368
+ # else
2369
+ bufferStart = buffer = ALLOC_N(char, bufferSize);
2370
+ # endif
2371
+ } else {
2372
+ # ifdef HAVE_RB_ENC_INTERNED_STR
2373
+ bufferStart = buffer = ALLOCA_N(char, bufferSize ? bufferSize : 1);
2374
+ # else
2375
+ bufferStart = buffer = ALLOCA_N(char, bufferSize);
2376
+ # endif
2377
+ }
2378
+
2379
+ while (pe < stringEnd) {
2380
+ if (*pe == '\\') {
2381
+ unescape = (char *) "?";
2382
+ unescape_len = 1;
2383
+ if (pe > p) {
2384
+ MEMCPY(buffer, p, char, pe - p);
2385
+ buffer += pe - p;
2386
+ }
2387
+ switch (*++pe) {
2388
+ case 'n':
2389
+ unescape = (char *) "\n";
2390
+ break;
2391
+ case 'r':
2392
+ unescape = (char *) "\r";
2393
+ break;
2394
+ case 't':
2395
+ unescape = (char *) "\t";
2396
+ break;
2397
+ case '"':
2398
+ unescape = (char *) "\"";
2399
+ break;
2400
+ case '\\':
2401
+ unescape = (char *) "\\";
2402
+ break;
2403
+ case 'b':
2404
+ unescape = (char *) "\b";
2405
+ break;
2406
+ case 'f':
2407
+ unescape = (char *) "\f";
2408
+ break;
2409
+ case 'u':
2410
+ if (pe > stringEnd - 4) {
2411
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
2412
+ free(bufferStart);
2413
+ }
2414
+ rb_enc_raise(
2415
+ EXC_ENCODING eParserError,
2416
+ "%u: incomplete unicode character escape sequence at '%s'", __LINE__, p
2417
+ );
2418
+ } else {
2419
+ UTF32 ch = unescape_unicode((unsigned char *) ++pe);
2420
+ pe += 3;
2421
+ if (UNI_SUR_HIGH_START == (ch & 0xFC00)) {
2422
+ pe++;
2423
+ if (pe > stringEnd - 6) {
2424
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
2425
+ free(bufferStart);
2426
+ }
2427
+ rb_enc_raise(
2428
+ EXC_ENCODING eParserError,
2429
+ "%u: incomplete surrogate pair at '%s'", __LINE__, p
2430
+ );
2431
+ }
2432
+ if (pe[0] == '\\' && pe[1] == 'u') {
2433
+ UTF32 sur = unescape_unicode((unsigned char *) pe + 2);
2434
+ ch = (((ch & 0x3F) << 10) | ((((ch >> 6) & 0xF) + 1) << 16)
2435
+ | (sur & 0x3FF));
2436
+ pe += 5;
2437
+ } else {
2438
+ unescape = (char *) "?";
2439
+ break;
2440
+ }
2441
+ }
2442
+ unescape_len = convert_UTF32_to_UTF8(buf, ch);
2443
+ unescape = buf;
2444
+ }
2445
+ break;
2446
+ default:
2447
+ p = pe;
2448
+ continue;
2449
+ }
2450
+ MEMCPY(buffer, unescape, char, unescape_len);
2451
+ buffer += unescape_len;
2452
+ p = ++pe;
2453
+ } else {
2454
+ pe++;
2455
+ }
2456
+ }
2457
+
2458
+ if (pe > p) {
2459
+ MEMCPY(buffer, p, char, pe - p);
2460
+ buffer += pe - p;
2461
+ }
2462
+
2463
+ # ifdef HAVE_RB_ENC_INTERNED_STR
2464
+ if (intern) {
2465
+ result = rb_enc_interned_str(bufferStart, (long)(buffer - bufferStart), rb_utf8_encoding());
2466
+ } else {
2467
+ result = rb_utf8_str_new(bufferStart, (long)(buffer - bufferStart));
2468
+ }
2469
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
2470
+ free(bufferStart);
2471
+ }
2472
+ # else
2473
+ result = rb_utf8_str_new(bufferStart, (long)(buffer - bufferStart));
2474
+
2475
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
2476
+ free(bufferStart);
2477
+ }
2478
+
2479
+ if (intern) {
2480
+ # if STR_UMINUS_DEDUPE_FROZEN
2481
+ // Starting from MRI 2.8 it is preferable to freeze the string
2482
+ // before deduplication so that it can be interned directly
2483
+ // otherwise it would be duplicated first which is wasteful.
2484
+ result = rb_funcall(rb_str_freeze(result), i_uminus, 0);
2485
+ # elif STR_UMINUS_DEDUPE
2486
+ // MRI 2.5 and older do not deduplicate strings that are already
2487
+ // frozen.
2488
+ result = rb_funcall(result, i_uminus, 0);
2489
+ # else
2490
+ result = rb_str_freeze(result);
2491
+ # endif
2492
+ }
2493
+ # endif
2494
+
2495
+ if (symbolize) {
2496
+ result = rb_str_intern(result);
2497
+ }
2498
+
2499
+ return result;
1372
2500
  }
1373
2501
 
1374
2502
 
1375
- #line 1376 "parser.c"
1376
- static const int JSON_string_start = 1;
1377
- static const int JSON_string_first_final = 8;
1378
- static const int JSON_string_error = 0;
2503
+ enum {JSON_string_start = 1};
2504
+ enum {JSON_string_first_final = 8};
2505
+ enum {JSON_string_error = 0};
2506
+
2507
+ enum {JSON_string_en_main = 1};
2508
+
2509
+ static const char MAYBE_UNUSED(_JSON_string_nfa_targs)[] = {
2510
+ 0, 0
2511
+ };
2512
+
2513
+ static const char MAYBE_UNUSED(_JSON_string_nfa_offsets)[] = {
2514
+ 0, 0, 0, 0, 0, 0, 0, 0,
2515
+ 0, 0
2516
+ };
2517
+
2518
+ static const char MAYBE_UNUSED(_JSON_string_nfa_push_actions)[] = {
2519
+ 0, 0
2520
+ };
1379
2521
 
1380
- static const int JSON_string_en_main = 1;
2522
+ static const char MAYBE_UNUSED(_JSON_string_nfa_pop_trans)[] = {
2523
+ 0, 0
2524
+ };
1381
2525
 
1382
2526
 
1383
- #line 494 "parser.rl"
2527
+ #line 612 "parser.rl"
1384
2528
 
1385
2529
 
1386
2530
  static int
1387
2531
  match_i(VALUE regexp, VALUE klass, VALUE memo)
1388
2532
  {
1389
- if (regexp == Qundef) return ST_STOP;
1390
- if (RTEST(rb_funcall(klass, i_json_creatable_p, 0)) &&
1391
- RTEST(rb_funcall(regexp, i_match, 1, rb_ary_entry(memo, 0)))) {
1392
- rb_ary_push(memo, klass);
1393
- return ST_STOP;
1394
- }
1395
- return ST_CONTINUE;
2533
+ if (regexp == Qundef) return ST_STOP;
2534
+ if (RTEST(rb_funcall(klass, i_json_creatable_p, 0)) &&
2535
+ RTEST(rb_funcall(regexp, i_match, 1, rb_ary_entry(memo, 0)))) {
2536
+ rb_ary_push(memo, klass);
2537
+ return ST_STOP;
2538
+ }
2539
+ return ST_CONTINUE;
1396
2540
  }
1397
2541
 
1398
2542
  static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *result)
1399
2543
  {
1400
- int cs = EVIL;
1401
- VALUE match_string;
2544
+ int cs = EVIL;
2545
+ VALUE match_string;
1402
2546
 
1403
- *result = rb_str_buf_new(0);
1404
2547
 
1405
- #line 1406 "parser.c"
1406
2548
  {
1407
- cs = JSON_string_start;
2549
+ cs = (int)JSON_string_start;
1408
2550
  }
1409
2551
 
1410
- #line 515 "parser.rl"
1411
- json->memo = p;
2552
+ #line 632 "parser.rl"
2553
+
2554
+ json->memo = p;
1412
2555
 
1413
- #line 1414 "parser.c"
1414
2556
  {
1415
- if ( p == pe )
2557
+ if ( p == pe )
1416
2558
  goto _test_eof;
1417
- switch ( cs )
1418
- {
1419
- case 1:
1420
- if ( (*p) == 34 )
1421
- goto st2;
1422
- goto st0;
1423
- st0:
1424
- cs = 0;
1425
- goto _out;
1426
- st2:
1427
- if ( ++p == pe )
2559
+ switch ( cs )
2560
+ {
2561
+ case 1:
2562
+ goto st_case_1;
2563
+ case 0:
2564
+ goto st_case_0;
2565
+ case 2:
2566
+ goto st_case_2;
2567
+ case 8:
2568
+ goto st_case_8;
2569
+ case 3:
2570
+ goto st_case_3;
2571
+ case 4:
2572
+ goto st_case_4;
2573
+ case 5:
2574
+ goto st_case_5;
2575
+ case 6:
2576
+ goto st_case_6;
2577
+ case 7:
2578
+ goto st_case_7;
2579
+ }
2580
+ goto st_out;
2581
+ st_case_1:
2582
+ if ( ( (*( p))) == 34 ) {
2583
+ goto st2;
2584
+ }
2585
+ {
2586
+ goto st0;
2587
+ }
2588
+ st_case_0:
2589
+ st0:
2590
+ cs = 0;
2591
+ goto _out;
2592
+ st2:
2593
+ p+= 1;
2594
+ if ( p == pe )
1428
2595
  goto _test_eof2;
1429
- case 2:
1430
- switch( (*p) ) {
1431
- case 34: goto tr2;
1432
- case 92: goto st3;
1433
- }
1434
- if ( 0 <= (*p) && (*p) <= 31 )
1435
- goto st0;
1436
- goto st2;
1437
- tr2:
1438
- #line 480 "parser.rl"
1439
- {
1440
- *result = json_string_unescape(*result, json->memo + 1, p);
1441
- if (NIL_P(*result)) {
1442
- p--;
1443
- {p++; cs = 8; goto _out;}
1444
- } else {
1445
- FORCE_UTF8(*result);
1446
- {p = (( p + 1))-1;}
1447
- }
1448
- }
1449
- #line 491 "parser.rl"
1450
- { p--; {p++; cs = 8; goto _out;} }
1451
- goto st8;
1452
- st8:
1453
- if ( ++p == pe )
2596
+ st_case_2:
2597
+ switch( ( (*( p))) ) {
2598
+ case 34: {
2599
+ goto ctr2;
2600
+ }
2601
+ case 92: {
2602
+ goto st3;
2603
+ }
2604
+ }
2605
+ if ( 0 <= (signed char)(*(p)) && (*(p)) <= 31 ) {
2606
+ goto st0;
2607
+ }
2608
+ {
2609
+ goto st2;
2610
+ }
2611
+ ctr2:
2612
+ {
2613
+ #line 599 "parser.rl"
2614
+
2615
+ *result = json_string_unescape(json->memo + 1, p, json->parsing_name || json-> freeze, json->parsing_name && json->symbolize_names);
2616
+ if (NIL_P(*result)) {
2617
+ {p = p - 1; }
2618
+ {p+= 1; cs = 8; goto _out;}
2619
+ } else {
2620
+ {p = (( p + 1))-1;}
2621
+
2622
+ }
2623
+ }
2624
+ {
2625
+ #line 609 "parser.rl"
2626
+ {p = p - 1; } {p+= 1; cs = 8; goto _out;} }
2627
+
2628
+ goto st8;
2629
+ st8:
2630
+ p+= 1;
2631
+ if ( p == pe )
1454
2632
  goto _test_eof8;
1455
- case 8:
1456
- #line 1457 "parser.c"
1457
- goto st0;
1458
- st3:
1459
- if ( ++p == pe )
2633
+ st_case_8:
2634
+ {
2635
+ goto st0;
2636
+ }
2637
+ st3:
2638
+ p+= 1;
2639
+ if ( p == pe )
1460
2640
  goto _test_eof3;
1461
- case 3:
1462
- if ( (*p) == 117 )
1463
- goto st4;
1464
- if ( 0 <= (*p) && (*p) <= 31 )
1465
- goto st0;
1466
- goto st2;
1467
- st4:
1468
- if ( ++p == pe )
2641
+ st_case_3:
2642
+ if ( ( (*( p))) == 117 ) {
2643
+ goto st4;
2644
+ }
2645
+ if ( 0 <= (signed char)(*(p)) && (*(p)) <= 31 ) {
2646
+ goto st0;
2647
+ }
2648
+ {
2649
+ goto st2;
2650
+ }
2651
+ st4:
2652
+ p+= 1;
2653
+ if ( p == pe )
1469
2654
  goto _test_eof4;
1470
- case 4:
1471
- if ( (*p) < 65 ) {
1472
- if ( 48 <= (*p) && (*p) <= 57 )
2655
+ st_case_4:
2656
+ if ( ( (*( p))) < 65 ) {
2657
+ if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) {
2658
+ goto st5;
2659
+ }
2660
+ } else if ( ( (*( p))) > 70 ) {
2661
+ if ( 97 <= ( (*( p))) && ( (*( p))) <= 102 ) {
2662
+ goto st5;
2663
+ }
2664
+ } else {
1473
2665
  goto st5;
1474
- } else if ( (*p) > 70 ) {
1475
- if ( 97 <= (*p) && (*p) <= 102 )
1476
- goto st5;
1477
- } else
1478
- goto st5;
1479
- goto st0;
1480
- st5:
1481
- if ( ++p == pe )
2666
+ }
2667
+ {
2668
+ goto st0;
2669
+ }
2670
+ st5:
2671
+ p+= 1;
2672
+ if ( p == pe )
1482
2673
  goto _test_eof5;
1483
- case 5:
1484
- if ( (*p) < 65 ) {
1485
- if ( 48 <= (*p) && (*p) <= 57 )
1486
- goto st6;
1487
- } else if ( (*p) > 70 ) {
1488
- if ( 97 <= (*p) && (*p) <= 102 )
2674
+ st_case_5:
2675
+ if ( ( (*( p))) < 65 ) {
2676
+ if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) {
2677
+ goto st6;
2678
+ }
2679
+ } else if ( ( (*( p))) > 70 ) {
2680
+ if ( 97 <= ( (*( p))) && ( (*( p))) <= 102 ) {
2681
+ goto st6;
2682
+ }
2683
+ } else {
1489
2684
  goto st6;
1490
- } else
1491
- goto st6;
1492
- goto st0;
1493
- st6:
1494
- if ( ++p == pe )
2685
+ }
2686
+ {
2687
+ goto st0;
2688
+ }
2689
+ st6:
2690
+ p+= 1;
2691
+ if ( p == pe )
1495
2692
  goto _test_eof6;
1496
- case 6:
1497
- if ( (*p) < 65 ) {
1498
- if ( 48 <= (*p) && (*p) <= 57 )
2693
+ st_case_6:
2694
+ if ( ( (*( p))) < 65 ) {
2695
+ if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) {
2696
+ goto st7;
2697
+ }
2698
+ } else if ( ( (*( p))) > 70 ) {
2699
+ if ( 97 <= ( (*( p))) && ( (*( p))) <= 102 ) {
2700
+ goto st7;
2701
+ }
2702
+ } else {
1499
2703
  goto st7;
1500
- } else if ( (*p) > 70 ) {
1501
- if ( 97 <= (*p) && (*p) <= 102 )
1502
- goto st7;
1503
- } else
1504
- goto st7;
1505
- goto st0;
1506
- st7:
1507
- if ( ++p == pe )
2704
+ }
2705
+ {
2706
+ goto st0;
2707
+ }
2708
+ st7:
2709
+ p+= 1;
2710
+ if ( p == pe )
1508
2711
  goto _test_eof7;
1509
- case 7:
1510
- if ( (*p) < 65 ) {
1511
- if ( 48 <= (*p) && (*p) <= 57 )
1512
- goto st2;
1513
- } else if ( (*p) > 70 ) {
1514
- if ( 97 <= (*p) && (*p) <= 102 )
2712
+ st_case_7:
2713
+ if ( ( (*( p))) < 65 ) {
2714
+ if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) {
2715
+ goto st2;
2716
+ }
2717
+ } else if ( ( (*( p))) > 70 ) {
2718
+ if ( 97 <= ( (*( p))) && ( (*( p))) <= 102 ) {
2719
+ goto st2;
2720
+ }
2721
+ } else {
1515
2722
  goto st2;
1516
- } else
1517
- goto st2;
1518
- goto st0;
1519
- }
1520
- _test_eof2: cs = 2; goto _test_eof;
1521
- _test_eof8: cs = 8; goto _test_eof;
1522
- _test_eof3: cs = 3; goto _test_eof;
1523
- _test_eof4: cs = 4; goto _test_eof;
1524
- _test_eof5: cs = 5; goto _test_eof;
1525
- _test_eof6: cs = 6; goto _test_eof;
1526
- _test_eof7: cs = 7; goto _test_eof;
1527
-
1528
- _test_eof: {}
1529
- _out: {}
2723
+ }
2724
+ {
2725
+ goto st0;
2726
+ }
2727
+ st_out:
2728
+ _test_eof2: cs = 2; goto _test_eof;
2729
+ _test_eof8: cs = 8; goto _test_eof;
2730
+ _test_eof3: cs = 3; goto _test_eof;
2731
+ _test_eof4: cs = 4; goto _test_eof;
2732
+ _test_eof5: cs = 5; goto _test_eof;
2733
+ _test_eof6: cs = 6; goto _test_eof;
2734
+ _test_eof7: cs = 7; goto _test_eof;
2735
+
2736
+ _test_eof: {}
2737
+ _out: {}
2738
+ }
2739
+
2740
+ #line 634 "parser.rl"
2741
+
2742
+
2743
+ if (json->create_additions && RTEST(match_string = json->match_string)) {
2744
+ VALUE klass;
2745
+ VALUE memo = rb_ary_new2(2);
2746
+ rb_ary_push(memo, *result);
2747
+ rb_hash_foreach(match_string, match_i, memo);
2748
+ klass = rb_ary_entry(memo, 1);
2749
+ if (RTEST(klass)) {
2750
+ *result = rb_funcall(klass, i_json_create, 1, *result);
2751
+ }
2752
+ }
2753
+
2754
+ if (cs >= JSON_string_first_final) {
2755
+ return p + 1;
2756
+ } else {
2757
+ return NULL;
1530
2758
  }
1531
-
1532
- #line 517 "parser.rl"
1533
-
1534
- if (json->create_additions && RTEST(match_string = json->match_string)) {
1535
- VALUE klass;
1536
- VALUE memo = rb_ary_new2(2);
1537
- rb_ary_push(memo, *result);
1538
- rb_hash_foreach(match_string, match_i, memo);
1539
- klass = rb_ary_entry(memo, 1);
1540
- if (RTEST(klass)) {
1541
- *result = rb_funcall(klass, i_json_create, 1, *result);
1542
- }
1543
- }
1544
-
1545
- if (json->symbolize_names && json->parsing_name) {
1546
- *result = rb_str_intern(*result);
1547
- }
1548
- if (cs >= JSON_string_first_final) {
1549
- return p + 1;
1550
- } else {
1551
- return NULL;
1552
- }
1553
2759
  }
1554
2760
 
1555
2761
  /*
1556
- * Document-class: JSON::Ext::Parser
1557
- *
1558
- * This is the JSON parser implemented as a C extension. It can be configured
1559
- * to be used by setting
1560
- *
1561
- * JSON.parser = JSON::Ext::Parser
1562
- *
1563
- * with the method parser= in JSON.
1564
- *
1565
- */
2762
+ * Document-class: JSON::Ext::Parser
2763
+ *
2764
+ * This is the JSON parser implemented as a C extension. It can be configured
2765
+ * to be used by setting
2766
+ *
2767
+ * JSON.parser = JSON::Ext::Parser
2768
+ *
2769
+ * with the method parser= in JSON.
2770
+ *
2771
+ */
1566
2772
 
1567
2773
  static VALUE convert_encoding(VALUE source)
1568
2774
  {
1569
- char *ptr = RSTRING_PTR(source);
1570
- long len = RSTRING_LEN(source);
1571
- if (len < 2) {
1572
- rb_raise(eParserError, "A JSON text must at least contain two octets!");
1573
- }
1574
- #ifdef HAVE_RUBY_ENCODING_H
1575
- {
1576
- VALUE encoding = rb_funcall(source, i_encoding, 0);
1577
- if (encoding == CEncoding_ASCII_8BIT) {
1578
- if (len >= 4 && ptr[0] == 0 && ptr[1] == 0 && ptr[2] == 0) {
1579
- source = rb_funcall(source, i_encode, 2, CEncoding_UTF_8, CEncoding_UTF_32BE);
1580
- } else if (len >= 4 && ptr[0] == 0 && ptr[2] == 0) {
1581
- source = rb_funcall(source, i_encode, 2, CEncoding_UTF_8, CEncoding_UTF_16BE);
1582
- } else if (len >= 4 && ptr[1] == 0 && ptr[2] == 0 && ptr[3] == 0) {
1583
- source = rb_funcall(source, i_encode, 2, CEncoding_UTF_8, CEncoding_UTF_32LE);
1584
- } else if (len >= 4 && ptr[1] == 0 && ptr[3] == 0) {
1585
- source = rb_funcall(source, i_encode, 2, CEncoding_UTF_8, CEncoding_UTF_16LE);
1586
- } else {
1587
- source = rb_str_dup(source);
1588
- FORCE_UTF8(source);
1589
- }
1590
- } else {
1591
- source = rb_funcall(source, i_encode, 1, CEncoding_UTF_8);
1592
- }
1593
- }
1594
- #else
1595
- if (len >= 4 && ptr[0] == 0 && ptr[1] == 0 && ptr[2] == 0) {
1596
- source = rb_funcall(mJSON, i_iconv, 3, rb_str_new2("utf-8"), rb_str_new2("utf-32be"), source);
1597
- } else if (len >= 4 && ptr[0] == 0 && ptr[2] == 0) {
1598
- source = rb_funcall(mJSON, i_iconv, 3, rb_str_new2("utf-8"), rb_str_new2("utf-16be"), source);
1599
- } else if (len >= 4 && ptr[1] == 0 && ptr[2] == 0 && ptr[3] == 0) {
1600
- source = rb_funcall(mJSON, i_iconv, 3, rb_str_new2("utf-8"), rb_str_new2("utf-32le"), source);
1601
- } else if (len >= 4 && ptr[1] == 0 && ptr[3] == 0) {
1602
- source = rb_funcall(mJSON, i_iconv, 3, rb_str_new2("utf-8"), rb_str_new2("utf-16le"), source);
1603
- }
1604
- #endif
1605
- return source;
2775
+ #ifdef HAVE_RUBY_ENCODING_H
2776
+ rb_encoding *enc = rb_enc_get(source);
2777
+ if (enc == rb_ascii8bit_encoding()) {
2778
+ if (OBJ_FROZEN(source)) {
2779
+ source = rb_str_dup(source);
2780
+ }
2781
+ FORCE_UTF8(source);
2782
+ } else {
2783
+ source = rb_str_conv_enc(source, rb_enc_get(source), rb_utf8_encoding());
2784
+ }
2785
+ #endif
2786
+ return source;
1606
2787
  }
1607
2788
 
1608
2789
  /*
1609
- * call-seq: new(source, opts => {})
1610
- *
1611
- * Creates a new JSON::Ext::Parser instance for the string _source_.
1612
- *
1613
- * Creates a new JSON::Ext::Parser instance for the string _source_.
1614
- *
1615
- * It will be configured by the _opts_ hash. _opts_ can have the following
1616
- * keys:
1617
- *
1618
- * _opts_ can have the following keys:
1619
- * * *max_nesting*: The maximum depth of nesting allowed in the parsed data
1620
- * structures. Disable depth checking with :max_nesting => false|nil|0, it
1621
- * defaults to 100.
1622
- * * *allow_nan*: If set to true, allow NaN, Infinity and -Infinity in
1623
- * defiance of RFC 4627 to be parsed by the Parser. This option defaults to
1624
- * false.
1625
- * * *symbolize_names*: If set to true, returns symbols for the names
1626
- * (keys) in a JSON object. Otherwise strings are returned, which is also
1627
- * the default.
1628
- * * *create_additions*: If set to false, the Parser doesn't create
1629
- * additions even if a matchin class and create_id was found. This option
1630
- * defaults to true.
1631
- * * *object_class*: Defaults to Hash
1632
- * * *array_class*: Defaults to Array
1633
- */
2790
+ * call-seq: new(source, opts => {})
2791
+ *
2792
+ * Creates a new JSON::Ext::Parser instance for the string _source_.
2793
+ *
2794
+ * Creates a new JSON::Ext::Parser instance for the string _source_.
2795
+ *
2796
+ * It will be configured by the _opts_ hash. _opts_ can have the following
2797
+ * keys:
2798
+ *
2799
+ * _opts_ can have the following keys:
2800
+ * * *max_nesting*: The maximum depth of nesting allowed in the parsed data
2801
+ * structures. Disable depth checking with :max_nesting => false|nil|0, it
2802
+ * defaults to 100.
2803
+ * * *allow_nan*: If set to true, allow NaN, Infinity and -Infinity in
2804
+ * defiance of RFC 4627 to be parsed by the Parser. This option defaults to
2805
+ * false.
2806
+ * * *symbolize_names*: If set to true, returns symbols for the names
2807
+ * (keys) in a JSON object. Otherwise strings are returned, which is
2808
+ * also the default. It's not possible to use this option in
2809
+ * conjunction with the *create_additions* option.
2810
+ * * *create_additions*: If set to false, the Parser doesn't create
2811
+ * additions even if a matching class and create_id was found. This option
2812
+ * defaults to false.
2813
+ * * *object_class*: Defaults to Hash
2814
+ * * *array_class*: Defaults to Array
2815
+ */
1634
2816
  static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
1635
2817
  {
1636
- VALUE source, opts;
1637
- GET_PARSER_INIT;
1638
-
1639
- if (json->Vsource) {
1640
- rb_raise(rb_eTypeError, "already initialized instance");
1641
- }
1642
- rb_scan_args(argc, argv, "11", &source, &opts);
1643
- if (!NIL_P(opts)) {
1644
- opts = rb_convert_type(opts, T_HASH, "Hash", "to_hash");
1645
- if (NIL_P(opts)) {
1646
- rb_raise(rb_eArgError, "opts needs to be like a hash");
1647
- } else {
1648
- VALUE tmp = ID2SYM(i_max_nesting);
1649
- if (option_given_p(opts, tmp)) {
1650
- VALUE max_nesting = rb_hash_aref(opts, tmp);
1651
- if (RTEST(max_nesting)) {
1652
- Check_Type(max_nesting, T_FIXNUM);
1653
- json->max_nesting = FIX2INT(max_nesting);
1654
- } else {
1655
- json->max_nesting = 0;
1656
- }
1657
- } else {
1658
- json->max_nesting = 100;
1659
- }
1660
- tmp = ID2SYM(i_allow_nan);
1661
- if (option_given_p(opts, tmp)) {
1662
- json->allow_nan = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0;
1663
- } else {
1664
- json->allow_nan = 0;
1665
- }
1666
- tmp = ID2SYM(i_symbolize_names);
1667
- if (option_given_p(opts, tmp)) {
1668
- json->symbolize_names = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0;
1669
- } else {
1670
- json->symbolize_names = 0;
1671
- }
1672
- tmp = ID2SYM(i_quirks_mode);
1673
- if (option_given_p(opts, tmp)) {
1674
- VALUE quirks_mode = rb_hash_aref(opts, tmp);
1675
- json->quirks_mode = RTEST(quirks_mode) ? 1 : 0;
1676
- } else {
1677
- json->quirks_mode = 0;
1678
- }
1679
- tmp = ID2SYM(i_create_additions);
1680
- if (option_given_p(opts, tmp)) {
1681
- json->create_additions = RTEST(rb_hash_aref(opts, tmp));
1682
- } else {
1683
- json->create_additions = 0;
1684
- }
1685
- tmp = ID2SYM(i_create_id);
1686
- if (option_given_p(opts, tmp)) {
1687
- json->create_id = rb_hash_aref(opts, tmp);
1688
- } else {
1689
- json->create_id = rb_funcall(mJSON, i_create_id, 0);
1690
- }
1691
- tmp = ID2SYM(i_object_class);
1692
- if (option_given_p(opts, tmp)) {
1693
- json->object_class = rb_hash_aref(opts, tmp);
1694
- } else {
1695
- json->object_class = Qnil;
1696
- }
1697
- tmp = ID2SYM(i_array_class);
1698
- if (option_given_p(opts, tmp)) {
1699
- json->array_class = rb_hash_aref(opts, tmp);
1700
- } else {
1701
- json->array_class = Qnil;
1702
- }
1703
- tmp = ID2SYM(i_match_string);
1704
- if (option_given_p(opts, tmp)) {
1705
- VALUE match_string = rb_hash_aref(opts, tmp);
1706
- json->match_string = RTEST(match_string) ? match_string : Qnil;
1707
- } else {
1708
- json->match_string = Qnil;
1709
- }
1710
- }
1711
- } else {
1712
- json->max_nesting = 100;
1713
- json->allow_nan = 0;
1714
- json->create_additions = 1;
1715
- json->create_id = rb_funcall(mJSON, i_create_id, 0);
1716
- json->object_class = Qnil;
1717
- json->array_class = Qnil;
1718
- }
1719
- source = rb_convert_type(source, T_STRING, "String", "to_str");
1720
- if (!json->quirks_mode) {
1721
- source = convert_encoding(StringValue(source));
1722
- }
1723
- json->current_nesting = 0;
1724
- StringValue(source);
1725
- json->len = RSTRING_LEN(source);
1726
- json->source = RSTRING_PTR(source);;
1727
- json->Vsource = source;
1728
- return self;
2818
+ VALUE source, opts;
2819
+ GET_PARSER_INIT;
2820
+
2821
+ if (json->Vsource) {
2822
+ rb_raise(rb_eTypeError, "already initialized instance");
2823
+ }
2824
+ #ifdef HAVE_RB_SCAN_ARGS_OPTIONAL_HASH
2825
+ rb_scan_args(argc, argv, "1:", &source, &opts);
2826
+ #else
2827
+ rb_scan_args(argc, argv, "11", &source, &opts);
2828
+ #endif
2829
+ if (!NIL_P(opts)) {
2830
+ #ifndef HAVE_RB_SCAN_ARGS_OPTIONAL_HASH
2831
+ opts = rb_convert_type(opts, T_HASH, "Hash", "to_hash");
2832
+ if (NIL_P(opts)) {
2833
+ rb_raise(rb_eArgError, "opts needs to be like a hash");
2834
+ } else {
2835
+ #endif
2836
+ VALUE tmp = ID2SYM(i_max_nesting);
2837
+ if (option_given_p(opts, tmp)) {
2838
+ VALUE max_nesting = rb_hash_aref(opts, tmp);
2839
+ if (RTEST(max_nesting)) {
2840
+ Check_Type(max_nesting, T_FIXNUM);
2841
+ json->max_nesting = FIX2INT(max_nesting);
2842
+ } else {
2843
+ json->max_nesting = 0;
2844
+ }
2845
+ } else {
2846
+ json->max_nesting = 100;
2847
+ }
2848
+ tmp = ID2SYM(i_allow_nan);
2849
+ if (option_given_p(opts, tmp)) {
2850
+ json->allow_nan = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0;
2851
+ } else {
2852
+ json->allow_nan = 0;
2853
+ }
2854
+ tmp = ID2SYM(i_symbolize_names);
2855
+ if (option_given_p(opts, tmp)) {
2856
+ json->symbolize_names = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0;
2857
+ } else {
2858
+ json->symbolize_names = 0;
2859
+ }
2860
+ tmp = ID2SYM(i_freeze);
2861
+ if (option_given_p(opts, tmp)) {
2862
+ json->freeze = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0;
2863
+ } else {
2864
+ json->freeze = 0;
2865
+ }
2866
+ tmp = ID2SYM(i_create_additions);
2867
+ if (option_given_p(opts, tmp)) {
2868
+ json->create_additions = RTEST(rb_hash_aref(opts, tmp));
2869
+ } else {
2870
+ json->create_additions = 0;
2871
+ }
2872
+ if (json->symbolize_names && json->create_additions) {
2873
+ rb_raise(rb_eArgError,
2874
+ "options :symbolize_names and :create_additions cannot be "
2875
+ " used in conjunction");
2876
+ }
2877
+ tmp = ID2SYM(i_create_id);
2878
+ if (option_given_p(opts, tmp)) {
2879
+ json->create_id = rb_hash_aref(opts, tmp);
2880
+ } else {
2881
+ json->create_id = rb_funcall(mJSON, i_create_id, 0);
2882
+ }
2883
+ tmp = ID2SYM(i_object_class);
2884
+ if (option_given_p(opts, tmp)) {
2885
+ json->object_class = rb_hash_aref(opts, tmp);
2886
+ } else {
2887
+ json->object_class = Qnil;
2888
+ }
2889
+ tmp = ID2SYM(i_array_class);
2890
+ if (option_given_p(opts, tmp)) {
2891
+ json->array_class = rb_hash_aref(opts, tmp);
2892
+ } else {
2893
+ json->array_class = Qnil;
2894
+ }
2895
+ tmp = ID2SYM(i_decimal_class);
2896
+ if (option_given_p(opts, tmp)) {
2897
+ json->decimal_class = rb_hash_aref(opts, tmp);
2898
+ } else {
2899
+ json->decimal_class = Qnil;
2900
+ }
2901
+ tmp = ID2SYM(i_match_string);
2902
+ if (option_given_p(opts, tmp)) {
2903
+ VALUE match_string = rb_hash_aref(opts, tmp);
2904
+ json->match_string = RTEST(match_string) ? match_string : Qnil;
2905
+ } else {
2906
+ json->match_string = Qnil;
2907
+ }
2908
+ #ifndef HAVE_RB_SCAN_ARGS_OPTIONAL_HASH
2909
+ }
2910
+ #endif
2911
+ } else {
2912
+ json->max_nesting = 100;
2913
+ json->allow_nan = 0;
2914
+ json->create_additions = 0;
2915
+ json->create_id = rb_funcall(mJSON, i_create_id, 0);
2916
+ json->object_class = Qnil;
2917
+ json->array_class = Qnil;
2918
+ json->decimal_class = Qnil;
2919
+ }
2920
+ source = convert_encoding(StringValue(source));
2921
+ StringValue(source);
2922
+ json->len = RSTRING_LEN(source);
2923
+ json->source = RSTRING_PTR(source);;
2924
+ json->Vsource = source;
2925
+ return self;
1729
2926
  }
1730
2927
 
1731
2928
 
1732
- #line 1733 "parser.c"
1733
- static const int JSON_start = 1;
1734
- static const int JSON_first_final = 10;
1735
- static const int JSON_error = 0;
1736
-
1737
- static const int JSON_en_main = 1;
1738
-
1739
-
1740
- #line 740 "parser.rl"
1741
-
1742
-
1743
- static VALUE cParser_parse_strict(VALUE self)
1744
- {
1745
- char *p, *pe;
1746
- int cs = EVIL;
1747
- VALUE result = Qnil;
1748
- GET_PARSER;
1749
-
1750
-
1751
- #line 1752 "parser.c"
1752
- {
1753
- cs = JSON_start;
1754
- }
2929
+ enum {JSON_start = 1};
2930
+ enum {JSON_first_final = 10};
2931
+ enum {JSON_error = 0};
1755
2932
 
1756
- #line 750 "parser.rl"
1757
- p = json->source;
1758
- pe = p + json->len;
1759
-
1760
- #line 1761 "parser.c"
1761
- {
1762
- if ( p == pe )
1763
- goto _test_eof;
1764
- switch ( cs )
1765
- {
1766
- st1:
1767
- if ( ++p == pe )
1768
- goto _test_eof1;
1769
- case 1:
1770
- switch( (*p) ) {
1771
- case 13: goto st1;
1772
- case 32: goto st1;
1773
- case 47: goto st2;
1774
- case 91: goto tr3;
1775
- case 123: goto tr4;
1776
- }
1777
- if ( 9 <= (*p) && (*p) <= 10 )
1778
- goto st1;
1779
- goto st0;
1780
- st0:
1781
- cs = 0;
1782
- goto _out;
1783
- st2:
1784
- if ( ++p == pe )
1785
- goto _test_eof2;
1786
- case 2:
1787
- switch( (*p) ) {
1788
- case 42: goto st3;
1789
- case 47: goto st5;
1790
- }
1791
- goto st0;
1792
- st3:
1793
- if ( ++p == pe )
1794
- goto _test_eof3;
1795
- case 3:
1796
- if ( (*p) == 42 )
1797
- goto st4;
1798
- goto st3;
1799
- st4:
1800
- if ( ++p == pe )
1801
- goto _test_eof4;
1802
- case 4:
1803
- switch( (*p) ) {
1804
- case 42: goto st4;
1805
- case 47: goto st1;
1806
- }
1807
- goto st3;
1808
- st5:
1809
- if ( ++p == pe )
1810
- goto _test_eof5;
1811
- case 5:
1812
- if ( (*p) == 10 )
1813
- goto st1;
1814
- goto st5;
1815
- tr3:
1816
- #line 729 "parser.rl"
1817
- {
1818
- char *np;
1819
- json->current_nesting = 1;
1820
- np = JSON_parse_array(json, p, pe, &result);
1821
- if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
1822
- }
1823
- goto st10;
1824
- tr4:
1825
- #line 722 "parser.rl"
1826
- {
1827
- char *np;
1828
- json->current_nesting = 1;
1829
- np = JSON_parse_object(json, p, pe, &result);
1830
- if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
1831
- }
1832
- goto st10;
1833
- st10:
1834
- if ( ++p == pe )
1835
- goto _test_eof10;
1836
- case 10:
1837
- #line 1838 "parser.c"
1838
- switch( (*p) ) {
1839
- case 13: goto st10;
1840
- case 32: goto st10;
1841
- case 47: goto st6;
1842
- }
1843
- if ( 9 <= (*p) && (*p) <= 10 )
1844
- goto st10;
1845
- goto st0;
1846
- st6:
1847
- if ( ++p == pe )
1848
- goto _test_eof6;
1849
- case 6:
1850
- switch( (*p) ) {
1851
- case 42: goto st7;
1852
- case 47: goto st9;
1853
- }
1854
- goto st0;
1855
- st7:
1856
- if ( ++p == pe )
1857
- goto _test_eof7;
1858
- case 7:
1859
- if ( (*p) == 42 )
1860
- goto st8;
1861
- goto st7;
1862
- st8:
1863
- if ( ++p == pe )
1864
- goto _test_eof8;
1865
- case 8:
1866
- switch( (*p) ) {
1867
- case 42: goto st8;
1868
- case 47: goto st10;
1869
- }
1870
- goto st7;
1871
- st9:
1872
- if ( ++p == pe )
1873
- goto _test_eof9;
1874
- case 9:
1875
- if ( (*p) == 10 )
1876
- goto st10;
1877
- goto st9;
1878
- }
1879
- _test_eof1: cs = 1; goto _test_eof;
1880
- _test_eof2: cs = 2; goto _test_eof;
1881
- _test_eof3: cs = 3; goto _test_eof;
1882
- _test_eof4: cs = 4; goto _test_eof;
1883
- _test_eof5: cs = 5; goto _test_eof;
1884
- _test_eof10: cs = 10; goto _test_eof;
1885
- _test_eof6: cs = 6; goto _test_eof;
1886
- _test_eof7: cs = 7; goto _test_eof;
1887
- _test_eof8: cs = 8; goto _test_eof;
1888
- _test_eof9: cs = 9; goto _test_eof;
1889
-
1890
- _test_eof: {}
1891
- _out: {}
1892
- }
1893
-
1894
- #line 753 "parser.rl"
1895
-
1896
- if (cs >= JSON_first_final && p == pe) {
1897
- return result;
1898
- } else {
1899
- rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p);
1900
- return Qnil;
1901
- }
1902
- }
2933
+ enum {JSON_en_main = 1};
1903
2934
 
2935
+ static const char MAYBE_UNUSED(_JSON_nfa_targs)[] = {
2936
+ 0, 0
2937
+ };
1904
2938
 
2939
+ static const char MAYBE_UNUSED(_JSON_nfa_offsets)[] = {
2940
+ 0, 0, 0, 0, 0, 0, 0, 0,
2941
+ 0, 0, 0, 0
2942
+ };
1905
2943
 
1906
- #line 1907 "parser.c"
1907
- static const int JSON_quirks_mode_start = 1;
1908
- static const int JSON_quirks_mode_first_final = 10;
1909
- static const int JSON_quirks_mode_error = 0;
2944
+ static const char MAYBE_UNUSED(_JSON_nfa_push_actions)[] = {
2945
+ 0, 0
2946
+ };
1910
2947
 
1911
- static const int JSON_quirks_mode_en_main = 1;
2948
+ static const char MAYBE_UNUSED(_JSON_nfa_pop_trans)[] = {
2949
+ 0, 0
2950
+ };
1912
2951
 
1913
2952
 
1914
- #line 778 "parser.rl"
2953
+ #line 835 "parser.rl"
1915
2954
 
1916
2955
 
1917
- static VALUE cParser_parse_quirks_mode(VALUE self)
2956
+ /*
2957
+ * call-seq: parse()
2958
+ *
2959
+ * Parses the current JSON text _source_ and returns the complete data
2960
+ * structure as a result.
2961
+ * It raises JSON::ParseError if fail to parse.
2962
+ */
2963
+ static VALUE cParser_parse(VALUE self)
1918
2964
  {
1919
- char *p, *pe;
1920
- int cs = EVIL;
1921
- VALUE result = Qnil;
1922
- GET_PARSER;
2965
+ char *p, *pe;
2966
+ int cs = EVIL;
2967
+ VALUE result = Qnil;
2968
+ GET_PARSER;
1923
2969
 
1924
2970
 
1925
- #line 1926 "parser.c"
1926
2971
  {
1927
- cs = JSON_quirks_mode_start;
2972
+ cs = (int)JSON_start;
1928
2973
  }
1929
2974
 
1930
- #line 788 "parser.rl"
1931
- p = json->source;
1932
- pe = p + json->len;
2975
+ #line 851 "parser.rl"
2976
+
2977
+ p = json->source;
2978
+ pe = p + json->len;
1933
2979
 
1934
- #line 1935 "parser.c"
1935
2980
  {
1936
- if ( p == pe )
2981
+ if ( p == pe )
1937
2982
  goto _test_eof;
1938
- switch ( cs )
1939
- {
1940
- st1:
1941
- if ( ++p == pe )
2983
+ switch ( cs )
2984
+ {
2985
+ case 1:
2986
+ goto st_case_1;
2987
+ case 0:
2988
+ goto st_case_0;
2989
+ case 10:
2990
+ goto st_case_10;
2991
+ case 2:
2992
+ goto st_case_2;
2993
+ case 3:
2994
+ goto st_case_3;
2995
+ case 4:
2996
+ goto st_case_4;
2997
+ case 5:
2998
+ goto st_case_5;
2999
+ case 6:
3000
+ goto st_case_6;
3001
+ case 7:
3002
+ goto st_case_7;
3003
+ case 8:
3004
+ goto st_case_8;
3005
+ case 9:
3006
+ goto st_case_9;
3007
+ }
3008
+ goto st_out;
3009
+ st1:
3010
+ p+= 1;
3011
+ if ( p == pe )
1942
3012
  goto _test_eof1;
1943
- case 1:
1944
- switch( (*p) ) {
1945
- case 13: goto st1;
1946
- case 32: goto st1;
1947
- case 34: goto tr2;
1948
- case 45: goto tr2;
1949
- case 47: goto st6;
1950
- case 73: goto tr2;
1951
- case 78: goto tr2;
1952
- case 91: goto tr2;
1953
- case 102: goto tr2;
1954
- case 110: goto tr2;
1955
- case 116: goto tr2;
1956
- case 123: goto tr2;
1957
- }
1958
- if ( (*p) > 10 ) {
1959
- if ( 48 <= (*p) && (*p) <= 57 )
1960
- goto tr2;
1961
- } else if ( (*p) >= 9 )
1962
- goto st1;
1963
- goto st0;
1964
- st0:
1965
- cs = 0;
1966
- goto _out;
1967
- tr2:
1968
- #line 770 "parser.rl"
1969
- {
1970
- char *np = JSON_parse_value(json, p, pe, &result);
1971
- if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
1972
- }
1973
- goto st10;
1974
- st10:
1975
- if ( ++p == pe )
1976
- goto _test_eof10;
1977
- case 10:
1978
- #line 1979 "parser.c"
1979
- switch( (*p) ) {
1980
- case 13: goto st10;
1981
- case 32: goto st10;
1982
- case 47: goto st2;
1983
- }
1984
- if ( 9 <= (*p) && (*p) <= 10 )
3013
+ st_case_1:
3014
+ switch( ( (*( p))) ) {
3015
+ case 13: {
3016
+ goto st1;
3017
+ }
3018
+ case 32: {
3019
+ goto st1;
3020
+ }
3021
+ case 34: {
3022
+ goto ctr2;
3023
+ }
3024
+ case 45: {
3025
+ goto ctr2;
3026
+ }
3027
+ case 47: {
3028
+ goto st6;
3029
+ }
3030
+ case 73: {
3031
+ goto ctr2;
3032
+ }
3033
+ case 78: {
3034
+ goto ctr2;
3035
+ }
3036
+ case 91: {
3037
+ goto ctr2;
3038
+ }
3039
+ case 102: {
3040
+ goto ctr2;
3041
+ }
3042
+ case 110: {
3043
+ goto ctr2;
3044
+ }
3045
+ case 116: {
3046
+ goto ctr2;
3047
+ }
3048
+ case 123: {
3049
+ goto ctr2;
3050
+ }
3051
+ }
3052
+ if ( ( (*( p))) > 10 ) {
3053
+ if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) {
3054
+ goto ctr2;
3055
+ }
3056
+ } else if ( ( (*( p))) >= 9 ) {
3057
+ goto st1;
3058
+ }
3059
+ {
3060
+ goto st0;
3061
+ }
3062
+ st_case_0:
3063
+ st0:
3064
+ cs = 0;
3065
+ goto _out;
3066
+ ctr2:
3067
+ {
3068
+ #line 827 "parser.rl"
3069
+
3070
+ char *np = JSON_parse_value(json, p, pe, &result, 0);
3071
+ if (np == NULL) { {p = p - 1; } {p+= 1; cs = 10; goto _out;} } else {p = (( np))-1;}
3072
+
3073
+ }
3074
+
1985
3075
  goto st10;
1986
- goto st0;
1987
- st2:
1988
- if ( ++p == pe )
3076
+ st10:
3077
+ p+= 1;
3078
+ if ( p == pe )
3079
+ goto _test_eof10;
3080
+ st_case_10:
3081
+ switch( ( (*( p))) ) {
3082
+ case 13: {
3083
+ goto st10;
3084
+ }
3085
+ case 32: {
3086
+ goto st10;
3087
+ }
3088
+ case 47: {
3089
+ goto st2;
3090
+ }
3091
+ }
3092
+ if ( 9 <= ( (*( p))) && ( (*( p))) <= 10 ) {
3093
+ goto st10;
3094
+ }
3095
+ {
3096
+ goto st0;
3097
+ }
3098
+ st2:
3099
+ p+= 1;
3100
+ if ( p == pe )
1989
3101
  goto _test_eof2;
1990
- case 2:
1991
- switch( (*p) ) {
1992
- case 42: goto st3;
1993
- case 47: goto st5;
1994
- }
1995
- goto st0;
1996
- st3:
1997
- if ( ++p == pe )
3102
+ st_case_2:
3103
+ switch( ( (*( p))) ) {
3104
+ case 42: {
3105
+ goto st3;
3106
+ }
3107
+ case 47: {
3108
+ goto st5;
3109
+ }
3110
+ }
3111
+ {
3112
+ goto st0;
3113
+ }
3114
+ st3:
3115
+ p+= 1;
3116
+ if ( p == pe )
1998
3117
  goto _test_eof3;
1999
- case 3:
2000
- if ( (*p) == 42 )
2001
- goto st4;
2002
- goto st3;
2003
- st4:
2004
- if ( ++p == pe )
3118
+ st_case_3:
3119
+ if ( ( (*( p))) == 42 ) {
3120
+ goto st4;
3121
+ }
3122
+ {
3123
+ goto st3;
3124
+ }
3125
+ st4:
3126
+ p+= 1;
3127
+ if ( p == pe )
2005
3128
  goto _test_eof4;
2006
- case 4:
2007
- switch( (*p) ) {
2008
- case 42: goto st4;
2009
- case 47: goto st10;
2010
- }
2011
- goto st3;
2012
- st5:
2013
- if ( ++p == pe )
3129
+ st_case_4:
3130
+ switch( ( (*( p))) ) {
3131
+ case 42: {
3132
+ goto st4;
3133
+ }
3134
+ case 47: {
3135
+ goto st10;
3136
+ }
3137
+ }
3138
+ {
3139
+ goto st3;
3140
+ }
3141
+ st5:
3142
+ p+= 1;
3143
+ if ( p == pe )
2014
3144
  goto _test_eof5;
2015
- case 5:
2016
- if ( (*p) == 10 )
2017
- goto st10;
2018
- goto st5;
2019
- st6:
2020
- if ( ++p == pe )
3145
+ st_case_5:
3146
+ if ( ( (*( p))) == 10 ) {
3147
+ goto st10;
3148
+ }
3149
+ {
3150
+ goto st5;
3151
+ }
3152
+ st6:
3153
+ p+= 1;
3154
+ if ( p == pe )
2021
3155
  goto _test_eof6;
2022
- case 6:
2023
- switch( (*p) ) {
2024
- case 42: goto st7;
2025
- case 47: goto st9;
2026
- }
2027
- goto st0;
2028
- st7:
2029
- if ( ++p == pe )
3156
+ st_case_6:
3157
+ switch( ( (*( p))) ) {
3158
+ case 42: {
3159
+ goto st7;
3160
+ }
3161
+ case 47: {
3162
+ goto st9;
3163
+ }
3164
+ }
3165
+ {
3166
+ goto st0;
3167
+ }
3168
+ st7:
3169
+ p+= 1;
3170
+ if ( p == pe )
2030
3171
  goto _test_eof7;
2031
- case 7:
2032
- if ( (*p) == 42 )
2033
- goto st8;
2034
- goto st7;
2035
- st8:
2036
- if ( ++p == pe )
3172
+ st_case_7:
3173
+ if ( ( (*( p))) == 42 ) {
3174
+ goto st8;
3175
+ }
3176
+ {
3177
+ goto st7;
3178
+ }
3179
+ st8:
3180
+ p+= 1;
3181
+ if ( p == pe )
2037
3182
  goto _test_eof8;
2038
- case 8:
2039
- switch( (*p) ) {
2040
- case 42: goto st8;
2041
- case 47: goto st1;
2042
- }
2043
- goto st7;
2044
- st9:
2045
- if ( ++p == pe )
3183
+ st_case_8:
3184
+ switch( ( (*( p))) ) {
3185
+ case 42: {
3186
+ goto st8;
3187
+ }
3188
+ case 47: {
3189
+ goto st1;
3190
+ }
3191
+ }
3192
+ {
3193
+ goto st7;
3194
+ }
3195
+ st9:
3196
+ p+= 1;
3197
+ if ( p == pe )
2046
3198
  goto _test_eof9;
2047
- case 9:
2048
- if ( (*p) == 10 )
2049
- goto st1;
2050
- goto st9;
2051
- }
2052
- _test_eof1: cs = 1; goto _test_eof;
2053
- _test_eof10: cs = 10; goto _test_eof;
2054
- _test_eof2: cs = 2; goto _test_eof;
2055
- _test_eof3: cs = 3; goto _test_eof;
2056
- _test_eof4: cs = 4; goto _test_eof;
2057
- _test_eof5: cs = 5; goto _test_eof;
2058
- _test_eof6: cs = 6; goto _test_eof;
2059
- _test_eof7: cs = 7; goto _test_eof;
2060
- _test_eof8: cs = 8; goto _test_eof;
2061
- _test_eof9: cs = 9; goto _test_eof;
2062
-
2063
- _test_eof: {}
2064
- _out: {}
3199
+ st_case_9:
3200
+ if ( ( (*( p))) == 10 ) {
3201
+ goto st1;
3202
+ }
3203
+ {
3204
+ goto st9;
3205
+ }
3206
+ st_out:
3207
+ _test_eof1: cs = 1; goto _test_eof;
3208
+ _test_eof10: cs = 10; goto _test_eof;
3209
+ _test_eof2: cs = 2; goto _test_eof;
3210
+ _test_eof3: cs = 3; goto _test_eof;
3211
+ _test_eof4: cs = 4; goto _test_eof;
3212
+ _test_eof5: cs = 5; goto _test_eof;
3213
+ _test_eof6: cs = 6; goto _test_eof;
3214
+ _test_eof7: cs = 7; goto _test_eof;
3215
+ _test_eof8: cs = 8; goto _test_eof;
3216
+ _test_eof9: cs = 9; goto _test_eof;
3217
+
3218
+ _test_eof: {}
3219
+ _out: {}
3220
+ }
3221
+
3222
+ #line 854 "parser.rl"
3223
+
3224
+
3225
+ if (cs >= JSON_first_final && p == pe) {
3226
+ return result;
3227
+ } else {
3228
+ rb_enc_raise(EXC_ENCODING eParserError, "%u: unexpected token at '%s'", __LINE__, p);
3229
+ return Qnil;
2065
3230
  }
2066
-
2067
- #line 791 "parser.rl"
2068
-
2069
- if (cs >= JSON_quirks_mode_first_final && p == pe) {
2070
- return result;
2071
- } else {
2072
- rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p);
2073
- return Qnil;
2074
- }
2075
3231
  }
2076
3232
 
2077
- /*
2078
- * call-seq: parse()
2079
- *
2080
- * Parses the current JSON text _source_ and returns the complete data
2081
- * structure as a result.
2082
- */
2083
- static VALUE cParser_parse(VALUE self)
3233
+ static void JSON_mark(void *ptr)
2084
3234
  {
2085
- GET_PARSER;
2086
-
2087
- if (json->quirks_mode) {
2088
- return cParser_parse_quirks_mode(self);
2089
- } else {
2090
- return cParser_parse_strict(self);
2091
- }
3235
+ JSON_Parser *json = ptr;
3236
+ rb_gc_mark_maybe(json->Vsource);
3237
+ rb_gc_mark_maybe(json->create_id);
3238
+ rb_gc_mark_maybe(json->object_class);
3239
+ rb_gc_mark_maybe(json->array_class);
3240
+ rb_gc_mark_maybe(json->decimal_class);
3241
+ rb_gc_mark_maybe(json->match_string);
2092
3242
  }
2093
3243
 
2094
-
2095
- static JSON_Parser *JSON_allocate()
3244
+ static void JSON_free(void *ptr)
2096
3245
  {
2097
- JSON_Parser *json = ALLOC(JSON_Parser);
2098
- MEMZERO(json, JSON_Parser, 1);
2099
- json->fbuffer = fbuffer_alloc(0);
2100
- return json;
3246
+ JSON_Parser *json = ptr;
3247
+ fbuffer_free(json->fbuffer);
3248
+ ruby_xfree(json);
2101
3249
  }
2102
3250
 
2103
- static void JSON_mark(JSON_Parser *json)
3251
+ static size_t JSON_memsize(const void *ptr)
2104
3252
  {
2105
- rb_gc_mark_maybe(json->Vsource);
2106
- rb_gc_mark_maybe(json->create_id);
2107
- rb_gc_mark_maybe(json->object_class);
2108
- rb_gc_mark_maybe(json->array_class);
2109
- rb_gc_mark_maybe(json->match_string);
3253
+ const JSON_Parser *json = ptr;
3254
+ return sizeof(*json) + FBUFFER_CAPA(json->fbuffer);
2110
3255
  }
2111
3256
 
2112
- static void JSON_free(JSON_Parser *json)
2113
- {
2114
- fbuffer_free(json->fbuffer);
2115
- ruby_xfree(json);
2116
- }
3257
+ #ifdef NEW_TYPEDDATA_WRAPPER
3258
+ static const rb_data_type_t JSON_Parser_type = {
3259
+ "JSON/Parser",
3260
+ {JSON_mark, JSON_free, JSON_memsize,},
3261
+ #ifdef RUBY_TYPED_FREE_IMMEDIATELY
3262
+ 0, 0,
3263
+ RUBY_TYPED_FREE_IMMEDIATELY,
3264
+ #endif
3265
+ };
3266
+ #endif
2117
3267
 
2118
3268
  static VALUE cJSON_parser_s_allocate(VALUE klass)
2119
3269
  {
2120
- JSON_Parser *json = JSON_allocate();
2121
- return Data_Wrap_Struct(klass, JSON_mark, JSON_free, json);
3270
+ JSON_Parser *json;
3271
+ VALUE obj = TypedData_Make_Struct(klass, JSON_Parser, &JSON_Parser_type, json);
3272
+ json->fbuffer = fbuffer_alloc(0);
3273
+ return obj;
2122
3274
  }
2123
3275
 
2124
3276
  /*
2125
- * call-seq: source()
2126
- *
2127
- * Returns a copy of the current _source_ string, that was used to construct
2128
- * this Parser.
2129
- */
3277
+ * call-seq: source()
3278
+ *
3279
+ * Returns a copy of the current _source_ string, that was used to construct
3280
+ * this Parser.
3281
+ */
2130
3282
  static VALUE cParser_source(VALUE self)
2131
3283
  {
2132
- GET_PARSER;
2133
- return rb_str_dup(json->Vsource);
3284
+ GET_PARSER;
3285
+ return rb_str_dup(json->Vsource);
2134
3286
  }
2135
3287
 
2136
- /*
2137
- * call-seq: quirks_mode?()
2138
- *
2139
- * Returns a true, if this parser is in quirks_mode, false otherwise.
2140
- */
2141
- static VALUE cParser_quirks_mode_p(VALUE self)
3288
+ void Init_parser(void)
2142
3289
  {
2143
- GET_PARSER;
2144
- return json->quirks_mode ? Qtrue : Qfalse;
2145
- }
2146
-
2147
-
2148
- void Init_parser()
2149
- {
2150
- rb_require("json/common");
2151
- mJSON = rb_define_module("JSON");
2152
- mExt = rb_define_module_under(mJSON, "Ext");
2153
- cParser = rb_define_class_under(mExt, "Parser", rb_cObject);
2154
- eParserError = rb_path2class("JSON::ParserError");
2155
- eNestingError = rb_path2class("JSON::NestingError");
2156
- rb_define_alloc_func(cParser, cJSON_parser_s_allocate);
2157
- rb_define_method(cParser, "initialize", cParser_initialize, -1);
2158
- rb_define_method(cParser, "parse", cParser_parse, 0);
2159
- rb_define_method(cParser, "source", cParser_source, 0);
2160
- rb_define_method(cParser, "quirks_mode?", cParser_quirks_mode_p, 0);
2161
-
2162
- CNaN = rb_const_get(mJSON, rb_intern("NaN"));
2163
- CInfinity = rb_const_get(mJSON, rb_intern("Infinity"));
2164
- CMinusInfinity = rb_const_get(mJSON, rb_intern("MinusInfinity"));
2165
-
2166
- i_json_creatable_p = rb_intern("json_creatable?");
2167
- i_json_create = rb_intern("json_create");
2168
- i_create_id = rb_intern("create_id");
2169
- i_create_additions = rb_intern("create_additions");
2170
- i_chr = rb_intern("chr");
2171
- i_max_nesting = rb_intern("max_nesting");
2172
- i_allow_nan = rb_intern("allow_nan");
2173
- i_symbolize_names = rb_intern("symbolize_names");
2174
- i_quirks_mode = rb_intern("quirks_mode");
2175
- i_object_class = rb_intern("object_class");
2176
- i_array_class = rb_intern("array_class");
2177
- i_match = rb_intern("match");
2178
- i_match_string = rb_intern("match_string");
2179
- i_key_p = rb_intern("key?");
2180
- i_deep_const_get = rb_intern("deep_const_get");
2181
- i_aset = rb_intern("[]=");
2182
- i_aref = rb_intern("[]");
2183
- i_leftshift = rb_intern("<<");
2184
- #ifdef HAVE_RUBY_ENCODING_H
2185
- CEncoding_UTF_8 = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-8"));
2186
- CEncoding_UTF_16BE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-16be"));
2187
- CEncoding_UTF_16LE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-16le"));
2188
- CEncoding_UTF_32BE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-32be"));
2189
- CEncoding_UTF_32LE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-32le"));
2190
- CEncoding_ASCII_8BIT = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("ascii-8bit"));
2191
- i_encoding = rb_intern("encoding");
2192
- i_encode = rb_intern("encode");
2193
- #else
2194
- i_iconv = rb_intern("iconv");
2195
- #endif
3290
+ #ifdef HAVE_RB_EXT_RACTOR_SAFE
3291
+ rb_ext_ractor_safe(true);
3292
+ #endif
3293
+
3294
+ #undef rb_intern
3295
+ rb_require("json/common");
3296
+ mJSON = rb_define_module("JSON");
3297
+ mExt = rb_define_module_under(mJSON, "Ext");
3298
+ cParser = rb_define_class_under(mExt, "Parser", rb_cObject);
3299
+ eParserError = rb_path2class("JSON::ParserError");
3300
+ eNestingError = rb_path2class("JSON::NestingError");
3301
+ rb_gc_register_mark_object(eParserError);
3302
+ rb_gc_register_mark_object(eNestingError);
3303
+ rb_define_alloc_func(cParser, cJSON_parser_s_allocate);
3304
+ rb_define_method(cParser, "initialize", cParser_initialize, -1);
3305
+ rb_define_method(cParser, "parse", cParser_parse, 0);
3306
+ rb_define_method(cParser, "source", cParser_source, 0);
3307
+
3308
+ CNaN = rb_const_get(mJSON, rb_intern("NaN"));
3309
+ rb_gc_register_mark_object(CNaN);
3310
+
3311
+ CInfinity = rb_const_get(mJSON, rb_intern("Infinity"));
3312
+ rb_gc_register_mark_object(CInfinity);
3313
+
3314
+ CMinusInfinity = rb_const_get(mJSON, rb_intern("MinusInfinity"));
3315
+ rb_gc_register_mark_object(CMinusInfinity);
3316
+
3317
+ i_json_creatable_p = rb_intern("json_creatable?");
3318
+ i_json_create = rb_intern("json_create");
3319
+ i_create_id = rb_intern("create_id");
3320
+ i_create_additions = rb_intern("create_additions");
3321
+ i_chr = rb_intern("chr");
3322
+ i_max_nesting = rb_intern("max_nesting");
3323
+ i_allow_nan = rb_intern("allow_nan");
3324
+ i_symbolize_names = rb_intern("symbolize_names");
3325
+ i_object_class = rb_intern("object_class");
3326
+ i_array_class = rb_intern("array_class");
3327
+ i_decimal_class = rb_intern("decimal_class");
3328
+ i_match = rb_intern("match");
3329
+ i_match_string = rb_intern("match_string");
3330
+ i_key_p = rb_intern("key?");
3331
+ i_deep_const_get = rb_intern("deep_const_get");
3332
+ i_aset = rb_intern("[]=");
3333
+ i_aref = rb_intern("[]");
3334
+ i_leftshift = rb_intern("<<");
3335
+ i_new = rb_intern("new");
3336
+ i_try_convert = rb_intern("try_convert");
3337
+ i_freeze = rb_intern("freeze");
3338
+ i_uminus = rb_intern("-@");
2196
3339
  }
2197
3340
 
2198
3341
  /*
2199
- * Local variables:
2200
- * mode: c
2201
- * c-file-style: ruby
2202
- * indent-tabs-mode: nil
2203
- * End:
2204
- */
3342
+ * Local variables:
3343
+ * mode: c
3344
+ * c-file-style: ruby
3345
+ * indent-tabs-mode: nil
3346
+ * End:
3347
+ */