Paolo Bonzini <[email protected]> writes:
> The push parser can be reset, so reuse it when the json-streamer
> detects a completed toplevel object.
>
> Signed-off-by: Paolo Bonzini <[email protected]>
> ---
> include/qobject/json-parser.h | 2 +-
> qobject/json-streamer.c | 11 ++++-------
> 2 files changed, 5 insertions(+), 8 deletions(-)
>
> diff --git a/include/qobject/json-parser.h b/include/qobject/json-parser.h
> index 05346fa816b..4c3d89f751f 100644
> --- a/include/qobject/json-parser.h
> +++ b/include/qobject/json-parser.h
> @@ -29,8 +29,8 @@ typedef struct JSONParserContext {
> typedef struct JSONMessageParser {
> void (*emit)(void *opaque, QObject *json, Error *err);
> void *opaque;
> - va_list *ap;
> JSONLexer lexer;
> + JSONParserContext parser;
> int brace_count;
> int bracket_count;
> GQueue tokens;
> diff --git a/qobject/json-streamer.c b/qobject/json-streamer.c
> index 6c93e6fd78d..f3dfdcaea12 100644
> --- a/qobject/json-streamer.c
> +++ b/qobject/json-streamer.c
> @@ -32,7 +32,6 @@ void json_message_process_token(JSONLexer *lexer, GString
> *input,
> JSONTokenType type, int x, int y)
> {
> JSONMessageParser *parser = container_of(lexer, JSONMessageParser,
> lexer);
> - JSONParserContext ctxt;
> QObject *json = NULL;
> Error *err = NULL;
> JSONToken *token;
> @@ -90,26 +89,23 @@ void json_message_process_token(JSONLexer *lexer, GString
> *input,
> return;
> }
>
> - json_parser_init(&ctxt, parser->ap);
> -
> /* Process all tokens in the queue */
> while (!g_queue_is_empty(&parser->tokens)) {
> token = g_queue_pop_head(&parser->tokens);
> - json = json_parser_feed(&ctxt, token, &err);
> + json = json_parser_feed(&parser->parser, token, &err);
> g_free(token);
> if (json || err) {
> break;
> }
> }
>
> - json_parser_destroy(&ctxt);
> -
> out_emit:
> parser->brace_count = 0;
> parser->bracket_count = 0;
> json_message_free_tokens(parser);
> parser->token_size = 0;
> parser->emit(parser->opaque, json, err);
> + json_parser_reset(&parser->parser);
> }
This made me stop and think.
I figure the more obvious *delta* would be to json_parser_reset() right
where json_parser_destroy() was.
But putting it here makes the code more obviously correct, I think.
No objection. A hint in the commit message could've saved me a minute
or two.
>
> void json_message_parser_init(JSONMessageParser *parser,
> @@ -119,12 +115,12 @@ void json_message_parser_init(JSONMessageParser *parser,
> {
> parser->emit = emit;
> parser->opaque = opaque;
> - parser->ap = ap;
> parser->brace_count = 0;
> parser->bracket_count = 0;
> g_queue_init(&parser->tokens);
> parser->token_size = 0;
>
> + json_parser_init(&parser->parser, ap);
> json_lexer_init(&parser->lexer, !!ap);
> }
>
> @@ -144,4 +140,5 @@ void json_message_parser_destroy(JSONMessageParser
> *parser)
> {
> json_lexer_destroy(&parser->lexer);
> json_message_free_tokens(parser);
> + json_parser_destroy(&parser->parser);
> }
Reviewed-by: Markus Armbruster <[email protected]>