@samitouri / QOSamiQemu / commits / e8f8abcba1

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>

Paolo Bonzini committed Jun 26, 2026 at 12:17 UTC e8f8abcba14eecaf642f809e6ccf24feb547d6c7
2 files changed +5 -8
include/qobject/json-parser.h
+1 -1
@@ -29,8 +29,8 @@ typedef struct JSONParserContext {
29 typedef struct JSONMessageParser {
30 void (*emit)(void *opaque, QObject *json, Error *err);
31 void *opaque;
32 - va_list *ap;
32 JSONLexer lexer;
33 + JSONParserContext parser;
34 int brace_count;
35 int bracket_count;
36 GQueue tokens;
qobject/json-streamer.c
+4 -7
@@ -32,7 +32,6 @@ void json_message_process_token(JSONLexer *lexer, GString *input,
32 JSONTokenType type, int x, int y)
33 {
34 JSONMessageParser *parser = container_of(lexer, JSONMessageParser, lexer);
35 - JSONParserContext ctxt;
35 QObject *json = NULL;
36 Error *err = NULL;
37 JSONToken *token;
@@ -90,21 +89,18 @@ void json_message_process_token(JSONLexer *lexer, GString *input,
89 return;
90 }
91
93 - json_parser_init(&ctxt, parser->ap);
94 -
92 /* Process all tokens in the queue */
93 while (!g_queue_is_empty(&parser->tokens)) {
94 token = g_queue_pop_head(&parser->tokens);
98 - json = json_parser_feed(&ctxt, token, &err);
95 + json = json_parser_feed(&parser->parser, token, &err);
96 g_free(token);
97 if (json || err) {
98 break;
99 }
100 }
101
105 - json_parser_destroy(&ctxt);
106 -
102 out_emit:
103 + json_parser_reset(&parser->parser);
104 parser->brace_count = 0;
105 parser->bracket_count = 0;
106 json_message_free_tokens(parser);
@@ -119,12 +115,12 @@ void json_message_parser_init(JSONMessageParser *parser,
115 {
116 parser->emit = emit;
117 parser->opaque = opaque;
122 - parser->ap = ap;
118 parser->brace_count = 0;
119 parser->bracket_count = 0;
120 g_queue_init(&parser->tokens);
121 parser->token_size = 0;
122
123 + json_parser_init(&parser->parser, ap);
124 json_lexer_init(&parser->lexer, !!ap);
125 }
126
@@ -144,4 +140,5 @@ void json_message_parser_destroy(JSONMessageParser *parser)
140 {
141 json_lexer_destroy(&parser->lexer);
142 json_message_free_tokens(parser);
143 + json_parser_destroy(&parser->parser);
144 }