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
{
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;
(proc* (pointer->procedure void pointer '())))
(proc*)
called?)
+ (throw 'unresolved)))
+
+ (pass-if "procedure is retained"
+ ;; The lambda passed to `procedure->pointer' must remain live.
+ (if (defined? 'procedure->pointer)
+ (let* ((ptr (procedure->pointer int
+ (lambda (x) (+ x 7))
+ (list int)))
+ (procs (unfold (cut >= <> 10000)
+ (lambda (i)
+ (pointer->procedure int ptr (list int)))
+ 1+
+ 0)))
+ (gc) (gc) (gc)
+ (every (cut = <> 9)
+ (map (lambda (f) (f 2)) procs)))
(throw 'unresolved))))
\f