Skip to content

Commit 0f8389e

Browse files
committed
Restored original IterativeParse implementation
Runs about 1-2% faster (original speed) by running in a tight loop, at the expense of slight code duplication with IterativeParseNext.
1 parent 488252e commit 0f8389e

File tree

1 file changed

+28
-3
lines changed

1 file changed

+28
-3
lines changed

include/rapidjson/reader.h

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1892,11 +1892,36 @@ class GenericReader {
18921892

18931893
template <unsigned parseFlags, typename InputStream, typename Handler>
18941894
ParseResult IterativeParse(InputStream& is, Handler& handler) {
1895-
IterativeParseInit();
1896-
while (!IterativeParseComplete()) {
1897-
if (!IterativeParseNext<parseFlags>(is, handler))
1895+
parseResult_.Clear();
1896+
ClearStackOnExit scope(*this);
1897+
IterativeParsingState state = IterativeParsingStartState;
1898+
1899+
SkipWhitespaceAndComments<parseFlags>(is);
1900+
RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
1901+
while (is.Peek() != '\0') {
1902+
Token t = Tokenize(is.Peek());
1903+
IterativeParsingState n = Predict(state, t);
1904+
IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);
1905+
1906+
if (d == IterativeParsingErrorState) {
1907+
HandleError(state, is);
1908+
break;
1909+
}
1910+
1911+
state = d;
1912+
1913+
// Do not further consume streams if a root JSON has been parsed.
1914+
if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState)
18981915
break;
1916+
1917+
SkipWhitespaceAndComments<parseFlags>(is);
1918+
RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
18991919
}
1920+
1921+
// Handle the end of file.
1922+
if (state != IterativeParsingFinishState)
1923+
HandleError(state, is);
1924+
19001925
return parseResult_;
19011926
}
19021927

0 commit comments

Comments
 (0)