builderparser: Keep properties in a GPtrArray

This commit is contained in:
Timm Bäder 2021-01-06 19:07:44 +01:00
parent 69293db804
commit aec2fb939f
3 changed files with 18 additions and 13 deletions

View File

@ -527,19 +527,21 @@ static void
gtk_builder_get_parameters (GtkBuilder *builder, gtk_builder_get_parameters (GtkBuilder *builder,
GType object_type, GType object_type,
const char *object_name, const char *object_name,
GSList *properties, GPtrArray *properties,
GParamFlags filter_flags, GParamFlags filter_flags,
ObjectProperties *parameters, ObjectProperties *parameters,
ObjectProperties *filtered_parameters) ObjectProperties *filtered_parameters)
{ {
GtkBuilderPrivate *priv = gtk_builder_get_instance_private (builder); GtkBuilderPrivate *priv = gtk_builder_get_instance_private (builder);
GSList *l;
DelayedProperty *property; DelayedProperty *property;
GError *error = NULL; GError *error = NULL;
for (l = properties; l; l = l->next) if (!properties)
return;
for (guint i = 0; i < properties->len; i++)
{ {
PropertyInfo *prop = (PropertyInfo*)l->data; PropertyInfo *prop = g_ptr_array_index (properties, i);
const char *property_name = g_intern_string (prop->pspec->name); const char *property_name = g_intern_string (prop->pspec->name);
GValue property_value = G_VALUE_INIT; GValue property_value = G_VALUE_INIT;

View File

@ -471,8 +471,6 @@ builder_construct (ParserData *data,
if (object_info->object && object_info->applied_properties) if (object_info->object && object_info->applied_properties)
return object_info->object; return object_info->object;
object_info->properties = g_slist_reverse (object_info->properties);
if (object_info->object == NULL) if (object_info->object == NULL)
{ {
object = _gtk_builder_construct (data->builder, object_info, error); object = _gtk_builder_construct (data->builder, object_info, error);
@ -800,18 +798,19 @@ free_object_info (ObjectInfo *info)
/* Do not free the signal items, which GtkBuilder takes ownership of */ /* Do not free the signal items, which GtkBuilder takes ownership of */
g_type_class_unref (info->oclass); g_type_class_unref (info->oclass);
g_slist_free (info->signals); g_slist_free (info->signals);
g_slist_free_full (info->properties, (GDestroyNotify)free_property_info); if (info->properties)
g_ptr_array_free (info->properties, TRUE);
g_free (info->constructor); g_free (info->constructor);
g_free (info->id); g_free (info->id);
g_slice_free (ObjectInfo, info); g_slice_free (ObjectInfo, info);
} }
static void static void
parse_child (ParserData *data, parse_child (ParserData *data,
const char *element_name, const char *element_name,
const char **names, const char **names,
const char **values, const char **values,
GError **error) GError **error)
{ {
ObjectInfo* object_info; ObjectInfo* object_info;
@ -1707,7 +1706,6 @@ parse_custom (GtkBuildableParseContext *context,
ObjectInfo* object_info = (ObjectInfo*)parent_info; ObjectInfo* object_info = (ObjectInfo*)parent_info;
if (!object_info->object) if (!object_info->object)
{ {
object_info->properties = g_slist_reverse (object_info->properties);
object_info->object = _gtk_builder_construct (data->builder, object_info->object = _gtk_builder_construct (data->builder,
object_info, object_info,
error); error);
@ -1885,7 +1883,10 @@ end_element (GtkBuildableParseContext *context,
g_string_assign (prop_info->text, translated); g_string_assign (prop_info->text, translated);
} }
object_info->properties = g_slist_prepend (object_info->properties, prop_info); if (G_UNLIKELY (!object_info->properties))
object_info->properties = g_ptr_array_new_with_free_func ((GDestroyNotify)free_property_info);
g_ptr_array_add (object_info->properties, prop_info);
} }
else else
g_assert_not_reached (); g_assert_not_reached ();

View File

@ -46,9 +46,11 @@ typedef struct {
GObjectClass *oclass; GObjectClass *oclass;
char *id; char *id;
char *constructor; char *constructor;
GSList *properties;
GPtrArray *properties;
GSList *signals; GSList *signals;
GSList *bindings; GSList *bindings;
GObject *object; GObject *object;
CommonInfo *parent; CommonInfo *parent;
gboolean applied_properties; gboolean applied_properties;