summaryrefslogtreecommitdiff
path: root/libguile/vm.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2018-08-11 10:48:29 +0200
committerAndy Wingo <wingo@pobox.com>2018-08-11 11:36:58 +0200
commitef4c1a5f55f058df39af381f9a3dcdaf1bf219c2 (patch)
tree2a7c450f07bdcd99ca658a86bdb570b51836d140 /libguile/vm.c
parentc3ff72cb811fef427f547063b7bb327f2a21e2df (diff)
downloadguile-ef4c1a5f55f058df39af381f9a3dcdaf1bf219c2.tar.gz
Add unpack-values-object intrinsic
* libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): Add unpack-values-object. * libguile/vm-engine.c (subr-call): If the object is a values object, call out to unpack-values-object. This is to avoid reifying allocate-frame code in each jitted subr. * libguile/vm.c (unpack_values_object, scm_bootstrap_vm): Define new intrinsic.
Diffstat (limited to 'libguile/vm.c')
-rw-r--r--libguile/vm.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/libguile/vm.c b/libguile/vm.c
index 8ad8cfe3f..9dc94f8d3 100644
--- a/libguile/vm.c
+++ b/libguile/vm.c
@@ -1183,6 +1183,17 @@ rest_arg_length (SCM x)
return len;
}
+/* This is here to avoid putting the code for "alloc-frame" in subr
+ calls. */
+static void
+unpack_values_object (scm_thread *thread, SCM obj)
+{
+ size_t n, nvals = scm_i_nvalues (obj);
+ alloc_frame (thread, nvals);
+ for (n = 0; n < nvals; n++)
+ SCM_FRAME_LOCAL (thread->vm.fp, n) = scm_i_value_ref (obj, n);
+}
+
static SCM
capture_delimited_continuation (struct scm_vm *vp,
union scm_vm_stack_element *saved_fp,
@@ -1685,6 +1696,7 @@ scm_bootstrap_vm (void)
scm_vm_intrinsics.rest_arg_length = rest_arg_length;
scm_vm_intrinsics.abort_to_prompt = abort_to_prompt;
scm_vm_intrinsics.get_callee_vcode = get_callee_vcode;
+ scm_vm_intrinsics.unpack_values_object = unpack_values_object;
sym_keyword_argument_error = scm_from_latin1_symbol ("keyword-argument-error");
sym_regular = scm_from_latin1_symbol ("regular");