diff options
author | Alexander Larsson <alexl@redhat.com> | 2012-03-09 11:32:45 +0100 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2012-03-09 11:32:45 +0100 |
commit | cb44e96dfadf33c1c5df43dabe7ced19a03789dc (patch) | |
tree | c51646ef984661e8c668df789690486bda82a7ed /gobject | |
parent | bbe4b5719502c934e3a2f931773babd858997e43 (diff) |
Fix crash in signal emission optimization
The trace of the signal emission of the was calculating the instance
type after the instance was unrefed. Fix this by keeping the instance type around.
Diffstat (limited to 'gobject')
-rw-r--r-- | gobject/gsignal.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/gobject/gsignal.c b/gobject/gsignal.c index a45b334e3..8e067c333 100644 --- a/gobject/gsignal.c +++ b/gobject/gsignal.c @@ -3168,6 +3168,7 @@ g_signal_emit_valist (gpointer instance, Emission emission; GValue *return_accu, accu = G_VALUE_INIT; guint signal_id; + GType instance_type = G_TYPE_FROM_INSTANCE (instance); GValue emission_return = G_VALUE_INIT; GType rtype = node->return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE; gboolean static_scope = node->return_type & G_SIGNAL_TYPE_STATIC_SCOPE; @@ -3186,12 +3187,12 @@ g_signal_emit_valist (gpointer instance, emission.ihint.detail = detail; emission.ihint.run_type = run_type; emission.state = EMISSION_RUN; - emission.chain_type = G_TYPE_FROM_INSTANCE (instance); + emission.chain_type = instance_type; emission_push (&g_recursive_emissions, &emission); SIGNAL_UNLOCK (); - TRACE(GOBJECT_SIGNAL_EMIT(signal_id, detail, instance, G_TYPE_FROM_INSTANCE (instance))); + TRACE(GOBJECT_SIGNAL_EMIT(signal_id, detail, instance, instance_type)); if (rtype != G_TYPE_NONE) g_value_init (&emission_return, rtype); @@ -3247,7 +3248,7 @@ g_signal_emit_valist (gpointer instance, } } - TRACE(GOBJECT_SIGNAL_EMIT_END(signal_id, detail, instance, G_TYPE_FROM_INSTANCE (instance))); + TRACE(GOBJECT_SIGNAL_EMIT_END(signal_id, detail, instance, instance_type)); return; } |