state: Plug some memory leakage

Thanks to Valgrind, test-state-base now reports 0 bytes definitely lost.
This commit is contained in:
Emmanuele Bassi 2010-08-13 12:12:59 +01:00
parent 6c6e93d27a
commit 50c5ecfe87
2 changed files with 17 additions and 12 deletions

View File

@ -242,6 +242,8 @@ clutter_state_key_free (gpointer clutter_state_key)
key->target_state->clutter_state); key->target_state->clutter_state);
} }
g_value_unset (&key->value);
g_object_unref (key->alpha); g_object_unref (key->alpha);
g_object_unref (key->interval); g_object_unref (key->interval);
@ -730,12 +732,15 @@ clutter_state_set (ClutterState *state,
GParamSpec *pspec; GParamSpec *pspec;
GValue value = { 0, }; GValue value = { 0, };
gchar *error = NULL; gchar *error = NULL;
const gchar *real_property_name = property_name; gboolean is_delayed = FALSE;
if (g_str_has_prefix (property_name, "delayed::")) if (g_str_has_prefix (property_name, "delayed::"))
real_property_name = strstr (property_name, "::") + 2; {
property_name = strstr (property_name, "::") + 2;
is_delayed = TRUE;
}
pspec = get_property_from_object (object, real_property_name); pspec = get_property_from_object (object, property_name);
if (pspec == NULL) if (pspec == NULL)
break; break;
@ -755,7 +760,7 @@ clutter_state_set (ClutterState *state,
break; break;
} }
if (g_str_has_prefix (property_name, "delayed::")) if (is_delayed)
{ {
gdouble pre_delay = va_arg (args, gdouble); gdouble pre_delay = va_arg (args, gdouble);
gdouble post_delay = va_arg (args, gdouble); gdouble post_delay = va_arg (args, gdouble);
@ -764,7 +769,7 @@ clutter_state_set (ClutterState *state,
source_state_name, source_state_name,
target_state_name, target_state_name,
object, object,
real_property_name, property_name,
mode, mode,
&value, &value,
pre_delay, pre_delay,
@ -783,6 +788,8 @@ clutter_state_set (ClutterState *state,
0.0); 0.0);
} }
g_value_unset (&value);
object = va_arg (args, gpointer); object = va_arg (args, gpointer);
if (object != NULL) if (object != NULL)
{ {
@ -1724,7 +1731,7 @@ parse_state_transition (JsonArray *array,
State *source_state, *target_state; State *source_state, *target_state;
JsonArray *keys; JsonArray *keys;
GSList *valid_keys = NULL; GSList *valid_keys = NULL;
GList *k; GList *array_keys, *k;
if (JSON_NODE_TYPE (element) != JSON_NODE_OBJECT) if (JSON_NODE_TYPE (element) != JSON_NODE_OBJECT)
{ {
@ -1796,9 +1803,8 @@ parse_state_transition (JsonArray *array,
else else
g_value_init (clos->value, G_TYPE_POINTER); g_value_init (clos->value, G_TYPE_POINTER);
for (k = json_array_get_elements (keys); array_keys = json_array_get_elements (keys);
k != NULL; for (k = array_keys; k != NULL; k = k->next)
k = k->next)
{ {
JsonNode *node = k->data; JsonNode *node = k->data;
JsonArray *key = json_node_get_array (node); JsonArray *key = json_node_get_array (node);
@ -1876,6 +1882,8 @@ parse_state_transition (JsonArray *array,
valid_keys = g_slist_prepend (valid_keys, state_key); valid_keys = g_slist_prepend (valid_keys, state_key);
} }
g_list_free (array_keys);
g_value_set_pointer (clos->value, g_slist_reverse (valid_keys)); g_value_set_pointer (clos->value, g_slist_reverse (valid_keys));
clos->result = TRUE; clos->result = TRUE;

View File

@ -70,9 +70,6 @@ test_state_base (TestConformSimpleFixture *fixture G_GNUC_UNUSED,
g_assert_cmpint (g_list_length (keys), ==, 2); g_assert_cmpint (g_list_length (keys), ==, 2);
g_list_free (keys); g_list_free (keys);
keys = clutter_state_get_keys (CLUTTER_STATE (state), NULL, NULL,
NULL, NULL);
states = clutter_state_get_states (CLUTTER_STATE (state)); states = clutter_state_get_states (CLUTTER_STATE (state));
g_assert_cmpint (g_list_length (states), ==, 2); g_assert_cmpint (g_list_length (states), ==, 2);
g_list_free (states); g_list_free (states);