1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-14 15:40:19 +02:00

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.
This commit is contained in:
Andy Wingo 2018-08-11 10:48:29 +02:00
parent c3ff72cb81
commit ef4c1a5f55
3 changed files with 15 additions and 6 deletions

View file

@ -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