Ping. Paolo
Il mer 7 gen 2026, 09:48 Paolo Bonzini <[email protected]> ha scritto: > This rewrites the json-parser to use a push parser aka state machine. > While push parsers are inherently more complex than recursive descent, > the grammar for JSON is simple enough that the parser remains readable. > There is therefore no need to use e.g. QEMU coroutines. > > Unlike the suggestion in commit 62815d85aed ("json: Redesign the callback > to consume JSON values", 2018-08-24), I kept the json-streamer concept. > It helps in handling input limits, it performs error recovery, and it > converts the token-at-a-time push interface to callbacks---all things > that are more easily done in a separate layer to keep the parser clean. > However, there is no need anymore for it to store partial JSON objects > in tokenized form. > > Another benefit is that QEMU can report the first parsing error > immediately, without waiting for delimiters to be balanced. > > On top of the benefits intrinsic in the push architecture, it so happens > that it's really easy to add a location to JSON parsing errors now, so > do that as well. > > Paolo > > > Paolo Bonzini (5): > json-parser: pass around lookahead token, constify > json-parser: replace with a push parser > json-streamer: remove token queue > json-streamer: do not heap-allocate JSONToken > json-parser: add location to JSON parsing errors > > include/qobject/json-parser.h | 12 +- > qobject/json-parser-int.h | 13 +- > qobject/json-lexer.c | 11 +- > qobject/json-parser.c | 493 ++++++++++++++++------------------ > qobject/json-streamer.c | 107 ++++---- > 5 files changed, 310 insertions(+), 326 deletions(-) > > -- > 2.52.0 >
