summaryrefslogtreecommitdiff
path: root/libguile/vm.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2018-08-11 14:22:32 +0200
committerAndy Wingo <wingo@pobox.com>2018-08-11 14:25:07 +0200
commit939b1ae23f680365fb6fd0a78653a281aaed95b6 (patch)
tree969e96ccfb96c4399978ee9af86e9783674fe7b0 /libguile/vm.c
parent602702772412ffcf2476afa0a41b4e290fb67f59 (diff)
downloadguile-939b1ae23f680365fb6fd0a78653a281aaed95b6.tar.gz
Rework foreign-call trampoline
* libguile/foreign.c (scm_i_foreign_call): Rename back from foreign_call. Need a new trampoline that's easier to call from JIT, until we actually rewrite the FFI in terms of the JIT. (scm_register_foreign): Remove foreign_call intrinsic init. * libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): Foreign-call intrinsic sets return directly on stack. * libguile/vm-engine.c (foreign-call): Adapt to new intrinsic behavior. * libguile/vm.c (foreign_call, scm_bootstrap_vm): Add new intrinsic wrapper.
Diffstat (limited to 'libguile/vm.c')
-rw-r--r--libguile/vm.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/libguile/vm.c b/libguile/vm.c
index 3159aca25..d4750056b 100644
--- a/libguile/vm.c
+++ b/libguile/vm.c
@@ -1194,6 +1194,19 @@ unpack_values_object (scm_thread *thread, SCM obj)
SCM_FRAME_LOCAL (thread->vm.fp, n) = scm_i_value_ref (obj, n);
}
+static void
+foreign_call (scm_thread *thread, SCM cif, SCM pointer)
+{
+ SCM ret;
+ int err = 0;
+
+ ret = scm_i_foreign_call (cif, pointer, &err, thread->vm.sp);
+
+ alloc_frame (thread, 2);
+ SCM_FRAME_LOCAL (thread->vm.fp, 0) = ret;
+ SCM_FRAME_LOCAL (thread->vm.fp, 1) = scm_from_int (err);
+}
+
static SCM
capture_delimited_continuation (struct scm_vm *vp,
union scm_vm_stack_element *saved_fp,
@@ -1701,6 +1714,7 @@ scm_bootstrap_vm (void)
scm_vm_intrinsics.invoke_return_hook = invoke_return_hook;
scm_vm_intrinsics.invoke_next_hook = invoke_next_hook;
scm_vm_intrinsics.invoke_abort_hook = invoke_abort_hook;
+ scm_vm_intrinsics.foreign_call = foreign_call;
sym_keyword_argument_error = scm_from_latin1_symbol ("keyword-argument-error");
sym_regular = scm_from_latin1_symbol ("regular");