@@ -17,7 +17,12 @@ struct structural_parser : structural_iterator {
17
17
uint32_t depth{0 };
18
18
19
19
template <bool STREAMING, typename T>
20
- WARN_UNUSED static really_inline error_code parse (dom_parser_implementation &dom_parser, T &builder) noexcept ;
20
+ WARN_UNUSED really_inline error_code parse (T &builder) noexcept ;
21
+ template <bool STREAMING, typename T>
22
+ WARN_UNUSED static really_inline error_code parse (dom_parser_implementation &dom_parser, T &builder) noexcept {
23
+ structural_parser parser (dom_parser, STREAMING ? dom_parser.next_structural_index : 0 );
24
+ return parser.parse <STREAMING>(builder);
25
+ }
21
26
22
27
// For non-streaming, to pass an explicit 0 as next_structural, which enables optimizations
23
28
really_inline structural_parser (dom_parser_implementation &_parser, uint32_t start_structural_index)
@@ -102,50 +107,49 @@ struct structural_parser : structural_iterator {
102
107
}; // struct structural_parser
103
108
104
109
template <bool STREAMING, typename T>
105
- WARN_UNUSED really_inline error_code structural_parser::parse (dom_parser_implementation &dom_parser, T &builder) noexcept {
106
- stage2::structural_parser parser (dom_parser, STREAMING ? dom_parser.next_structural_index : 0 );
110
+ WARN_UNUSED really_inline error_code structural_parser::parse (T &builder) noexcept {
107
111
logger::log_start ();
108
112
109
113
//
110
114
// Start the document
111
115
//
112
- if (parser. at_end ()) { return EMPTY; }
113
- SIMDJSON_TRY ( parser. start_document () );
114
- builder.start_document (parser );
116
+ if (at_end ()) { return EMPTY; }
117
+ SIMDJSON_TRY ( start_document () );
118
+ builder.start_document (* this );
115
119
116
120
//
117
121
// Read first value
118
122
//
119
123
{
120
- const uint8_t *value = parser. advance ();
124
+ const uint8_t *value = advance ();
121
125
switch (*value) {
122
126
case ' {' : {
123
- if (parser. empty_object (builder)) { goto document_end; }
124
- SIMDJSON_TRY ( parser. start_object (builder) );
127
+ if (empty_object (builder)) { goto document_end; }
128
+ SIMDJSON_TRY ( start_object (builder) );
125
129
goto object_begin;
126
130
}
127
131
case ' [' : {
128
- if (parser. empty_array (builder)) { goto document_end; }
129
- SIMDJSON_TRY ( parser. start_array (builder) );
132
+ if (empty_array (builder)) { goto document_end; }
133
+ SIMDJSON_TRY ( start_array (builder) );
130
134
// Make sure the outer array is closed before continuing; otherwise, there are ways we could get
131
135
// into memory corruption. See https://github.com/simdjson/simdjson/issues/906
132
136
if (!STREAMING) {
133
- if (parser. buf [dom_parser .structural_indexes [dom_parser .n_structural_indexes - 1 ]] != ' ]' ) {
137
+ if (buf[parser .structural_indexes [parser .n_structural_indexes - 1 ]] != ' ]' ) {
134
138
return TAPE_ERROR;
135
139
}
136
140
}
137
141
goto array_begin;
138
142
}
139
- case ' "' : SIMDJSON_TRY ( builder.parse_string (parser , value) ); goto document_end;
140
- case ' t' : SIMDJSON_TRY ( builder.parse_root_true_atom (parser , value) ); goto document_end;
141
- case ' f' : SIMDJSON_TRY ( builder.parse_root_false_atom (parser , value) ); goto document_end;
142
- case ' n' : SIMDJSON_TRY ( builder.parse_root_null_atom (parser , value) ); goto document_end;
143
+ case ' "' : SIMDJSON_TRY ( builder.parse_string (* this , value) ); goto document_end;
144
+ case ' t' : SIMDJSON_TRY ( builder.parse_root_true_atom (* this , value) ); goto document_end;
145
+ case ' f' : SIMDJSON_TRY ( builder.parse_root_false_atom (* this , value) ); goto document_end;
146
+ case ' n' : SIMDJSON_TRY ( builder.parse_root_null_atom (* this , value) ); goto document_end;
143
147
case ' -' :
144
148
case ' 0' : case ' 1' : case ' 2' : case ' 3' : case ' 4' :
145
149
case ' 5' : case ' 6' : case ' 7' : case ' 8' : case ' 9' :
146
- SIMDJSON_TRY ( builder.parse_root_number (parser , value) ); goto document_end;
150
+ SIMDJSON_TRY ( builder.parse_root_number (* this , value) ); goto document_end;
147
151
default :
148
- parser. log_error (" Document starts with a non-value character" );
152
+ log_error (" Document starts with a non-value character" );
149
153
return TAPE_ERROR;
150
154
}
151
155
}
@@ -154,121 +158,121 @@ WARN_UNUSED really_inline error_code structural_parser::parse(dom_parser_impleme
154
158
// Object parser states
155
159
//
156
160
object_begin: {
157
- const uint8_t *key = parser. advance ();
161
+ const uint8_t *key = advance ();
158
162
if (*key != ' "' ) {
159
- parser. log_error (" Object does not start with a key" );
163
+ log_error (" Object does not start with a key" );
160
164
return TAPE_ERROR;
161
165
}
162
- builder.increment_count (parser );
163
- SIMDJSON_TRY ( builder.parse_key (parser , key) );
166
+ builder.increment_count (* this );
167
+ SIMDJSON_TRY ( builder.parse_key (* this , key) );
164
168
goto object_field;
165
169
} // object_begin:
166
170
167
171
object_field: {
168
- if (unlikely ( parser. advance_char () != ' :' )) { parser. log_error (" Missing colon after key in object" ); return TAPE_ERROR; }
169
- const uint8_t *value = parser. advance ();
172
+ if (unlikely ( advance_char () != ' :' )) { log_error (" Missing colon after key in object" ); return TAPE_ERROR; }
173
+ const uint8_t *value = advance ();
170
174
switch (*value) {
171
175
case ' {' : {
172
- if (parser. empty_object (builder)) { break ; };
173
- SIMDJSON_TRY ( parser. start_object (builder) );
176
+ if (empty_object (builder)) { break ; };
177
+ SIMDJSON_TRY ( start_object (builder) );
174
178
goto object_begin;
175
179
}
176
180
case ' [' : {
177
- if (parser. empty_array (builder)) { break ; };
178
- SIMDJSON_TRY ( parser. start_array (builder) );
181
+ if (empty_array (builder)) { break ; };
182
+ SIMDJSON_TRY ( start_array (builder) );
179
183
goto array_begin;
180
184
}
181
- case ' "' : SIMDJSON_TRY ( builder.parse_string (parser , value) ); break ;
182
- case ' t' : SIMDJSON_TRY ( builder.parse_true_atom (parser , value) ); break ;
183
- case ' f' : SIMDJSON_TRY ( builder.parse_false_atom (parser , value) ); break ;
184
- case ' n' : SIMDJSON_TRY ( builder.parse_null_atom (parser , value) ); break ;
185
+ case ' "' : SIMDJSON_TRY ( builder.parse_string (* this , value) ); break ;
186
+ case ' t' : SIMDJSON_TRY ( builder.parse_true_atom (* this , value) ); break ;
187
+ case ' f' : SIMDJSON_TRY ( builder.parse_false_atom (* this , value) ); break ;
188
+ case ' n' : SIMDJSON_TRY ( builder.parse_null_atom (* this , value) ); break ;
185
189
case ' -' :
186
190
case ' 0' : case ' 1' : case ' 2' : case ' 3' : case ' 4' :
187
191
case ' 5' : case ' 6' : case ' 7' : case ' 8' : case ' 9' :
188
- SIMDJSON_TRY ( builder.parse_number (parser , value) ); break ;
192
+ SIMDJSON_TRY ( builder.parse_number (* this , value) ); break ;
189
193
default :
190
- parser. log_error (" Non-value found when value was expected!" );
194
+ log_error (" Non-value found when value was expected!" );
191
195
return TAPE_ERROR;
192
196
}
193
197
} // object_field:
194
198
195
199
object_continue: {
196
- switch (parser. advance_char ()) {
200
+ switch (advance_char ()) {
197
201
case ' ,' : {
198
- builder.increment_count (parser );
199
- const uint8_t *key = parser. advance ();
200
- if (unlikely ( *key != ' "' )) { parser. log_error (" Key string missing at beginning of field in object" ); return TAPE_ERROR; }
201
- SIMDJSON_TRY ( builder.parse_key (parser , key) );
202
+ builder.increment_count (* this );
203
+ const uint8_t *key = advance ();
204
+ if (unlikely ( *key != ' "' )) { log_error (" Key string missing at beginning of field in object" ); return TAPE_ERROR; }
205
+ SIMDJSON_TRY ( builder.parse_key (* this , key) );
202
206
goto object_field;
203
207
}
204
208
case ' }' :
205
- builder.end_object (parser );
206
- parser. depth --;
209
+ builder.end_object (* this );
210
+ depth--;
207
211
goto scope_end;
208
212
default :
209
- parser. log_error (" No comma between object fields" );
213
+ log_error (" No comma between object fields" );
210
214
return TAPE_ERROR;
211
215
}
212
216
} // object_continue:
213
217
214
218
scope_end: {
215
- if (parser. depth == 0 ) { goto document_end; }
216
- if (parser.parser . is_array [parser. depth ]) { goto array_continue; }
219
+ if (depth == 0 ) { goto document_end; }
220
+ if (parser.is_array [depth]) { goto array_continue; }
217
221
goto object_continue;
218
222
} // scope_end:
219
223
220
224
//
221
225
// Array parser states
222
226
//
223
227
array_begin: {
224
- builder.increment_count (parser );
228
+ builder.increment_count (* this );
225
229
} // array_begin:
226
230
227
231
array_value: {
228
- const uint8_t *value = parser. advance ();
232
+ const uint8_t *value = advance ();
229
233
switch (*value) {
230
234
case ' {' : {
231
- if (parser. empty_object (builder)) { break ; };
232
- SIMDJSON_TRY ( parser. start_object (builder) );
235
+ if (empty_object (builder)) { break ; };
236
+ SIMDJSON_TRY ( start_object (builder) );
233
237
goto object_begin;
234
238
}
235
239
case ' [' : {
236
- if (parser. empty_array (builder)) { break ; };
237
- SIMDJSON_TRY ( parser. start_array (builder) );
240
+ if (empty_array (builder)) { break ; };
241
+ SIMDJSON_TRY ( start_array (builder) );
238
242
goto array_begin;
239
243
}
240
- case ' "' : SIMDJSON_TRY ( builder.parse_string (parser , value) ); break ;
241
- case ' t' : SIMDJSON_TRY ( builder.parse_true_atom (parser , value) ); break ;
242
- case ' f' : SIMDJSON_TRY ( builder.parse_false_atom (parser , value) ); break ;
243
- case ' n' : SIMDJSON_TRY ( builder.parse_null_atom (parser , value) ); break ;
244
+ case ' "' : SIMDJSON_TRY ( builder.parse_string (* this , value) ); break ;
245
+ case ' t' : SIMDJSON_TRY ( builder.parse_true_atom (* this , value) ); break ;
246
+ case ' f' : SIMDJSON_TRY ( builder.parse_false_atom (* this , value) ); break ;
247
+ case ' n' : SIMDJSON_TRY ( builder.parse_null_atom (* this , value) ); break ;
244
248
case ' -' :
245
249
case ' 0' : case ' 1' : case ' 2' : case ' 3' : case ' 4' :
246
250
case ' 5' : case ' 6' : case ' 7' : case ' 8' : case ' 9' :
247
- SIMDJSON_TRY ( builder.parse_number (parser , value) ); break ;
251
+ SIMDJSON_TRY ( builder.parse_number (* this , value) ); break ;
248
252
default :
249
- parser. log_error (" Non-value found when value was expected!" );
253
+ log_error (" Non-value found when value was expected!" );
250
254
return TAPE_ERROR;
251
255
}
252
256
} // array_value:
253
257
254
258
array_continue: {
255
- switch (parser. advance_char ()) {
259
+ switch (advance_char ()) {
256
260
case ' ,' :
257
- builder.increment_count (parser );
261
+ builder.increment_count (* this );
258
262
goto array_value;
259
263
case ' ]' :
260
- builder.end_array (parser );
261
- parser. depth --;
264
+ builder.end_array (* this );
265
+ depth--;
262
266
goto scope_end;
263
267
default :
264
- parser. log_error (" Missing comma between array values" );
268
+ log_error (" Missing comma between array values" );
265
269
return TAPE_ERROR;
266
270
}
267
271
} // array_continue:
268
272
269
273
document_end: {
270
- builder.end_document (parser );
271
- return parser. finish <STREAMING>();
274
+ builder.end_document (* this );
275
+ return finish<STREAMING>();
272
276
} // document_end:
273
277
274
278
} // parse_structurals()
0 commit comments