[glib] Fix crash in signal emission optimization



commit cb44e96dfadf33c1c5df43dabe7ced19a03789dc
Author: Alexander Larsson <alexl redhat com>
Date:   Fri Mar 9 11:32:45 2012 +0100

    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.

 gobject/gsignal.c |    7 ++++---
 1 files changed, 4 insertions(+), 3 deletions(-)
---
diff --git a/gobject/gsignal.c b/gobject/gsignal.c
index a45b334..8e067c3 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;
 	}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]