summaryrefslogtreecommitdiff
path: root/libguile/foreign.c
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2011-11-26 22:27:32 +0100
committerLudovic Courtès <ludo@gnu.org>2011-11-26 22:27:32 +0100
commit59a0273338ca52dd920eef90439f95d313214a6b (patch)
tree34052f3557ed5a7f523b68b275b695f7418468b6 /libguile/foreign.c
parent4855c63441c5f11a58b8157c877e5890a7b0ffe1 (diff)
downloadguile-59a0273338ca52dd920eef90439f95d313214a6b.tar.gz
FFI: Hold a weak reference to the procedure passed to `procedure->pointer'.
* libguile/foreign.c (scm_procedure_to_pointer): Keep a weak reference to PROC. * test-suite/tests/foreign.test ("procedure->pointer")["procedure is retained"]: New test.
Diffstat (limited to 'libguile/foreign.c')
-rw-r--r--libguile/foreign.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/libguile/foreign.c b/libguile/foreign.c
index 021c183cf..f3af157b3 100644
--- a/libguile/foreign.c
+++ b/libguile/foreign.c
@@ -1152,7 +1152,8 @@ SCM_DEFINE (scm_procedure_to_pointer, "procedure->pointer", 3, 0, 0,
if (closure == executable)
{
pointer = scm_from_pointer (executable, ffi_closure_free);
- register_weak_reference (pointer, cif_pointer);
+ register_weak_reference (pointer,
+ scm_list_2 (proc, cif_pointer));
}
else
{
@@ -1166,7 +1167,8 @@ SCM_DEFINE (scm_procedure_to_pointer, "procedure->pointer", 3, 0, 0,
pointer = scm_from_pointer (executable, NULL);
friend = scm_from_pointer (closure, ffi_closure_free);
- register_weak_reference (pointer, scm_list_2 (cif_pointer, friend));
+ register_weak_reference (pointer,
+ scm_list_3 (proc, cif_pointer, friend));
}
return pointer;