json 2.4.1 → 2.6.1

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