[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 49/56] json: Streamline json_message_process_tok
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH 49/56] json: Streamline json_message_process_token() |
Date: |
Thu, 16 Aug 2018 17:42:32 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) |
Eric Blake <address@hidden> writes:
> On 08/08/2018 07:03 AM, Markus Armbruster wrote:
>> Signed-off-by: Markus Armbruster <address@hidden>
>> ---
>> qobject/json-streamer.c | 13 +++++--------
>> 1 file changed, 5 insertions(+), 8 deletions(-)
>>
>> diff --git a/qobject/json-streamer.c b/qobject/json-streamer.c
>> index 810aae521f..954bf9d468 100644
>> --- a/qobject/json-streamer.c
>> +++ b/qobject/json-streamer.c
>> @@ -99,16 +99,13 @@ void json_message_process_token(JSONLexer *lexer,
>> GString *input,
>> g_queue_push_tail(parser->tokens, token);
>> - if (parser->brace_count < 0 ||
>> - parser->bracket_count < 0 ||
>
> Old: if we are unbalanced (more right tokens read than left)...
>
>> - (parser->brace_count == 0 &&
>> - parser->bracket_count == 0)) {
>
> ...or if we uniformly ended nesting,...
>
>> - json = json_parser_parse(parser->tokens, parser->ap, &err);
>
> ...then parse (to either diagnose the unbalance, or to see if the
> balanced construct is valid), with weird flow control that skips over
> an early return.
>
> Or put another way, if we invert the condition, we find the cases
> where we want an early return instead of parsing (and can thus use
> that to get rid of an unsightly goto over a single early return).
>
> Applying deMorgan's rules:
>
> !(brace < 0 || bracket < 0 || (brace == 0 && bracket == 0))
> !(brace < 0) && !(bracket < 0) && !(brace == 0 && bracket == 0)
> brace >= 0 && bracket >= 0 && (!(brace == 0) || !(bracket == 0))
> brace >= 0 && bracket >= 0 && (brace != 0 || bracket != 0)
>
> But based on what we learned in the first two conjunctions, we can
> rewrite the third:
>
> brace >= 0 && bracket >= 0 && (brace > 0 || bracket > 0)
>
> and then commute the logic:
>
> (brace > 0 || bracket > 0) && brace >= 0 && bracket >= 0
>
>> - parser->tokens = NULL;
>> - goto out_emit;
>> + if ((parser->brace_count > 0 || parser->bracket_count > 0)
>> + && parser->bracket_count >= 0 && parser->bracket_count >= 0) {
>
> So the new condition is correct, and reads as:
>
> If either struct is still awaiting closure, and both structs have not
> gone unbalanced, then early exit.
>
> It was not intuitive, but stepping through the logic shows it is identical.
My first version had a "simpler" condition there. My test cases proved
it wrong %-}
> Reviewed-by: Eric Blake <address@hidden>
Thanks!
- [Qemu-devel] [PATCH 04/56] qmp-cmd-test: Split off qmp-test, (continued)
- [Qemu-devel] [PATCH 04/56] qmp-cmd-test: Split off qmp-test, Markus Armbruster, 2018/08/08
- [Qemu-devel] [PATCH 39/56] json: Leave rejecting invalid interpolation to parser, Markus Armbruster, 2018/08/08
- [Qemu-devel] [PATCH 46/56] json: Assert json_parser_parse() consumes all tokens on success, Markus Armbruster, 2018/08/08
- [Qemu-devel] [PATCH 49/56] json: Streamline json_message_process_token(), Markus Armbruster, 2018/08/08
- [Qemu-devel] [PATCH 56/56] docs/interop/qmp-spec: How to force known good parser state, Markus Armbruster, 2018/08/08
[Qemu-devel] [PATCH 55/56] json: Clean up headers, Markus Armbruster, 2018/08/08
[Qemu-devel] [PATCH 47/56] qjson: Have qobject_from_json() & friends reject empty and blank, Markus Armbruster, 2018/08/08