0ca68e36bc5bda392633718d9aeb9c97409e0920
diff --git a/gi/pygi-closure.c b/gi/pygi-closure.c
index 2c8d0b3..a8f67e2 100644
--- a/gi/pygi-closure.c
+++ b/gi/pygi-closure.c
@@ -79,17 +79,19 @@ _pygi_closure_handle (ffi_cif *cif,
                 {
                     if (g_type_info_is_pointer(arg_type)) {
                         if (closure->user_data == NULL) {
-                            Py_INCREF(Py_None);
                             if(PyTuple_SetItem(py_args, n_in_args, Py_None) != 0) {
                                 PyErr_Clear();
                                 goto end;
                             }
-                        } else if (PyTuple_SetItem(py_args, n_in_args, closure->user_data) != 0) {
-                            PyErr_Print();
-                            goto end;
+                            Py_INCREF(Py_None);
+                        } else {
+                        	if (PyTuple_SetItem(py_args, n_in_args, closure->user_data) != 0) {
+                                PyErr_Print();
+                                goto end;
+                        	}
+                        	// decreffing the tuple will take care of user_data ref
+                        	Py_XINCREF(closure->user_data);
                         }
-                        
-                        Py_XINCREF(closure->user_data);
 
                         n_in_args++;
                         continue;
@@ -104,17 +106,17 @@ _pygi_closure_handle (ffi_cif *cif,
                     pyarg = _pygi_argument_to_object (args[i],
                                                       arg_type,
                                                       arg_transfer);
-                    
+
                     if(PyTuple_SetItem(py_args, n_in_args, pyarg) != 0) {
                         PyErr_Print();
                         goto end;
                     }
                     n_in_args++;
                     g_base_info_unref((GIBaseInfo*)arg_info);
-                    g_base_info_unref((GIBaseInfo*)arg_type);                                    
+                    g_base_info_unref((GIBaseInfo*)arg_type);
                 }
         }
-        
+
     }
 
     if(_PyTuple_Resize (&py_args, n_in_args) != 0) {
@@ -124,8 +126,6 @@ _pygi_closure_handle (ffi_cif *cif,
 
     retval = PyObject_CallObject((PyObject *)closure->function, py_args);
 
-    Py_DECREF(py_args);
-
     if (retval == NULL) {
         PyErr_Print();
         goto end;
@@ -134,22 +134,20 @@ _pygi_closure_handle (ffi_cif *cif,
     *(GArgument*)result = _pygi_argument_from_object(retval, return_type, return_transfer);
 
 end:
+    Py_XDECREF(py_args);
     g_base_info_unref((GIBaseInfo*)return_type);
 
     PyGILState_Release(state);
 
-    if (closure->user_data)
-        Py_XDECREF(closure->user_data);
-
     /* Now that the closure has finished we can make a decision about how
        to free it.  Scope call gets free'd at the end of wrap_g_function_info_invoke
-       scope notified will be freed,  when the notify is called and we can free async 
+       scope notified will be freed,  when the notify is called and we can free async
        anytime we want as long as its after we return from this function (you can't free the closure
        you are currently using!)
     */
     switch (closure->scope) {
     case GI_SCOPE_TYPE_CALL:
-    case GI_SCOPE_TYPE_NOTIFIED:        
+    case GI_SCOPE_TYPE_NOTIFIED:
         break;
     case GI_SCOPE_TYPE_ASYNC:
         /* Append this PyGICClosure to a list of closure that we will free
