diff --git a/gi/pygi-argument.c b/gi/pygi-argument.c
--- a/gi/pygi-argument.c
+++ b/gi/pygi-argument.c
@@ -1052,8 +1052,9 @@ array_item_error:
             switch (info_type) {
                 case GI_INFO_TYPE_CALLBACK:
                 {
-                    arg.v_pointer = _pygi_make_native_closure(
+                    PyGINativeClosure* closure = _pygi_make_native_closure(
                             (GICallableInfo*)info, object);
+                    arg.v_pointer = closure->closure;
                     break;
                 }
                 case GI_INFO_TYPE_BOXED:
diff --git a/gi/pygi-closure.c b/gi/pygi-closure.c
--- a/gi/pygi-closure.c
+++ b/gi/pygi-closure.c
@@ -114,10 +114,12 @@ _pygi_make_native_closure (GICallableInf
     fficlosure = g_callable_info_prepare_closure(info, cif,
                                                  _pygi_handle_closure, closure);
 
+    closure->closure = fficlosure;
+
     dict = PyObject_GetAttrString(function, "__dict__");
     PyObject_SetItem(dict, PyString_FromString("__pygi_native_closure"),
                             PyCObject_FromVoidPtr(closure, NULL));                       
 
-    return fficlosure;
+    return closure;
 }
 
diff --git a/gi/pygi-closure.h b/gi/pygi-closure.h
--- a/gi/pygi-closure.h
+++ b/gi/pygi-closure.h
@@ -33,6 +33,7 @@ typedef struct _PyGiNativeClosure
 {
     GICallableInfo *info;
     PyObject *function;
+    ffi_closure *closure;
 } PyGINativeClosure;
 
 void     _pygi_handle_closure(ffi_cif *cif, void *result, void **args,
