Paolo Bonzini <[email protected]> writes:

> 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.
>
> Signed-off-by: Paolo Bonzini <[email protected]>
> ---
>  qobject/json-parser-int.h |  8 ++++++--
>  qobject/json-parser.c     | 18 ------------------
>  qobject/json-streamer.c   |  4 ++--
>  3 files changed, 8 insertions(+), 22 deletions(-)
>
> diff --git a/qobject/json-parser-int.h b/qobject/json-parser-int.h
> index 1f435cb8eb2..5a6b5c9af90 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 7abdea4dacb..2fede59842f 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[];
> -};
> -
>  /*
>   * Objects: { } | { members }
>   * - Empty: { -> AFTER_LCURLY -> }
> @@ -529,17 +522,6 @@ static QObject 
> *json_parser_parse_token(JSONParserContext *ctxt, const JSONToken
>      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 a1210128ac1..07e0ef51ce3 100644
> --- a/qobject/json-streamer.c
> +++ b/qobject/json-streamer.c
> @@ -23,7 +23,7 @@ void json_message_process_token(JSONLexer *lexer, GString 
> *input,
>                                  JSONTokenType type, int x, int y)
>  {
>      JSONMessageParser *parser = container_of(lexer, JSONMessageParser, 
> lexer);
> -    g_autofree JSONToken *token = json_token(type, x, y, input);
> +    JSONToken token = (JSONToken) { .type = type, .x = x, .y = y, .str = 
> input->str };

checkpatch points out:

    0004-json-streamer-do-not-heap-allocate-JSONToken.patch:89: WARNING: line 
over 80 characters

Easy enough to avoid.

>      Error *err = NULL;
>  
>      parser->token_size += input->len;
> @@ -64,7 +64,7 @@ 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 {
> -            QObject *json = json_parser_feed(&parser->parser, token, &err);
> +            QObject *json = json_parser_feed(&parser->parser, &token, &err);
>              if (json) {
>                  parser->emit(parser->opaque, json, NULL);
>              }

With the long line tidied up
Reviewed-by: Markus Armbruster <[email protected]>


Reply via email to