@@ -1892,11 +1892,36 @@ class GenericReader {
1892
1892
1893
1893
template <unsigned parseFlags, typename InputStream, typename Handler>
1894
1894
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)
1898
1915
break ;
1916
+
1917
+ SkipWhitespaceAndComments<parseFlags>(is);
1918
+ RAPIDJSON_PARSE_ERROR_EARLY_RETURN (parseResult_);
1899
1919
}
1920
+
1921
+ // Handle the end of file.
1922
+ if (state != IterativeParsingFinishState)
1923
+ HandleError (state, is);
1924
+
1900
1925
return parseResult_;
1901
1926
}
1902
1927
0 commit comments