diff options
| author | Paolo Bonzini <pbonzini@redhat.com> | 2026-06-26 12:17:25 +0200 |
|---|---|---|
| committer | Markus Armbruster <armbru@redhat.com> | 2026-07-02 13:55:41 +0200 |
| commit | 55320a29833f2884d304ee8da8fb372ad86b9a4f (patch) | |
| tree | 7e706e7559fe836ab3fe164ed7668563eee5a20a | |
| parent | ddd1f36f81120fc24a5b737f9ac4a00ae948e250 (diff) | |
| download | qemu-55320a29833f2884d304ee8da8fb372ad86b9a4f.tar.gz qemu-55320a29833f2884d304ee8da8fb372ad86b9a4f.zip | |
json-streamer: do not heap-allocate JSONToken
This is not needed with a push parser. Since it processes tokens
immediately, the JSONToken can be created directly on the stack
and does not need to copy the lexer's string data.
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-ID: <20260626101727.1727389-6-pbonzini@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
| -rw-r--r-- | qobject/json-parser-int.h | 8 | ||||
| -rw-r--r-- | qobject/json-parser.c | 18 | ||||
| -rw-r--r-- | qobject/json-streamer.c | 9 |
3 files changed, 13 insertions, 22 deletions
diff --git a/qobject/json-parser-int.h b/qobject/json-parser-int.h index 1f435cb8eb..5a6b5c9af9 100644 --- a/qobject/json-parser-int.h +++ b/qobject/json-parser-int.h @@ -35,7 +35,12 @@ typedef enum json_token_type { JSON_MAX = JSON_END_OF_INPUT } JSONTokenType; -typedef struct JSONToken JSONToken; +typedef struct JSONToken { + JSONTokenType type; + int x; + int y; + char *str; +} JSONToken; /* json-lexer.c */ void json_lexer_init(JSONLexer *lexer, bool enable_interpolation); @@ -48,7 +53,6 @@ void json_message_process_token(JSONLexer *lexer, GString *input, JSONTokenType type, int x, int y); /* json-parser.c */ -JSONToken *json_token(JSONTokenType type, int x, int y, GString *tokstr); void json_parser_init(JSONParserContext *ctxt, va_list *ap); void json_parser_reset(JSONParserContext *ctxt); QObject *json_parser_feed(JSONParserContext *ctxt, const JSONToken *token, Error **errp); diff --git a/qobject/json-parser.c b/qobject/json-parser.c index 79a2989e7a..0dcc94fefd 100644 --- a/qobject/json-parser.c +++ b/qobject/json-parser.c @@ -24,13 +24,6 @@ #include "qobject/qstring.h" #include "json-parser-int.h" -struct JSONToken { - JSONTokenType type; - int x; - int y; - char str[]; -}; - /* * The JSON parser is a push parser, returning a completed top-level * object, an error, or NULL (if the object is incomplete and no error @@ -624,17 +617,6 @@ static QObject *parse_token(JSONParserContext *ctxt, const JSONToken *token) return NULL; } -JSONToken *json_token(JSONTokenType type, int x, int y, GString *tokstr) -{ - JSONToken *token = g_malloc(sizeof(JSONToken) + tokstr->len + 1); - - token->type = type; - memcpy(token->str, tokstr->str, tokstr->len); - token->str[tokstr->len] = 0; - token->x = x; - token->y = y; - return token; -} void json_parser_reset(JSONParserContext *ctxt) { diff --git a/qobject/json-streamer.c b/qobject/json-streamer.c index 48c5506771..b634bbe99c 100644 --- a/qobject/json-streamer.c +++ b/qobject/json-streamer.c @@ -78,8 +78,13 @@ void json_message_process_token(JSONLexer *lexer, GString *input, } else if (parser->bracket_count + parser->brace_count > MAX_NESTING) { error_setg(&err, "JSON nesting depth limit exceeded"); } else { - g_autofree JSONToken *token = json_token(type, x, y, input); - QObject *json = json_parser_feed(&parser->parser, token, &err); + JSONToken token = (JSONToken) { + .type = type, + .x = x, + .y = y, + .str = input->str + }; + QObject *json = json_parser_feed(&parser->parser, &token, &err); if (json) { parser->emit(parser->opaque, json, NULL); } |
