[librsvg] Ref/unref the nodes at the toplevel rsvg-base
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg] Ref/unref the nodes at the toplevel rsvg-base
- Date: Fri, 17 Feb 2017 16:39:29 +0000 (UTC)
commit 2fca04ad9e3bf3850b287b76267d7a3059f505ab
Author: Federico Mena Quintero <federico gnome org>
Date: Thu Feb 16 21:09:21 2017 -0600
Ref/unref the nodes at the toplevel rsvg-base
rsvg-base.c | 14 ++++++++++----
rsvg-defs.c | 4 ++--
rsvg-gobject.c | 3 +++
3 files changed, 15 insertions(+), 6 deletions(-)
---
diff --git a/rsvg-base.c b/rsvg-base.c
index 449d8de..bac8424 100644
--- a/rsvg-base.c
+++ b/rsvg-base.c
@@ -194,7 +194,7 @@ add_node_to_handle (RsvgHandle *ctx, RsvgNode *node)
g_assert (ctx != NULL);
g_assert (node != NULL);
- g_ptr_array_add (ctx->priv->all_nodes, node);
+ g_ptr_array_add (ctx->priv->all_nodes, rsvg_node_ref (node));
}
static void
@@ -423,12 +423,14 @@ rsvg_standard_element_start (RsvgHandle * ctx, const char *name, RsvgPropertyBag
if (ctx->priv->currentnode) {
rsvg_node_add_child (ctx->priv->currentnode, newnode);
} else if (rsvg_node_get_type (newnode) == RSVG_NODE_TYPE_SVG) {
- ctx->priv->treebase = newnode;
+ ctx->priv->treebase = rsvg_node_ref (newnode);
}
ctx->priv->currentnode = rsvg_node_ref (newnode);
node_set_atts (newnode, ctx, creator, atts);
+
+ rsvg_node_unref (newnode);
}
}
@@ -507,7 +509,7 @@ rsvg_start_extra (RsvgHandle * ctx,
* This isn't quite the correct behavior - any graphics
* element may contain a <extra> element.
*/
- do_care = treebase != NULL && treebase == currentnode;
+ do_care = treebase != NULL && rsvg_node_is_same (treebase, currentnode);
handler->super.free = rsvg_extra_handler_free;
handler->super.characters = rsvg_extra_handler_characters;
@@ -830,7 +832,11 @@ rsvg_end_element (void *data, const xmlChar * xmlname)
}
if (ctx->priv->currentnode && topmost_element_name_is (ctx, name)) {
- ctx->priv->currentnode = rsvg_node_get_parent (ctx->priv->currentnode);
+ RsvgNode *parent;
+
+ parent = rsvg_node_get_parent (ctx->priv->currentnode);
+ ctx->priv->currentnode = rsvg_object_unref (ctx->priv->currentnode);
+ ctx->priv->currentnode = parent;
pop_element_name (ctx);
}
diff --git a/rsvg-defs.c b/rsvg-defs.c
index 4a842fe..6279aba 100644
--- a/rsvg-defs.c
+++ b/rsvg-defs.c
@@ -42,7 +42,7 @@ rsvg_defs_new (RsvgHandle *handle)
{
RsvgDefs *result = g_new (RsvgDefs, 1);
- result->hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+ result->hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, rsvg_node_unref);
result->externs =
g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_object_unref);
result->ctx = handle; /* no need to take a ref here */
@@ -130,7 +130,7 @@ rsvg_defs_register_node_by_id (RsvgDefs *defs, const char *id, RsvgNode *node)
if (g_hash_table_lookup (defs->hash, id))
return;
- g_hash_table_insert (defs->hash, g_strdup (id), node);
+ g_hash_table_insert (defs->hash, g_strdup (id), rsvg_node_ref (node));
}
void
diff --git a/rsvg-gobject.c b/rsvg-gobject.c
index 003de06..25bda7c 100644
--- a/rsvg-gobject.c
+++ b/rsvg-gobject.c
@@ -134,6 +134,9 @@ rsvg_handle_dispose (GObject *instance)
g_hash_table_destroy (self->priv->css_props);
+ self->priv->treebase = rsvg_node_unref (self->priv->treebase);
+ self->priv->currentnode = rsvg_node_unref (self->priv->currentnode);
+
if (self->priv->user_data_destroy)
(*self->priv->user_data_destroy) (self->priv->user_data);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]