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.


Reply via email to