css: Avoid allocation for tokens
authorMatthias Clasen <mclasen@redhat.com>
Thu, 12 Jan 2023 04:07:19 +0000 (23:07 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 12 Jan 2023 05:11:46 +0000 (00:11 -0500)
All valid dimensions are short, so store
the dimension inside the token.

gtk/css/gtkcsstokenizer.c
gtk/css/gtkcsstokenizerprivate.h

index 2652b0e9943a2eec1500a2c1508422f8a4d01d61..9cf59e1559dda58e7bf667eea46db8fc51a366c5 100644 (file)
@@ -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 == '%')
     {
index 6211ef722fff6359e9d481cda50126f797ba39fe..6f97bd904ef54699154afb23e61f2c6994a37aaa 100644 (file)
@@ -97,7 +97,7 @@ struct _GtkCssNumberToken {
 struct _GtkCssDimensionToken {
   GtkCssTokenType  type;
   double           value;
-  char            *dimension;
+  char             dimension[8];
 };
 
 union _GtkCssToken {