gjs r128 - trunk/gi



Author: jobi
Date: Tue Dec  2 16:11:43 2008
New Revision: 128
URL: http://svn.gnome.org/viewvc/gjs?rev=128&view=rev

Log:
Avoid leaking BigJSClosure when passing GClosures

Modified:
   trunk/gi/arg.c

Modified: trunk/gi/arg.c
==============================================================================
--- trunk/gi/arg.c	(original)
+++ trunk/gi/arg.c	Tue Dec  2 16:11:43 2008
@@ -1053,6 +1053,8 @@
 
                 if (g_type_is_a(gtype, G_TYPE_OBJECT) || g_type_is_a(gtype, G_TYPE_INTERFACE)) {
                     g_object_unref(G_OBJECT(arg->v_pointer));
+                } else if (g_type_is_a(gtype, G_TYPE_CLOSURE)) {
+                    g_closure_unref(arg->v_pointer);
                 } else if (g_type_is_a(gtype, G_TYPE_BOXED)) {
                     g_boxed_free(gtype, arg->v_pointer);
                 } else if (g_type_is_a(gtype, G_TYPE_VALUE)) {
@@ -1188,6 +1190,7 @@
                               GArgument  *arg)
 {
     GITypeTag type_tag;
+    gboolean needs_release;
 
     /* we don't own the argument anymore */
     if (transfer == GI_TRANSFER_EVERYTHING)
@@ -1202,15 +1205,38 @@
     /* release all (temporary) arguments we allocated from JS types */
     /* FIXME: check with lists, arrays, boxed types, objects, ... */
 
+    needs_release = FALSE;
+
     switch (type_tag) {
     case GI_TYPE_TAG_UTF8:
     case GI_TYPE_TAG_FILENAME:
     case GI_TYPE_TAG_ARRAY:
-        return gjs_g_arg_release_internal(context, GI_TRANSFER_EVERYTHING,
-                                          type_info, type_tag, arg);
+        needs_release = TRUE;
+        break;
+    case GI_TYPE_TAG_INTERFACE: {
+        GIBaseInfo* symbol_info;
+        GType gtype;
+
+        symbol_info = g_type_info_get_interface(type_info);
+        g_assert(symbol_info != NULL);
+
+        gtype = g_registered_type_info_get_g_type((GIRegisteredTypeInfo*)symbol_info);
+
+        if (g_type_is_a(gtype, G_TYPE_CLOSURE))
+            needs_release = TRUE;
+
+        g_base_info_unref(symbol_info);
+        break;
+    }
     default:
-        return JS_TRUE;
+        break;
     }
+
+    if (needs_release)
+        return gjs_g_arg_release_internal(context, GI_TRANSFER_EVERYTHING,
+                                          type_info, type_tag, arg);
+
+    return JS_TRUE;
 }
 
 



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