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
}