diff options
| author | Paolo Bonzini <pbonzini@redhat.com> | 2026-06-26 12:17:22 +0200 |
|---|---|---|
| committer | Markus Armbruster <armbru@redhat.com> | 2026-07-02 13:50:13 +0200 |
| commit | e8f8abcba14eecaf642f809e6ccf24feb547d6c7 (patch) | |
| tree | 752b24b099ea9388d0ae73673608a48c173a97b9 | |
| parent | 3b2f714e4a17d42b75d92422b191ab095cbf7c6b (diff) | |
| download | qemu-e8f8abcba14eecaf642f809e6ccf24feb547d6c7.tar.gz qemu-e8f8abcba14eecaf642f809e6ccf24feb547d6c7.zip | |
json-streamer: reuse parser
The push parser can be reset, so reuse it when the json-streamer
detects a completed toplevel object.
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-ID: <20260626101727.1727389-3-pbonzini@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
| -rw-r--r-- | include/qobject/json-parser.h | 2 | ||||
| -rw-r--r-- | 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 05346fa816..4c3d89f751 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 6c93e6fd78..6c4f99b3e7 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,21 +89,18 @@ 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: + json_parser_reset(&parser->parser); parser->brace_count = 0; parser->bracket_count = 0; json_message_free_tokens(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); } |
