summaryrefslogtreecommitdiff
path: root/libguile/vm-engine.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-engine.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-engine.c')
-rw-r--r--libguile/vm-engine.c8
1 files changed, 2 insertions, 6 deletions
diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c
index b22dee920..775081580 100644
--- a/libguile/vm-engine.c
+++ b/libguile/vm-engine.c
@@ -595,14 +595,10 @@ VM_NAME (scm_thread *thread)
SYNC_IP ();
ret = scm_apply_subr (sp, idx, FRAME_LOCALS_COUNT ());
- CACHE_SP ();
-
if (SCM_UNLIKELY (scm_is_values (ret)))
{
- size_t n, nvals = scm_i_nvalues (ret);
- ALLOC_FRAME (nvals);
- for (n = 0; n < nvals; n++)
- FP_SET (n, scm_i_value_ref (ret, n));
+ CALL_INTRINSIC (unpack_values_object, (thread, ret));
+ CACHE_SP ();
NEXT (1);
}
else