summaryrefslogtreecommitdiff
path: root/qobject
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2026-06-26 12:17:22 +0200
committerMarkus Armbruster <armbru@redhat.com>2026-07-02 13:50:13 +0200
commite8f8abcba14eecaf642f809e6ccf24feb547d6c7 (patch)
tree752b24b099ea9388d0ae73673608a48c173a97b9 /qobject
parent3b2f714e4a17d42b75d92422b191ab095cbf7c6b (diff)
downloadqemu-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>
Diffstat (limited to 'qobject')
-rw-r--r--qobject/json-streamer.c11
1 files changed, 4 insertions, 7 deletions
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);
}