(tag . lazy-catch) lazy-catch
tag is either a symbol or a boolean
- ((fluid ...) . (value ...)) with-fluids
-
*/
{
SCM ans;
- scm_begin_frame (SCM_F_FRAME_REWINDABLE);
- scm_on_rewind (before, guard_data, SCM_F_WIND_EXPLICITLY);
- scm_on_unwind (after, guard_data, SCM_F_WIND_EXPLICITLY);
+ scm_frame_begin (SCM_F_FRAME_REWINDABLE);
+ scm_frame_rewind_handler (before, guard_data, SCM_F_WIND_EXPLICITLY);
+ scm_frame_unwind_handler (after, guard_data, SCM_F_WIND_EXPLICITLY);
ans = inner (inner_data);
- scm_end_frame ();
+ scm_frame_end ();
return ans;
}
#define FRAME_REWINDABLE_P(f) (SCM_CELL_WORD_0(f) & FRAME_F_REWINDABLE)
static scm_t_bits tc16_winder;
-#define WINDER_P(w) SCM_SMOB_PREDICATE (tc16_winder, (w))
-#define WINDER_PROC(w) ((void (*)(void *))SCM_CELL_WORD_1 (w))
-#define WINDER_DATA(w) ((void *)SCM_CELL_WORD_2 (w))
+#define WINDER_P(w) SCM_SMOB_PREDICATE (tc16_winder, (w))
+#define WINDER_PROC(w) ((void (*)(void *))SCM_CELL_WORD_1 (w))
+#define WINDER_DATA(w) ((void *)SCM_CELL_WORD_2 (w))
#define WINDER_F_EXPLICIT (1 << 16)
#define WINDER_F_REWIND (1 << 17)
#define WINDER_MARK_P(w) (SCM_CELL_WORD_0(w) & WINDER_F_MARK)
void
-scm_begin_frame (scm_t_frame_flags flags)
+scm_frame_begin (scm_t_frame_flags flags)
{
SCM f;
scm_t_bits fl = ((flags&SCM_F_FRAME_REWINDABLE)? FRAME_F_REWINDABLE : 0);
}
void
-scm_end_frame (void)
+scm_frame_end (void)
{
- long delta;
- SCM to;
-
- /* Unwind upto and including the next frame entry.
+ /* Unwind upto and including the next frame entry. We can only
+ encounter #<winder> entries on the way.
*/
- for (to = scm_dynwinds, delta = 1;
- SCM_CONSP (to);
- to = SCM_CDR (to), delta++)
+ while (SCM_CONSP (scm_dynwinds))
{
- if (FRAME_P (SCM_CAR (to)))
- {
- scm_i_dowinds (SCM_CDR (to), delta, 1, NULL, NULL);
- return;
- }
+ SCM entry = SCM_CAR (scm_dynwinds);
+ scm_dynwinds = SCM_CDR (scm_dynwinds);
+
+ if (FRAME_P (entry))
+ return;
+
+ assert (WINDER_P (entry));
+ if (!WINDER_REWIND_P (entry) && WINDER_EXPLICIT_P (entry))
+ WINDER_PROC(entry) (WINDER_DATA (entry));
}
assert (0);
}
void
-scm_on_unwind (void (*proc) (void *), void *data,
- scm_t_wind_flags flags)
+scm_frame_unwind_handler (void (*proc) (void *), void *data,
+ scm_t_wind_flags flags)
{
SCM w;
scm_t_bits fl = ((flags&SCM_F_WIND_EXPLICITLY)? WINDER_F_EXPLICIT : 0);
}
void
-scm_on_rewind (void (*proc) (void *), void *data,
- scm_t_wind_flags flags)
+scm_frame_rewind_handler (void (*proc) (void *), void *data,
+ scm_t_wind_flags flags)
{
SCM w;
SCM_NEWSMOB2 (w, tc16_winder | WINDER_F_REWIND,
}
void
-scm_on_unwind_with_scm (void (*proc) (SCM), SCM data,
- scm_t_wind_flags flags)
+scm_frame_unwind_handler_with_scm (void (*proc) (SCM), SCM data,
+ scm_t_wind_flags flags)
{
SCM w;
scm_t_bits fl = ((flags&SCM_F_WIND_EXPLICITLY)? WINDER_F_EXPLICIT : 0);
}
void
-scm_on_rewind_with_scm (void (*proc) (SCM), SCM data,
- scm_t_wind_flags flags)
+scm_frame_rewind_handler_with_scm (void (*proc) (SCM), SCM data,
+ scm_t_wind_flags flags)
{
SCM w;
SCM_NEWSMOB2 (w, tc16_winder | WINDER_F_REWIND | WINDER_F_MARK,
void
scm_dowinds (SCM to, long delta)
{
- scm_i_dowinds (to, delta, 0, NULL, NULL);
+ scm_i_dowinds (to, delta, NULL, NULL);
}
void
-scm_i_dowinds (SCM to, long delta, int explicit,
- void (*turn_func) (void *), void *data)
+scm_i_dowinds (SCM to, long delta, void (*turn_func) (void *), void *data)
{
tail:
if (SCM_EQ_P (to, scm_dynwinds))
SCM wind_elt;
SCM wind_key;
- scm_i_dowinds (SCM_CDR (to), 1 + delta, explicit,
- turn_func, data);
+ scm_i_dowinds (SCM_CDR (to), 1 + delta, turn_func, data);
wind_elt = SCM_CAR (to);
#if 0
else if (WINDER_P (wind_elt))
{
if (WINDER_REWIND_P (wind_elt))
- {
- void (*proc) (void *) = WINDER_PROC (wind_elt);
- void *data = WINDER_DATA (wind_elt);
- proc (data);
- }
+ WINDER_PROC (wind_elt) (WINDER_DATA (wind_elt));
}
else
{
wind_key = SCM_CAR (wind_elt);
- /* key = #t | symbol | thunk | list of variables | list of fluids */
+ /* key = #t | symbol | thunk | list of variables */
if (SCM_NIMP (wind_key))
{
if (SCM_CONSP (wind_key))
{
if (SCM_VARIABLEP (SCM_CAR (wind_key)))
scm_swap_bindings (wind_key, SCM_CDR (wind_elt));
- else if (SCM_FLUIDP (SCM_CAR (wind_key)))
- scm_i_swap_fluids (wind_key, SCM_CDR (wind_elt));
}
else if (SCM_TYP3 (wind_key) == scm_tc3_closure)
scm_call_0 (wind_key);
}
else if (WINDER_P (wind_elt))
{
- if (!WINDER_REWIND_P (wind_elt)
- && (!explicit || WINDER_EXPLICIT_P (wind_elt)))
- {
- void (*proc) (void *) = WINDER_PROC (wind_elt);
- void *data = WINDER_DATA (wind_elt);
- proc (data);
- }
+ if (!WINDER_REWIND_P (wind_elt))
+ WINDER_PROC (wind_elt) (WINDER_DATA (wind_elt));
}
else
{
{
if (SCM_VARIABLEP (SCM_CAR (wind_key)))
scm_swap_bindings (wind_key, SCM_CDR (wind_elt));
- else if (SCM_FLUIDP (SCM_CAR (wind_key)))
- scm_i_swap_fluids_reverse (wind_key,
- SCM_CDR (wind_elt));
}
else if (SCM_TYP3 (wind_key) == scm_tc3_closure)
scm_call_0 (SCM_CDR (wind_elt));