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-engine.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-engine.c')
-rw-r--r-- | libguile/vm-engine.c | 8 |
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 |