diff options
author | Andy Wingo <wingo@pobox.com> | 2018-08-11 10:48:29 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2018-08-11 11:36:58 +0200 |
commit | ef4c1a5f55f058df39af381f9a3dcdaf1bf219c2 (patch) | |
tree | 2a7c450f07bdcd99ca658a86bdb570b51836d140 /libguile/vm.c | |
parent | c3ff72cb811fef427f547063b7bb327f2a21e2df (diff) | |
download | guile-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.c | 12 |
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"); |