From: Matthias Clasen Date: Thu, 12 Jan 2023 04:07:19 +0000 (-0500) Subject: css: Avoid allocation for tokens X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~8^2~71^2~3 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=d43e0fb9a72b411550cc4b937f63b89dc0cb74f3;p=gtk4.git css: Avoid allocation for tokens All valid dimensions are short, so store the dimension inside the token. --- diff --git a/gtk/css/gtkcsstokenizer.c b/gtk/css/gtkcsstokenizer.c index 2652b0e994..9cf59e1559 100644 --- a/gtk/css/gtkcsstokenizer.c +++ b/gtk/css/gtkcsstokenizer.c @@ -57,11 +57,6 @@ gtk_css_token_clear (GtkCssToken *token) case GTK_CSS_TOKEN_SIGNLESS_INTEGER_DIMENSION: case GTK_CSS_TOKEN_SIGNED_DIMENSION: case GTK_CSS_TOKEN_SIGNLESS_DIMENSION: - g_free (token->dimension.dimension); - break; - - default: - g_assert_not_reached (); case GTK_CSS_TOKEN_EOF: case GTK_CSS_TOKEN_WHITESPACE: case GTK_CSS_TOKEN_OPEN_PARENS: @@ -91,6 +86,9 @@ gtk_css_token_clear (GtkCssToken *token) case GTK_CSS_TOKEN_BAD_URL: case GTK_CSS_TOKEN_COMMENT: break; + + default: + g_assert_not_reached (); } token->type = GTK_CSS_TOKEN_EOF; @@ -545,7 +543,8 @@ static void gtk_css_token_init_dimension (GtkCssToken *token, GtkCssTokenType type, double value, - char *dimension) + const char *dimension, + int len) { token->type = type; @@ -556,7 +555,13 @@ gtk_css_token_init_dimension (GtkCssToken *token, case GTK_CSS_TOKEN_SIGNED_DIMENSION: case GTK_CSS_TOKEN_SIGNLESS_DIMENSION: token->dimension.value = value; - token->dimension.dimension = dimension; + for (int i = 0; i < MIN (8, len); i++) + { + token->dimension.dimension[i] = dimension[i]; + if (dimension[i] == 0) + break; + } + token->dimension.dimension[7] = 0; break; default: g_assert_not_reached (); @@ -1129,7 +1134,8 @@ gtk_css_tokenizer_read_numeric (GtkCssTokenizer *tokenizer, else type = has_sign ? GTK_CSS_TOKEN_SIGNED_DIMENSION : GTK_CSS_TOKEN_SIGNLESS_DIMENSION; - gtk_css_token_init_dimension (token, type, value, gtk_css_tokenizer_read_name (tokenizer)); + char *name = gtk_css_tokenizer_read_name (tokenizer); + gtk_css_token_init_dimension (token, type, value, name, strlen (name)); } else if (gtk_css_tokenizer_remaining (tokenizer) > 0 && *tokenizer->data == '%') { diff --git a/gtk/css/gtkcsstokenizerprivate.h b/gtk/css/gtkcsstokenizerprivate.h index 6211ef722f..6f97bd904e 100644 --- a/gtk/css/gtkcsstokenizerprivate.h +++ b/gtk/css/gtkcsstokenizerprivate.h @@ -97,7 +97,7 @@ struct _GtkCssNumberToken { struct _GtkCssDimensionToken { GtkCssTokenType type; double value; - char *dimension; + char dimension[8]; }; union _GtkCssToken {