Paolo Bonzini <[email protected]> writes:
> On Tue, Feb 10, 2026 at 2:06 PM Markus Armbruster <[email protected]> wrote:
>>
>> Paolo Bonzini <[email protected]> writes:
>> > Still
>> > the difference in error reporting matters, because it gives feedback that
>> > is immediately useful, rather than possibly delayed forever.
>>
>> Reporting parse errors immediately is such a lovely quality of life
>> improvement. May I have that without regressing error recovery?
>
> If it is a regression, of course.
>
> Especially the one for ^L, which needs a testcase.
I totally should've added one when I documented the technique back in
2018.
> Something like this
> should do:
>
> diff --git a/qobject/json-streamer.c b/qobject/json-streamer.c
> index f6380684897..287a345b49a 100644
> --- a/qobject/json-streamer.c
> +++ b/qobject/json-streamer.c
> @@ -35,17 +35,25 @@
> parser->brace_count++;
> break;
> case JSON_RCURLY:
> - if (parser->brace_count > 0) {
> - parser->brace_count--;
> + if (parser->brace_count <= 0) {
> + goto end_error_recovery;
> }
> + parser->brace_count--;
> break;
> case JSON_LSQUARE:
> parser->bracket_count++;
> break;
> case JSON_RSQUARE:
> - if (parser->bracket_count > 0) {
> - parser->bracket_count--;
> + if (parser->bracket_count <= 0) {
> + goto end_error_recovery;
> }
> + parser->bracket_count--;
> + break;
> + case JSON_ERROR:
> + end_error_recovery:
> + parser->brace_count = 0;
> + parser->bracket_count = 0;
> break;
> default:
> break;
Passes a quick smoke test!
Fine print: different errors can get reported, but that's probably a
slight improvement.