json 1.8.6 → 2.6.2

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