[gtk/a11y-strdup] a11y: Don't copy attribute names in attribute sets




commit 3cfe69d71108a47f080819edbc9e884199361d8f
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Mar 19 17:00:04 2021 -0400

    a11y: Don't copy attribute names in attribute sets
    
    We only need these names when serializing a11y information
    for tests. And copying these strings is entirely unnecessary.
    So, just pass a callback instead.

 gtk/gtkaccessibleattributeset.c        | 20 +++++++-------------
 gtk/gtkaccessibleattributesetprivate.h |  5 +++--
 gtk/gtkatcontext.c                     |  6 +++---
 3 files changed, 13 insertions(+), 18 deletions(-)
---
diff --git a/gtk/gtkaccessibleattributeset.c b/gtk/gtkaccessibleattributeset.c
index f49a9cf911..2e7a072abc 100644
--- a/gtk/gtkaccessibleattributeset.c
+++ b/gtk/gtkaccessibleattributeset.c
@@ -29,44 +29,41 @@ struct _GtkAccessibleAttributeSet
 {
   gsize n_attributes;
 
+  GtkAccessibleAttributeNameFunc name_func;
   GtkAccessibleAttributeDefaultFunc default_func;
 
   GtkBitmask *attributes_set;
 
-  char **attribute_names;
   GtkAccessibleValue **attribute_values;
 };
 
 static GtkAccessibleAttributeSet *
 gtk_accessible_attribute_set_init (GtkAccessibleAttributeSet          *self,
                                    gsize                               n_attributes,
-                                   const char                        **attribute_names,
+                                   GtkAccessibleAttributeNameFunc      name_func,
                                    GtkAccessibleAttributeDefaultFunc   default_func)
 {
   self->n_attributes = n_attributes;
+  self->name_func = name_func;
   self->default_func = default_func;
-  self->attribute_names = g_new (char *, n_attributes);
   self->attribute_values = g_new (GtkAccessibleValue *, n_attributes);
   self->attributes_set = _gtk_bitmask_new ();
 
   /* Initialize all attribute values, so we can always get the full attribute */
   for (int i = 0; i < self->n_attributes; i++)
-    {
-      self->attribute_names[i] = g_strdup (attribute_names[i]);
-      self->attribute_values[i] = (* self->default_func) (i);
-    }
+    self->attribute_values[i] = (* self->default_func) (i);
 
   return self;
 }
 
 GtkAccessibleAttributeSet *
 gtk_accessible_attribute_set_new (gsize                               n_attributes,
-                                  const char                        **attribute_names,
+                                  GtkAccessibleAttributeNameFunc      name_func,
                                   GtkAccessibleAttributeDefaultFunc   default_func)
 {
   GtkAccessibleAttributeSet *set = g_rc_box_new0 (GtkAccessibleAttributeSet);
 
-  return gtk_accessible_attribute_set_init (set, n_attributes, attribute_names, default_func);
+  return gtk_accessible_attribute_set_init (set, n_attributes, name_func, default_func);
 }
 
 GtkAccessibleAttributeSet *
@@ -84,13 +81,10 @@ gtk_accessible_attribute_set_free (gpointer data)
 
   for (int i = 0; i < self->n_attributes; i++)
     {
-      g_free (self->attribute_names[i]);
-
       if (self->attribute_values[i] != NULL)
         gtk_accessible_value_unref (self->attribute_values[i]);
     }
 
-  g_free (self->attribute_names);
   g_free (self->attribute_values);
 
   _gtk_bitmask_free (self->attributes_set);
@@ -247,7 +241,7 @@ gtk_accessible_attribute_set_print (GtkAccessibleAttributeSet *self,
         continue;
 
       g_string_append (buffer, "    ");
-      g_string_append (buffer, self->attribute_names[i]);
+      g_string_append (buffer, self->name_func (i));
       g_string_append (buffer, ": ");
 
       gtk_accessible_value_print (self->attribute_values[i], buffer);
diff --git a/gtk/gtkaccessibleattributesetprivate.h b/gtk/gtkaccessibleattributesetprivate.h
index bce94d6876..cb52b7f62a 100644
--- a/gtk/gtkaccessibleattributesetprivate.h
+++ b/gtk/gtkaccessibleattributesetprivate.h
@@ -27,10 +27,11 @@ G_BEGIN_DECLS
 
 typedef struct _GtkAccessibleAttributeSet       GtkAccessibleAttributeSet;
 
+typedef const char *(* GtkAccessibleAttributeNameFunc) (int attribute);
 typedef GtkAccessibleValue *(* GtkAccessibleAttributeDefaultFunc) (int attribute);
 
-GtkAccessibleAttributeSet *     gtk_accessible_attribute_set_new                (gsize                       
n_attributes,
-                                                                                 const char                
**attr_names,
+GtkAccessibleAttributeSet *     gtk_accessible_attribute_set_new                (gsize                       
      n_attributes,
+                                                                                 
GtkAccessibleAttributeNameFunc    name_func,
                                                                                  
GtkAccessibleAttributeDefaultFunc default_func);
 GtkAccessibleAttributeSet *     gtk_accessible_attribute_set_ref                (GtkAccessibleAttributeSet  
*self);
 void                            gtk_accessible_attribute_set_unref              (GtkAccessibleAttributeSet  
*self);
diff --git a/gtk/gtkatcontext.c b/gtk/gtkatcontext.c
index 840c64e875..83c9be2a87 100644
--- a/gtk/gtkatcontext.c
+++ b/gtk/gtkatcontext.c
@@ -384,15 +384,15 @@ gtk_at_context_init (GtkATContext *self)
 
   self->properties =
     gtk_accessible_attribute_set_new (G_N_ELEMENTS (property_attrs),
-                                      property_attrs,
+                                      (GtkAccessibleAttributeNameFunc) 
gtk_accessible_property_get_attribute_name,
                                       (GtkAccessibleAttributeDefaultFunc) 
gtk_accessible_value_get_default_for_property);
   self->relations =
     gtk_accessible_attribute_set_new (G_N_ELEMENTS (relation_attrs),
-                                      relation_attrs,
+                                      (GtkAccessibleAttributeNameFunc) 
gtk_accessible_relation_get_attribute_name,
                                       (GtkAccessibleAttributeDefaultFunc) 
gtk_accessible_value_get_default_for_relation);
   self->states =
     gtk_accessible_attribute_set_new (G_N_ELEMENTS (state_attrs),
-                                      state_attrs,
+                                      (GtkAccessibleAttributeNameFunc) 
gtk_accessible_state_get_attribute_name,
                                       (GtkAccessibleAttributeDefaultFunc) 
gtk_accessible_value_get_default_for_state);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]