(environ): Use _NSGetEnviron in Darwin
[bpt/guile.git] / libguile / dynwind.c
index 1a02dd1..28dbb0d 100644 (file)
@@ -41,8 +41,6 @@
    (tag . lazy-catch)            lazy-catch
      tag is either a symbol or a boolean
 
-   ((fluid ...) . (value ...))   with-fluids
-
 */
 
 
@@ -121,11 +119,11 @@ scm_internal_dynamic_wind (scm_t_guard before,
 {
   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;
 }
 
@@ -138,9 +136,9 @@ static scm_t_bits tc16_frame;
 #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)
@@ -150,7 +148,7 @@ static scm_t_bits tc16_winder;
 #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);
@@ -159,23 +157,23 @@ scm_begin_frame (scm_t_frame_flags flags)
 }
 
 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);
@@ -190,8 +188,8 @@ winder_mark (SCM w)
 }
 
 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);
@@ -201,8 +199,8 @@ scm_on_unwind (void (*proc) (void *), void *data,
 }
 
 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,
@@ -213,8 +211,8 @@ scm_on_rewind (void (*proc) (void *), void *data,
 }
 
 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);
@@ -224,8 +222,8 @@ scm_on_unwind_with_scm (void (*proc) (SCM), SCM data,
 }
 
 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,
@@ -265,12 +263,11 @@ scm_swap_bindings (SCM vars, SCM vals)
 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))
@@ -283,8 +280,7 @@ scm_i_dowinds (SCM to, long delta, int explicit,
       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
@@ -305,24 +301,18 @@ scm_i_dowinds (SCM to, long delta, int explicit,
          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);
@@ -353,13 +343,8 @@ scm_i_dowinds (SCM to, long delta, int explicit,
            }
          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
            {
@@ -370,9 +355,6 @@ scm_i_dowinds (SCM to, long delta, int explicit,
                    {
                      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));