From 9d87158fdb1c3159db90911e96d833392a02ff58 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Thu, 17 Oct 2013 23:24:16 +0200 Subject: [PATCH] RTL engine can apply smobs and applicable structs w/o stack VM * libguile/vm-engine.c (rtl_vm_engine): Allow the RTL VM to handle the dispatch for SMOBs and applicable structs. --- libguile/vm-engine.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index 540e439cc..095f0bcc8 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -898,7 +898,6 @@ RTL_VM_NAME (SCM vm, SCM program, SCM *argv, size_t nargs_) apply: while (!SCM_RTL_PROGRAM_P (SCM_FRAME_PROGRAM (fp))) { -#if 0 SCM proc = SCM_FRAME_PROGRAM (fp); if (SCM_STRUCTP (proc) && SCM_STRUCT_APPLICABLE_P (proc)) @@ -910,28 +909,30 @@ RTL_VM_NAME (SCM vm, SCM program, SCM *argv, size_t nargs_) { scm_t_uint32 n = FRAME_LOCALS_COUNT(); - /* Shuffle args up, place smob in local 0. */ - CHECK_OVERFLOW (vp->sp + 1); - vp->sp++; + /* Shuffle args up. */ + RESET_FRAME (n + 1); while (n--) LOCAL_SET (n + 1, LOCAL_REF (n)); - fp[-1] = SCM_SMOB_DESCRIPTOR (proc).apply_trampoline; + LOCAL_SET (0, SCM_SMOB_DESCRIPTOR (proc).apply_trampoline); continue; } +#if 0 SYNC_IP(); vm_error_wrong_type_apply (proc); #else - SCM ret; - SYNC_ALL (); + { + SCM ret; + SYNC_ALL (); - ret = VM_NAME (vm, fp[-1], fp, FRAME_LOCALS_COUNT () - 1); + ret = VM_NAME (vm, fp[-1], fp, FRAME_LOCALS_COUNT () - 1); - if (SCM_UNLIKELY (SCM_VALUESP (ret))) - RETURN_VALUE_LIST (scm_struct_ref (ret, SCM_INUM0)); - else - RETURN_ONE_VALUE (ret); + if (SCM_UNLIKELY (SCM_VALUESP (ret))) + RETURN_VALUE_LIST (scm_struct_ref (ret, SCM_INUM0)); + else + RETURN_ONE_VALUE (ret); + } #endif } -- 2.20.1