Index: gobject/gobject.c
===================================================================
--- gobject/gobject.c	(revision 7570)
+++ gobject/gobject.c	(working copy)
@@ -113,6 +113,9 @@
     ((G_DATALIST_GET_FLAGS (&(object)->qdata) & OBJECT_HAS_TOGGLE_REF_FLAG) != 0)
 #define OBJECT_FLOATING_FLAG 0x2
 
+#define CLASS_HAS_PROPS_FLAG 0x1
+#define CLASS_HAS_PROPS(class) \
+	(G_UNLIKELY(class->flags & CLASS_HAS_PROPS_FLAG))
 
 /* --- signals --- */
 enum {
@@ -281,6 +284,7 @@
   class->construct_properties = pclass ? g_slist_copy (pclass->construct_properties) : NULL;
   class->get_property = NULL;
   class->set_property = NULL;
+  class->flags = 0;
 }
 
 static void
@@ -405,6 +409,9 @@
 {
   g_return_if_fail (G_IS_OBJECT_CLASS (class));
   g_return_if_fail (G_IS_PARAM_SPEC (pspec));
+
+  class->flags |= CLASS_HAS_PROPS_FLAG;
+
   if (pspec->flags & G_PARAM_WRITABLE)
     g_return_if_fail (class->set_property != NULL);
   if (pspec->flags & G_PARAM_READABLE)
@@ -680,11 +687,21 @@
 static void
 g_object_init (GObject *object)
 {
+  GObjectClass *class;
+
   object->ref_count = 1;
   g_datalist_init (&object->qdata);
-  
+
+  class = G_OBJECT_GET_CLASS (object);
+ 
+if (CLASS_HAS_PROPS(class)) {
   /* freeze object's notification queue, g_object_newv() preserves pairedness */
-  g_object_notify_queue_freeze (object, &property_notify_context);
+
+//  I'll just be fair: I don't know, I don't understand this one
+//  g_object_notify_queue_freeze (object, &property_notify_context);
+
+}
+
   /* enter construction list for notify_queue_thaw() and to allow construct-only properties */
   G_LOCK (construction_mutex);
   construction_objects = g_slist_prepend (construction_objects, object);
@@ -801,16 +818,23 @@
 void
 g_object_freeze_notify (GObject *object)
 {
+  GObjectClass *class;
+
   g_return_if_fail (G_IS_OBJECT (object));
 
   if (g_atomic_int_get ((int *)&object->ref_count) == 0)
     return;
 
+  class = G_OBJECT_GET_CLASS (object);
+
+if (CLASS_HAS_PROPS(class)) {
   g_object_ref (object);
   g_object_notify_queue_freeze (object, &property_notify_context);
   g_object_unref (object);
 }
 
+}
+
 /**
  * g_object_notify:
  * @object: a #GObject
@@ -822,13 +846,18 @@
 g_object_notify (GObject     *object,
 		 const gchar *property_name)
 {
+  GObjectClass *class;
   GParamSpec *pspec;
   
   g_return_if_fail (G_IS_OBJECT (object));
   g_return_if_fail (property_name != NULL);
   if (g_atomic_int_get ((int *)&object->ref_count) == 0)
     return;
+
+  class = G_OBJECT_GET_CLASS (object);
   
+if (CLASS_HAS_PROPS(class)) {
+
   g_object_ref (object);
   /* We don't need to get the redirect target
    * (by, e.g. calling g_object_class_find_property())
@@ -853,8 +882,11 @@
       g_object_notify_queue_thaw (object, nqueue);
     }
   g_object_unref (object);
+
 }
 
+}
+
 /**
  * g_object_thaw_notify:
  * @object: a #GObject
@@ -1091,6 +1123,7 @@
   return in_construction;
 }
 
+
 /**
  * g_object_newv:
  * @object_type: the type id of the #GObject subtype to instantiate
@@ -1104,6 +1137,7 @@
  *
  * Returns: a new instance of @object_type
  */
+
 gpointer
 g_object_newv (GType       object_type,
 	       guint       n_parameters,
@@ -1125,6 +1159,11 @@
   class = g_type_class_peek_static (object_type);
   if (!class)
     class = unref_class = g_type_class_ref (object_type);
+
+  if (n_parameters)
+    class->flags |= CLASS_HAS_PROPS_FLAG;
+
+if (CLASS_HAS_PROPS(class)) {
   for (slist = class->construct_properties; slist; slist = slist->next)
     {
       clist = g_list_prepend (clist, slist->data);
@@ -1206,37 +1245,50 @@
       g_list_free_1 (clist);
       clist = tmp;
     }
+}
 
   /* construct object from construction parameters */
   object = class->constructor (object_type, n_total_cparams, cparams);
+
+if (CLASS_HAS_PROPS(class)) {
   /* free construction values */
   g_free (cparams);
   while (n_cvalues--)
     g_value_unset (cvalues + n_cvalues);
   g_free (cvalues);
+}
 
   /* adjust freeze_count according to g_object_init() and remaining properties */
   G_LOCK (construction_mutex);
   newly_constructed = slist_maybe_remove (&construction_objects, object);
   G_UNLOCK (construction_mutex);
+
+if (CLASS_HAS_PROPS(class)) {
   if (newly_constructed || n_oparams)
     nqueue = g_object_notify_queue_freeze (object, &property_notify_context);
   if (newly_constructed)
     g_object_notify_queue_thaw (object, nqueue);
+}
 
   /* run 'constructed' handler if there is one */
   if (newly_constructed && class->constructed)
     class->constructed (object);
 
+if (CLASS_HAS_PROPS(class)) {
   /* set remaining properties */
   for (i = 0; i < n_oparams; i++)
     object_set_property (object, oparams[i].pspec, oparams[i].value, nqueue);
   g_free (oparams);
 
   /* release our own freeze count and handle notifications */
-  if (newly_constructed || n_oparams)
-    g_object_notify_queue_thaw (object, nqueue);
 
+}
+
+// I'll just be fair: I don't know, I don't understand this one
+
+//  if (newly_constructed || n_oparams)
+//    g_object_notify_queue_thaw (object, nqueue);
+
   if (unref_class)
     g_type_class_unref (unref_class);
 
@@ -1329,15 +1381,21 @@
 		      GObjectConstructParam *construct_params)
 {
   GObject *object;
+  GObjectClass *class;
 
   /* create object */
   object = (GObject*) g_type_create_instance (type);
+  class = G_OBJECT_GET_CLASS (object);
   
   /* set construction parameters */
   if (n_construct_properties)
     {
-      GObjectNotifyQueue *nqueue = g_object_notify_queue_freeze (object, &property_notify_context);
-      
+      GObjectNotifyQueue *nqueue;
+
+      class->flags |= CLASS_HAS_PROPS_FLAG;
+
+      nqueue = g_object_notify_queue_freeze (object, &property_notify_context);
+
       /* set construct properties */
       while (n_construct_properties--)
 	{
@@ -1372,11 +1430,16 @@
 		     va_list	  var_args)
 {
   GObjectNotifyQueue *nqueue;
+  GObjectClass *class;
   const gchar *name;
   
   g_return_if_fail (G_IS_OBJECT (object));
+
+  class = G_OBJECT_GET_CLASS (object);
   
+if (CLASS_HAS_PROPS(class)) {
   g_object_ref (object);
+
   nqueue = g_object_notify_queue_freeze (object, &property_notify_context);
   
   name = first_property_name;
@@ -1434,6 +1497,8 @@
   g_object_unref (object);
 }
 
+}
+
 /**
  * g_object_get_valist:
  * @object: a #GObject
@@ -1599,12 +1664,17 @@
 		       const GValue *value)
 {
   GObjectNotifyQueue *nqueue;
+  GObjectClass *class;
   GParamSpec *pspec;
   
   g_return_if_fail (G_IS_OBJECT (object));
   g_return_if_fail (property_name != NULL);
   g_return_if_fail (G_IS_VALUE (value));
   
+  class = G_OBJECT_GET_CLASS (object);
+
+  class->flags |= CLASS_HAS_PROPS_FLAG;
+
   g_object_ref (object);
   nqueue = g_object_notify_queue_freeze (object, &property_notify_context);
   
@@ -1630,6 +1700,9 @@
   
   g_object_notify_queue_thaw (object, nqueue);
   g_object_unref (object);
+
+
+
 }
 
 /**
Index: gobject/gobject.h
===================================================================
--- gobject/gobject.h	(revision 7570)
+++ gobject/gobject.h	(working copy)
@@ -343,9 +343,11 @@
   /* called when done constructing */
   void	     (*constructed)		(GObject	*object);
 
+  guint32    flags;
+
   /*< private >*/
   /* padding */
-  gpointer	pdummy[7];
+  gpointer	pdummy[6];
 };
 /**
  * GObjectConstructParam:
