summaryrefslogtreecommitdiff
path: root/libguile/vm-i-system.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2010-02-18 18:42:54 +0100
committerAndy Wingo <wingo@pobox.com>2010-02-18 22:15:44 +0100
commite084b27e7913acf6e9414d1ff46f0bd9442e71fd (patch)
tree676b52bb698949e75103a5504facd4f5e5a96fc4 /libguile/vm-i-system.c
parentd7c53a86954e16f1d6c76cab2c41889ba9133488 (diff)
downloadguile-e084b27e7913acf6e9414d1ff46f0bd9442e71fd.tar.gz
add wind-fluids, unwind-fluids VM ops
* libguile/vm-i-system.c (wind-fluids, unwind-fluids): New instructions, for dynamic binding.
Diffstat (limited to 'libguile/vm-i-system.c')
-rw-r--r--libguile/vm-i-system.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c
index 6827e79ad..003bdb443 100644
--- a/libguile/vm-i-system.c
+++ b/libguile/vm-i-system.c
@@ -1532,6 +1532,28 @@ VM_DEFINE_INSTRUCTION (87, unwind, "unwind", 0, 0, 0)
NEXT;
}
+VM_DEFINE_INSTRUCTION (90, wind_fluids, "wind-fluids", 1, -1, 0)
+{
+ unsigned n = FETCH ();
+ SCM wf;
+
+ if (sp - 2*n < SCM_FRAME_UPPER_ADDRESS (fp))
+ goto vm_error_stack_underflow;
+
+ wf = scm_i_make_with_fluids (n, sp + 1 - 2*n, sp + 1 - n);
+ scm_i_swap_with_fluids (wf, SCM_I_CURRENT_THREAD->dynamic_state);
+ scm_i_set_dynwinds (scm_cons (wf, scm_i_dynwinds ()));
+ NEXT;
+}
+
+VM_DEFINE_INSTRUCTION (91, unwind_fluids, "unwind-fluids", 0, 0, 0)
+{
+ SCM wf;
+ wf = scm_car (scm_i_dynwinds ());
+ scm_i_set_dynwinds (scm_cdr (scm_i_dynwinds ()));
+ scm_i_swap_with_fluids (wf, SCM_I_CURRENT_THREAD->dynamic_state);
+ NEXT;
+}
/*