summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2023-01-11 23:07:19 -0500
committerMatthias Clasen <mclasen@redhat.com>2023-01-12 00:11:46 -0500
commitd43e0fb9a72b411550cc4b937f63b89dc0cb74f3 (patch)
tree43616963351bd5391f29ac6710121828c70f89d6
parent6fb6f47fc8018aa6f525b2dfc117ab10be94363c (diff)
downloadgtk+-d43e0fb9a72b411550cc4b937f63b89dc0cb74f3.tar.gz
css: Avoid allocation for tokens
All valid dimensions are short, so store the dimension inside the token.
-rw-r--r--gtk/css/gtkcsstokenizer.c22
-rw-r--r--gtk/css/gtkcsstokenizerprivate.h2
2 files changed, 15 insertions, 9 deletions
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 {