summaryrefslogtreecommitdiff
path: root/libguile/dynwind.c
diff options
context:
space:
mode:
authorMikael Djurfeldt <djurfeldt@nada.kth.se>1999-07-27 19:08:39 +0000
committerMikael Djurfeldt <djurfeldt@nada.kth.se>1999-07-27 19:08:39 +0000
commit6778caf93eb486bd66c1a422adbcca1022bbdfd2 (patch)
tree943e9f66bd9017192faf3041fe74146ec0b9aadf /libguile/dynwind.c
parent094ce85606897b9313661c4af4ceac138a5e6741 (diff)
downloadguile-6778caf93eb486bd66c1a422adbcca1022bbdfd2.tar.gz
* dynwind.c (scm_dowinds): Removed obsolete wind_key #f case.
(scm_dynamic_wind): Added argument checking for the after guard so that we don't add garbage on the dynwind chain. (scm_swap_bindings): Added.
Diffstat (limited to 'libguile/dynwind.c')
-rw-r--r--libguile/dynwind.c57
1 files changed, 41 insertions, 16 deletions
diff --git a/libguile/dynwind.c b/libguile/dynwind.c
index 2cc4f1041..f570594f1 100644
--- a/libguile/dynwind.c
+++ b/libguile/dynwind.c
@@ -75,6 +75,9 @@ scm_dynamic_wind (thunk1, thunk2, thunk3)
SCM thunk3;
{
SCM ans;
+ SCM_ASSERT (SCM_NFALSEP (scm_thunk_p (thunk3)),
+ thunk3,
+ SCM_ARG3, s_dynamic_wind);
scm_apply (thunk1, SCM_EOL, SCM_EOL);
scm_dynwinds = scm_acons (thunk1, thunk3, scm_dynwinds);
ans = scm_apply (thunk2, SCM_EOL, SCM_EOL);
@@ -150,6 +153,21 @@ scm_wind_chain ()
}
#endif
+#ifdef GUILE_LANG
+static void
+scm_swap_bindings (SCM glocs, SCM vals)
+{
+ SCM tmp;
+ while (SCM_NIMP (vals))
+ {
+ tmp = SCM_GLOC_VAL (SCM_CAR (glocs));
+ SCM_SETCDR (SCM_CAR (glocs) - 1L, SCM_CAR (vals));
+ SCM_SETCAR (vals, tmp);
+ glocs = SCM_CDR (glocs);
+ vals = SCM_CDR (vals);
+ }
+}
+#endif
void
scm_dowinds (to, delta)
@@ -174,16 +192,20 @@ scm_dowinds (to, delta)
#endif
{
wind_key = SCM_CAR (wind_elt);
- if (!(SCM_NIMP (wind_key) && SCM_SYMBOLP (wind_key))
- && (wind_key != SCM_BOOL_F)
- && (wind_key != SCM_BOOL_T))
+ /* key = #t | symbol | thunk | list of glocs | list of fluids */
+ if (SCM_NIMP (wind_key))
{
- if (SCM_NIMP (wind_key) && SCM_CONSP (wind_key))
- scm_swap_fluids (wind_key, SCM_CDR (wind_elt));
- else if (SCM_NIMP (wind_key) && SCM_GUARDSP (wind_key))
- SCM_BEFORE_GUARD (wind_key) (SCM_GUARD_DATA (wind_key));
+#ifdef GUILE_LANG
+ if (SCM_TYP3 (wind_key) == scm_tc3_cons_gloc)
+ scm_swap_bindings (wind_key, SCM_CDR (wind_elt));
else
- scm_apply (wind_key, SCM_EOL, SCM_EOL);
+#endif
+ if (SCM_TYP3 (wind_key) == scm_tc3_cons)
+ scm_swap_fluids (wind_key, SCM_CDR (wind_elt));
+ else if (SCM_GUARDSP (wind_key))
+ SCM_BEFORE_GUARD (wind_key) (SCM_GUARD_DATA (wind_key));
+ else if (SCM_TYP3 (wind_key) == scm_tc3_closure)
+ scm_apply (wind_key, SCM_EOL, SCM_EOL);
}
}
scm_dynwinds = to;
@@ -206,16 +228,19 @@ scm_dowinds (to, delta)
#endif
{
wind_key = SCM_CAR (wind_elt);
- if (!(SCM_NIMP (wind_key) && SCM_SYMBOLP (wind_key))
- && (wind_key != SCM_BOOL_F)
- && (wind_key != SCM_BOOL_T))
+ if (SCM_NIMP (wind_key))
{
- if (SCM_NIMP (wind_key) && SCM_CONSP (wind_key))
- scm_swap_fluids_reverse (wind_key, from);
- else if (SCM_NIMP (wind_key) && SCM_GUARDSP (wind_key))
- SCM_AFTER_GUARD (wind_key) (SCM_GUARD_DATA (wind_key));
+#ifdef GUILE_LANG
+ if (SCM_TYP3 (wind_key) == scm_tc3_cons_gloc)
+ scm_swap_bindings (wind_key, from);
else
- scm_apply (from, SCM_EOL, SCM_EOL);
+#endif
+ if (SCM_TYP3 (wind_key) == scm_tc3_cons)
+ scm_swap_fluids_reverse (wind_key, from);
+ else if (SCM_GUARDSP (wind_key))
+ SCM_AFTER_GUARD (wind_key) (SCM_GUARD_DATA (wind_key));
+ else if (SCM_TYP3 (wind_key) == scm_tc3_closure)
+ scm_apply (from, SCM_EOL, SCM_EOL);
}
}
delta--;