diff options
author | Andy Wingo <wingo@pobox.com> | 2018-04-29 10:41:24 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2018-04-29 10:41:24 +0200 |
commit | 89fda6da60b54ed606c67a7e4cc07c8f01a67b6b (patch) | |
tree | 09985001b8f14028f63108a15f10a7d996f04914 /libguile/vm-engine.c | |
parent | 2eb9c755d1db5d5baedd6594d6385a9b98ad8fcf (diff) | |
download | guile-89fda6da60b54ed606c67a7e4cc07c8f01a67b6b.tar.gz |
push and pop dynamic state via intrinsics
* libguile/intrinsics.c (push_dynamic_state, pop_dynamic_state): New
intrinsics.
(scm_bootstrap_intrinsics): Add new intrinsics.
* libguile/intrinsics.h: Declare new intrinsics.
* libguile/vm-engine.c (call-thread-scm): New intrinsic caller.
(push-dynamic-state, pop-dynamic-state): Disable.
* module/language/cps/reify-primitives.scm (compute-known-primitives):
Add new intrinsics.
* module/system/vm/assembler.scm (push-dynamic-state)
(pop-dynamic-state): Emit as intrinsics.
Diffstat (limited to 'libguile/vm-engine.c')
-rw-r--r-- | libguile/vm-engine.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index 67fd767f3..17eca96b6 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -2271,7 +2271,21 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp, NEXT (2); } - VM_DEFINE_OP (90, unused_90, NULL, NOP) + VM_DEFINE_OP (90, call_thread_scm, "call-thread-scm", OP2 (X8_S24, C32)) + { + scm_t_uint32 a; + scm_t_thread_scm_intrinsic intrinsic; + + UNPACK_24 (op, a); + intrinsic = intrinsics[ip[1]]; + + SYNC_IP (); + intrinsic (thread, SP_REF (a)); + CACHE_SP (); + + NEXT (2); + } + VM_DEFINE_OP (91, unused_91, NULL, NOP) VM_DEFINE_OP (92, unused_92, NULL, NOP) VM_DEFINE_OP (93, unused_93, NULL, NOP) @@ -2808,12 +2822,7 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp, NEXT (0); } - /* push-dynamic-state state:24 - * - * Save the current fluid bindings on the dynamic stack, and use STATE - * instead. - */ - VM_DEFINE_OP (185, push_dynamic_state, "push-dynamic-state", OP1 (X8_S24)) + VM_DEFINE_OP (185, unused_185, NULL, NOP) { scm_t_uint32 state; @@ -2825,11 +2834,7 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp, NEXT (1); } - /* pop-dynamic-state _:24 - * - * Restore the saved fluid bindings from the dynamic stack. - */ - VM_DEFINE_OP (186, pop_dynamic_state, "pop-dynamic-state", OP1 (X32)) + VM_DEFINE_OP (186, unused_186, NULL, NOP) { SYNC_IP (); scm_dynstack_unwind_dynamic_state (&thread->dynstack, |