diff options
author | Andy Wingo <wingo@pobox.com> | 2018-06-27 13:38:30 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2018-06-27 13:38:30 +0200 |
commit | 1735cc1fec419d6aee5787c79f5ac5727bfada5d (patch) | |
tree | e890787cbaf49714d35a815cd78887d065396442 /libguile/vm-engine.c | |
parent | adf8d9353e8da1b70a6bcbd69d0e50559ffa650d (diff) | |
download | guile-1735cc1fec419d6aee5787c79f5ac5727bfada5d.tar.gz |
Apply-non-program is an intrinsic
* libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): Add
apply-non-program intrinsic.
* libguile/vm-engine.c (apply-non-program): Replace impl with call to
intrinsic.
* libguile/vm.c (vm_error_wrong_type_apply): Inline into
apply_non_program intrinsic.
(apply_non_program): New intrinsic.
(scm_bootstrap_vm): Wire it up.
Diffstat (limited to 'libguile/vm-engine.c')
-rw-r--r-- | libguile/vm-engine.c | 33 |
1 files changed, 3 insertions, 30 deletions
diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index 0cf1a0c30..023632975 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -2033,36 +2033,9 @@ VM_NAME (scm_thread *thread, jmp_buf *registers, int resume) */ VM_DEFINE_OP (142, apply_non_program, "apply-non-program", OP1 (X32)) { - SCM proc = FP_REF (0); - - while (!SCM_PROGRAM_P (proc)) - { - if (SCM_STRUCTP (proc) && SCM_STRUCT_APPLICABLE_P (proc)) - { - proc = SCM_STRUCT_PROCEDURE (proc); - FP_SET (0, proc); - continue; - } - if (SCM_HAS_TYP7 (proc, scm_tc7_smob) && SCM_SMOB_APPLICABLE_P (proc)) - { - uint32_t n = FRAME_LOCALS_COUNT(); - - /* Shuffle args up. (FIXME: no real need to shuffle; just set - IP and go. ) */ - ALLOC_FRAME (n + 1); - while (n--) - FP_SET (n + 1, FP_REF (n)); - - proc = SCM_SMOB_DESCRIPTOR (proc).apply_trampoline; - FP_SET (0, proc); - continue; - } - - SYNC_IP(); - vm_error_wrong_type_apply (proc); - } - - ip = SCM_PROGRAM_CODE (proc); + SYNC_IP (); + scm_vm_intrinsics.apply_non_program (thread); + CACHE_REGISTER (); NEXT (0); } |