summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2023-01-12 00:00:54 -0500
committerMatthias Clasen <mclasen@redhat.com>2023-01-12 00:12:09 -0500
commit46e0fde60674da6963e0236ce13844cf2fb64802 (patch)
treedd23854d8f1824a364e2cfb75c33b1dc473f38db
parent1e7f525e0e2ae361d7db9d71b267496de9adf09c (diff)
downloadgtk+-46e0fde60674da6963e0236ce13844cf2fb64802.tar.gz
css: Avoid more allocations for tokens
Make short string tokens static.
-rw-r--r--gdk/gdkrgba.c6
-rw-r--r--gsk/gskrendernodeparser.c6
-rw-r--r--gtk/css/gtkcssparser.c16
-rw-r--r--gtk/css/gtkcsstokenizer.c74
-rw-r--r--gtk/css/gtkcsstokenizerprivate.h15
-rw-r--r--gtk/gtkcsscolorvalue.c2
-rw-r--r--gtk/gtkcssselector.c20
7 files changed, 72 insertions, 67 deletions
diff --git a/gdk/gdkrgba.c b/gdk/gdkrgba.c
index 7732e507c8..9b52204038 100644
--- a/gdk/gdkrgba.c
+++ b/gdk/gdkrgba.c
@@ -586,7 +586,7 @@ gdk_rgba_parser_parse (GtkCssParser *parser,
else if (gtk_css_token_is (token, GTK_CSS_TOKEN_HASH_ID) ||
gtk_css_token_is (token, GTK_CSS_TOKEN_HASH_UNRESTRICTED))
{
- const char *s = token->string.string;
+ const char *s = gtk_css_token_get_string (token);
switch (strlen (s))
{
@@ -637,13 +637,13 @@ gdk_rgba_parser_parse (GtkCssParser *parser,
{
*rgba = (GdkRGBA) { 0, 0, 0, 0 };
}
- else if (gdk_rgba_parse (rgba, token->string.string))
+ else if (gdk_rgba_parse (rgba, gtk_css_token_get_string (token)))
{
/* everything's fine */
}
else
{
- gtk_css_parser_error_syntax (parser, "\"%s\" is not a valid color name.", token->string.string);
+ gtk_css_parser_error_syntax (parser, "\"%s\" is not a valid color name.", gtk_css_token_get_string (token));
return FALSE;
}
diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c
index 25943ec305..68069b477e 100644
--- a/gsk/gskrendernodeparser.c
+++ b/gsk/gskrendernodeparser.c
@@ -418,7 +418,7 @@ parse_string (GtkCssParser *parser,
if (!gtk_css_token_is (token, GTK_CSS_TOKEN_STRING))
return FALSE;
- s = g_strdup (token->string.string);
+ s = g_strdup (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (parser);
g_free (*(char **) out_string);
@@ -931,7 +931,7 @@ parse_declarations (GtkCssParser *parser,
{
if (gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_IDENT))
gtk_css_parser_error_syntax (parser, "No variable named \"%s\"",
- gtk_css_parser_get_token (parser)->string.string);
+ gtk_css_token_get_string (gtk_css_parser_get_token (parser)));
else
gtk_css_parser_error_syntax (parser, "Expected a variable name");
}
@@ -1894,7 +1894,7 @@ parse_node (GtkCssParser *parser,
if (gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_IDENT))
gtk_css_parser_error_value (parser, "\"%s\" is not a valid node name",
- gtk_css_parser_get_token (parser)->string.string);
+ gtk_css_token_get_string (gtk_css_parser_get_token (parser)));
else
gtk_css_parser_error_syntax (parser, "Expected a node name");
diff --git a/gtk/css/gtkcssparser.c b/gtk/css/gtkcssparser.c
index 886e84f952..7b0cbcdaeb 100644
--- a/gtk/css/gtkcssparser.c
+++ b/gtk/css/gtkcssparser.c
@@ -648,7 +648,7 @@ gtk_css_parser_consume_function (GtkCssParser *self,
token = gtk_css_parser_get_token (self);
g_return_val_if_fail (gtk_css_token_is (token, GTK_CSS_TOKEN_FUNCTION), FALSE);
- g_strlcpy (function_name, token->string.string, 64);
+ g_strlcpy (function_name, gtk_css_token_get_string (token), 64);
gtk_css_parser_start_block (self);
arg = 0;
@@ -733,7 +733,7 @@ gtk_css_parser_has_ident (GtkCssParser *self,
token = gtk_css_parser_get_token (self);
return gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT) &&
- g_ascii_strcasecmp (token->string.string, ident) == 0;
+ g_ascii_strcasecmp (gtk_css_token_get_string (token), ident) == 0;
}
gboolean
@@ -765,7 +765,7 @@ gtk_css_parser_has_function (GtkCssParser *self,
token = gtk_css_parser_get_token (self);
return gtk_css_token_is (token, GTK_CSS_TOKEN_FUNCTION) &&
- g_ascii_strcasecmp (token->string.string, name) == 0;
+ g_ascii_strcasecmp (gtk_css_token_get_string (token), name) == 0;
}
/**
@@ -818,7 +818,7 @@ gtk_css_parser_try_ident (GtkCssParser *self,
token = gtk_css_parser_get_token (self);
if (!gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT) ||
- g_ascii_strcasecmp (token->string.string, ident) != 0)
+ g_ascii_strcasecmp (gtk_css_token_get_string (token), ident) != 0)
return FALSE;
gtk_css_parser_consume_token (self);
@@ -845,7 +845,7 @@ gtk_css_parser_try_at_keyword (GtkCssParser *self,
token = gtk_css_parser_get_token (self);
if (!gtk_css_token_is (token, GTK_CSS_TOKEN_AT_KEYWORD) ||
- g_ascii_strcasecmp (token->string.string, keyword) != 0)
+ g_ascii_strcasecmp (gtk_css_token_get_string (token), keyword) != 0)
return FALSE;
gtk_css_parser_consume_token (self);
@@ -907,7 +907,7 @@ gtk_css_parser_consume_ident (GtkCssParser *self)
return NULL;
}
- ident = g_strdup (token->string.string);
+ ident = g_strdup (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (self);
return ident;
@@ -938,7 +938,7 @@ gtk_css_parser_consume_string (GtkCssParser *self)
return NULL;
}
- ident = g_strdup (token->string.string);
+ ident = g_strdup (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (self);
return ident;
@@ -979,7 +979,7 @@ gtk_css_parser_consume_url (GtkCssParser *self)
if (gtk_css_token_is (token, GTK_CSS_TOKEN_URL))
{
- url = g_strdup (token->string.string);
+ url = g_strdup (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (self);
}
else if (gtk_css_token_is_function (token, "url"))
diff --git a/gtk/css/gtkcsstokenizer.c b/gtk/css/gtkcsstokenizer.c
index 9cf59e1559..899221b5dc 100644
--- a/gtk/css/gtkcsstokenizer.c
+++ b/gtk/css/gtkcsstokenizer.c
@@ -50,7 +50,8 @@ gtk_css_token_clear (GtkCssToken *token)
case GTK_CSS_TOKEN_HASH_UNRESTRICTED:
case GTK_CSS_TOKEN_HASH_ID:
case GTK_CSS_TOKEN_URL:
- g_free (token->string.string);
+ if (token->string.len >= 16)
+ g_free (token->string.u.string);
break;
case GTK_CSS_TOKEN_SIGNED_INTEGER_DIMENSION:
@@ -294,7 +295,7 @@ gtk_css_token_is_ident (const GtkCssToken *token,
const char *ident)
{
return gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT)
- && (g_ascii_strcasecmp (token->string.string, ident) == 0);
+ && (g_ascii_strcasecmp (gtk_css_token_get_string (token), ident) == 0);
}
gboolean
@@ -302,7 +303,7 @@ gtk_css_token_is_function (const GtkCssToken *token,
const char *ident)
{
return gtk_css_token_is (token, GTK_CSS_TOKEN_FUNCTION)
- && (g_ascii_strcasecmp (token->string.string, ident) == 0);
+ && (g_ascii_strcasecmp (gtk_css_token_get_string (token), ident) == 0);
}
gboolean
@@ -322,33 +323,33 @@ gtk_css_token_print (const GtkCssToken *token,
switch (token->type)
{
case GTK_CSS_TOKEN_STRING:
- append_string (string, token->string.string);
+ append_string (string, gtk_css_token_get_string (token));
break;
case GTK_CSS_TOKEN_IDENT:
- append_ident (string, token->string.string);
+ append_ident (string, gtk_css_token_get_string (token));
break;
case GTK_CSS_TOKEN_URL:
g_string_append (string, "url(");
- append_ident (string, token->string.string);
+ append_ident (string, gtk_css_token_get_string (token));
g_string_append (string, ")");
break;
case GTK_CSS_TOKEN_FUNCTION:
- append_ident (string, token->string.string);
+ append_ident (string, gtk_css_token_get_string (token));
g_string_append_c (string, '(');
break;
case GTK_CSS_TOKEN_AT_KEYWORD:
g_string_append_c (string, '@');
- append_ident (string, token->string.string);
+ append_ident (string, gtk_css_token_get_string (token));
break;
case GTK_CSS_TOKEN_HASH_UNRESTRICTED:
case GTK_CSS_TOKEN_HASH_ID:
g_string_append_c (string, '#');
- append_ident (string, token->string.string);
+ append_ident (string, gtk_css_token_get_string (token));
break;
case GTK_CSS_TOKEN_DELIM:
@@ -490,7 +491,7 @@ gtk_css_token_to_string (const GtkCssToken *token)
static void
gtk_css_token_init_string (GtkCssToken *token,
GtkCssTokenType type,
- char *string)
+ GString *string)
{
token->type = type;
@@ -503,7 +504,11 @@ gtk_css_token_init_string (GtkCssToken *token,
case GTK_CSS_TOKEN_HASH_UNRESTRICTED:
case GTK_CSS_TOKEN_HASH_ID:
case GTK_CSS_TOKEN_URL:
- token->string.string = string;
+ token->string.len = string->len;
+ if (string->len < 16)
+ g_strlcpy (token->string.u.buf, string->str, 16);
+ else
+ token->string.u.string = g_strdup (string->str);
break;
default:
g_assert_not_reached ();
@@ -543,8 +548,7 @@ static void
gtk_css_token_init_dimension (GtkCssToken *token,
GtkCssTokenType type,
double value,
- const char *dimension,
- int len)
+ GString *string)
{
token->type = type;
@@ -555,13 +559,7 @@ gtk_css_token_init_dimension (GtkCssToken *token,
case GTK_CSS_TOKEN_SIGNED_DIMENSION:
case GTK_CSS_TOKEN_SIGNLESS_DIMENSION:
token->dimension.value = value;
- 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;
+ g_strlcpy (token->dimension.dimension, string->str, 8);
break;
default:
g_assert_not_reached ();
@@ -880,7 +878,7 @@ gtk_css_tokenizer_read_escape (GtkCssTokenizer *tokenizer)
return value;
}
-static char *
+static void
gtk_css_tokenizer_read_name (GtkCssTokenizer *tokenizer)
{
g_string_set_size (tokenizer->name_buffer, 0);
@@ -916,8 +914,6 @@ gtk_css_tokenizer_read_name (GtkCssTokenizer *tokenizer)
}
}
while (tokenizer->data != tokenizer->end);
-
- return g_strndup (tokenizer->name_buffer->str, tokenizer->name_buffer->len);
}
static void
@@ -1010,7 +1006,8 @@ gtk_css_tokenizer_read_url (GtkCssTokenizer *tokenizer,
}
}
- gtk_css_token_init_string (token, GTK_CSS_TOKEN_URL, g_string_free (url, FALSE));
+ gtk_css_token_init_string (token, GTK_CSS_TOKEN_URL, url);
+ g_string_free (url, TRUE);
return TRUE;
}
@@ -1020,12 +1017,12 @@ gtk_css_tokenizer_read_ident_like (GtkCssTokenizer *tokenizer,
GtkCssToken *token,
GError **error)
{
- char *name = gtk_css_tokenizer_read_name (tokenizer);
+ gtk_css_tokenizer_read_name (tokenizer);
if (*tokenizer->data == '(')
{
gtk_css_tokenizer_consume_ascii (tokenizer);
- if (g_ascii_strcasecmp (name, "url") == 0)
+ if (g_ascii_strcasecmp (tokenizer->name_buffer->str, "url") == 0)
{
const char *data = tokenizer->data;
@@ -1033,18 +1030,15 @@ gtk_css_tokenizer_read_ident_like (GtkCssTokenizer *tokenizer,
data++;
if (*data != '"' && *data != '\'')
- {
- g_free (name);
- return gtk_css_tokenizer_read_url (tokenizer, token, error);
- }
+ return gtk_css_tokenizer_read_url (tokenizer, token, error);
}
- gtk_css_token_init_string (token, GTK_CSS_TOKEN_FUNCTION, name);
+ gtk_css_token_init_string (token, GTK_CSS_TOKEN_FUNCTION, tokenizer->name_buffer);
return TRUE;
}
else
{
- gtk_css_token_init_string (token, GTK_CSS_TOKEN_IDENT, name);
+ gtk_css_token_init_string (token, GTK_CSS_TOKEN_IDENT, tokenizer->name_buffer);
return TRUE;
}
}
@@ -1134,8 +1128,8 @@ gtk_css_tokenizer_read_numeric (GtkCssTokenizer *tokenizer,
else
type = has_sign ? GTK_CSS_TOKEN_SIGNED_DIMENSION : GTK_CSS_TOKEN_SIGNLESS_DIMENSION;
- char *name = gtk_css_tokenizer_read_name (tokenizer);
- gtk_css_token_init_dimension (token, type, value, name, strlen (name));
+ gtk_css_tokenizer_read_name (tokenizer);
+ gtk_css_token_init_dimension (token, type, value, tokenizer->name_buffer);
}
else if (gtk_css_tokenizer_remaining (tokenizer) > 0 && *tokenizer->data == '%')
{
@@ -1244,7 +1238,7 @@ gtk_css_tokenizer_read_string (GtkCssTokenizer *tokenizer,
}
}
- gtk_css_token_init_string (token, GTK_CSS_TOKEN_STRING, g_strdup (tokenizer->name_buffer->str));
+ gtk_css_token_init_string (token, GTK_CSS_TOKEN_STRING, tokenizer->name_buffer);
return TRUE;
}
@@ -1328,9 +1322,8 @@ gtk_css_tokenizer_read_token (GtkCssTokenizer *tokenizer,
else
type = GTK_CSS_TOKEN_HASH_UNRESTRICTED;
- gtk_css_token_init_string (token,
- type,
- gtk_css_tokenizer_read_name (tokenizer));
+ gtk_css_tokenizer_read_name (tokenizer);
+ gtk_css_token_init_string (token, type, tokenizer->name_buffer);
}
else
{
@@ -1410,9 +1403,8 @@ gtk_css_tokenizer_read_token (GtkCssTokenizer *tokenizer,
gtk_css_tokenizer_consume_ascii (tokenizer);
if (gtk_css_tokenizer_has_identifier (tokenizer))
{
- gtk_css_token_init_string (token,
- GTK_CSS_TOKEN_AT_KEYWORD,
- gtk_css_tokenizer_read_name (tokenizer));
+ gtk_css_tokenizer_read_name (tokenizer);
+ gtk_css_token_init_string (token, GTK_CSS_TOKEN_AT_KEYWORD, tokenizer->name_buffer);
}
else
{
diff --git a/gtk/css/gtkcsstokenizerprivate.h b/gtk/css/gtkcsstokenizerprivate.h
index 6f97bd904e..6f4df9c22e 100644
--- a/gtk/css/gtkcsstokenizerprivate.h
+++ b/gtk/css/gtkcsstokenizerprivate.h
@@ -81,7 +81,11 @@ typedef struct _GtkCssDimensionToken GtkCssDimensionToken;
struct _GtkCssStringToken {
GtkCssTokenType type;
- char *string;
+ int len;
+ union {
+ char buf[16];
+ char *string;
+ } u;
};
struct _GtkCssDelimToken {
@@ -108,6 +112,15 @@ union _GtkCssToken {
GtkCssDimensionToken dimension;
};
+static inline const char *
+gtk_css_token_get_string (const GtkCssToken *token)
+{
+ if (token->string.len < 16)
+ return token->string.u.buf;
+ else
+ return token->string.u.string;
+}
+
void gtk_css_token_clear (GtkCssToken *token);
gboolean gtk_css_token_is_finite (const GtkCssToken *token) G_GNUC_PURE;
diff --git a/gtk/gtkcsscolorvalue.c b/gtk/gtkcsscolorvalue.c
index 4b0b4adfe4..b326b9cae9 100644
--- a/gtk/gtkcsscolorvalue.c
+++ b/gtk/gtkcsscolorvalue.c
@@ -722,7 +722,7 @@ _gtk_css_color_value_parse (GtkCssParser *parser)
{
const GtkCssToken *token = gtk_css_parser_get_token (parser);
- value = _gtk_css_color_value_new_name (token->string.string);
+ value = _gtk_css_color_value_new_name (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (parser);
return value;
diff --git a/gtk/gtkcssselector.c b/gtk/gtkcssselector.c
index 207d83ac7d..baed35dadb 100644
--- a/gtk/gtkcssselector.c
+++ b/gtk/gtkcssselector.c
@@ -947,7 +947,7 @@ gtk_css_selector_parse_selector_class (GtkCssParser *parser,
selector = gtk_css_selector_new (negate ? &GTK_CSS_SELECTOR_NOT_CLASS
: &GTK_CSS_SELECTOR_CLASS,
selector);
- selector->style_class.style_class = g_quark_from_string (token->string.string);
+ selector->style_class.style_class = g_quark_from_string (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (parser);
return selector;
}
@@ -1060,7 +1060,7 @@ parse_n_plus_b (GtkCssParser *parser,
return parse_plus_b (parser, TRUE, b);
}
else if (gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT) &&
- string_has_number (token->string.string, "n-", b))
+ string_has_number (gtk_css_token_get_string (token), "n-", b))
{
*a = before;
*b = -*b;
@@ -1156,7 +1156,7 @@ parse_a_n_plus_b (GtkCssParser *parser,
}
else if (!seen_sign &&
gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT) &&
- string_has_number (token->string.string, "-n-", b))
+ string_has_number (gtk_css_token_get_string (token), "-n-", b))
{
*a = -1;
*b = -*b;
@@ -1169,7 +1169,7 @@ parse_a_n_plus_b (GtkCssParser *parser,
return parse_n_plus_b (parser, seen_sign ? seen_sign : 1, a, b);
}
else if (gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT) &&
- string_has_number (token->string.string, "n-", b))
+ string_has_number (gtk_css_token_get_string (token), "n-", b))
{
*a = seen_sign ? seen_sign : 1;
*b = -*b;
@@ -1177,7 +1177,7 @@ parse_a_n_plus_b (GtkCssParser *parser,
return TRUE;
}
else if (!seen_sign && gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT) &&
- string_has_number (token->string.string, "-n-", b))
+ string_has_number (gtk_css_token_get_string (token), "-n-", b))
{
*a = -1;
*b = -*b;
@@ -1288,7 +1288,7 @@ gtk_css_selector_parse_selector_pseudo_class (GtkCssParser *parser,
for (i = 0; i < G_N_ELEMENTS (pseudo_classes); i++)
{
- if (g_ascii_strcasecmp (pseudo_classes[i].name, token->string.string) == 0)
+ if (g_ascii_strcasecmp (pseudo_classes[i].name, gtk_css_token_get_string (token)) == 0)
{
if (pseudo_classes[i].state_flag)
{
@@ -1380,13 +1380,13 @@ gtk_css_selector_parse_selector_pseudo_class (GtkCssParser *parser,
else if (gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT))
{
selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_NOT_NAME, selector);
- selector->name.name = g_quark_from_string (token->string.string);
+ selector->name.name = g_quark_from_string (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (parser);
}
else if (gtk_css_token_is (token, GTK_CSS_TOKEN_HASH_ID))
{
selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_NOT_ID, selector);
- selector->id.name = g_quark_from_string (token->string.string);
+ selector->id.name = g_quark_from_string (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (parser);
}
else if (gtk_css_token_is_delim (token, '.'))
@@ -1499,13 +1499,13 @@ gtk_css_selector_parse_simple_selector (GtkCssParser *parser,
else if (!parsed_something && gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT))
{
selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_NAME, selector);
- selector->name.name = g_quark_from_string (token->string.string);
+ selector->name.name = g_quark_from_string (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (parser);
}
else if (gtk_css_token_is (token, GTK_CSS_TOKEN_HASH_ID))
{
selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_ID, selector);
- selector->id.name = g_quark_from_string (token->string.string);
+ selector->id.name = g_quark_from_string (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (parser);
}
else if (gtk_css_token_is_delim (token, '.'))