diff options
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | pango/pango-ot-private.h | 4 | ||||
-rw-r--r-- | pango/pango-ot-ruleset.c | 17 |
3 files changed, 27 insertions, 7 deletions
@@ -1,3 +1,16 @@ +2006-07-07 Behdad Esfahbod <behdad@gnome.org> + + Bug 344766 – Memory leak in get_ruleset() in modules/basic/basic-fc.c + + * pango/pango-ot-private.h: Rename PANGO_OT_IS_RULESET is + PANGO_IS_OT_RULESET. + + * pango/pango-ot-ruleset.c (pango_ot_ruleset_finalize), + (pango_ot_ruleset_new), (pango_ot_ruleset_add_feature), + (pango_ot_ruleset_substitute), (pango_ot_ruleset_position): + Use weak pointers to reference ruleset->info, to avoid circular + dependency. + 2006-06-06 Behdad Esfahbod <behdad@gnome.org> Bug 343966 – pango Cygwin build fixes diff --git a/pango/pango-ot-private.h b/pango/pango-ot-private.h index 69954352..1c2c2a52 100644 --- a/pango/pango-ot-private.h +++ b/pango/pango-ot-private.h @@ -62,8 +62,8 @@ struct _PangoOTInfoClass #define PANGO_TYPE_OT_RULESET (pango_ot_ruleset_get_type ()) #define PANGO_OT_RULESET(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_OT_RULESET, PangoOTRuleset)) #define PANGO_OT_RULESET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANGO_TYPE_OT_RULESET, PangoOTRulesetClass))f -#define PANGO_OT_IS_RULESET(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_OT_RULESET)) -#define PANGO_OT_IS_RULESET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANGO_TYPE_OT_RULESET)) +#define PANGO_IS_OT_RULESET(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_OT_RULESET)) +#define PANGO_IS_OT_RULESET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANGO_TYPE_OT_RULESET)) #define PANGO_OT_RULESET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PANGO_TYPE_OT_RULESET, PangoOTRulesetClass)) typedef struct _PangoOTRulesetClass PangoOTRulesetClass; diff --git a/pango/pango-ot-ruleset.c b/pango/pango-ot-ruleset.c index e50b2a1e..521536f6 100644 --- a/pango/pango-ot-ruleset.c +++ b/pango/pango-ot-ruleset.c @@ -88,7 +88,8 @@ pango_ot_ruleset_finalize (GObject *object) PangoOTRuleset *ruleset = PANGO_OT_RULESET (object); g_array_free (ruleset->rules, TRUE); - g_object_unref (ruleset->info); + if (ruleset->info) + g_object_remove_weak_pointer (ruleset->info, &ruleset->info); parent_class->finalize (object); } @@ -107,9 +108,12 @@ pango_ot_ruleset_new (PangoOTInfo *info) { PangoOTRuleset *ruleset; + g_return_val_if_fail (info != NULL, NULL); + ruleset = g_object_new (PANGO_TYPE_OT_RULESET, NULL); - ruleset->info = g_object_ref (info); + ruleset->info = info; + g_object_add_weak_pointer (ruleset->info, &ruleset->info); return ruleset; } @@ -132,7 +136,8 @@ pango_ot_ruleset_add_feature (PangoOTRuleset *ruleset, { PangoOTRule tmp_rule; - g_return_if_fail (PANGO_OT_IS_RULESET (ruleset)); + g_return_if_fail (PANGO_IS_OT_RULESET (ruleset)); + g_return_if_fail (PANGO_IS_OT_INFO (ruleset->info)); tmp_rule.table_type = table_type; tmp_rule.feature_index = feature_index; @@ -159,7 +164,8 @@ pango_ot_ruleset_substitute (PangoOTRuleset *ruleset, TTO_GSUB gsub = NULL; - g_return_if_fail (PANGO_OT_IS_RULESET (ruleset)); + g_return_if_fail (PANGO_IS_OT_RULESET (ruleset)); + g_return_if_fail (PANGO_IS_OT_INFO (ruleset->info)); for (i = 0; i < ruleset->rules->len; i++) { @@ -202,7 +208,8 @@ pango_ot_ruleset_position (PangoOTRuleset *ruleset, TTO_GPOS gpos = NULL; - g_return_if_fail (PANGO_OT_IS_RULESET (ruleset)); + g_return_if_fail (PANGO_IS_OT_RULESET (ruleset)); + g_return_if_fail (PANGO_IS_OT_INFO (ruleset->info)); for (i = 0; i < ruleset->rules->len; i++) { |