* convert.c: include <string.h> for convert_i.c.
[bpt/guile.git] / libguile / dynwind.c
index f0777ab..5970dc4 100644 (file)
@@ -39,8 +39,6 @@
  * whether to permit this exception to apply to your modifications.
  * If you do not wish that, delete this exception notice.  */
 
-/* Software engineering face-lift by Greg J. Badros, 11-Dec-1999,
-   gjb@cs.washington.edu, http://www.cs.washington.edu/homes/gjb */
 
 \f
 
@@ -84,7 +82,7 @@ SCM_DEFINE (scm_dynamic_wind, "dynamic-wind", 3, 0, 0,
            "@lisp\n"
            "(define x 'normal-binding)\n"
            "@result{} x\n"
-           "(define a-cont  (call-with-current-continuation \n"
+           "(define a-cont  (call-with-current-continuation\n"
            "             (lambda (escape)\n"
            "                (let ((old-x x))\n"
            "                  (dynamic-wind\n"
@@ -103,7 +101,7 @@ SCM_DEFINE (scm_dynamic_wind, "dynamic-wind", 3, 0, 0,
            "                     ;;\n"
            "                     (lambda () (set! x old-x)))))))\n"
            "\n"
-           ";; Prints: \n"
+           ";; Prints:\n"
            "special-binding\n"
            ";; Evaluates to:\n"
            "@result{} a-cont\n"
@@ -125,11 +123,11 @@ SCM_DEFINE (scm_dynamic_wind, "dynamic-wind", 3, 0, 0,
   SCM_ASSERT (SCM_NFALSEP (scm_thunk_p (out_guard)),
              out_guard,
              SCM_ARG3, FUNC_NAME);
-  scm_apply (in_guard, SCM_EOL, SCM_EOL);
+  scm_call_0 (in_guard);
   scm_dynwinds = scm_acons (in_guard, out_guard, scm_dynwinds);
-  ans = scm_apply (thunk, SCM_EOL, SCM_EOL);
+  ans = scm_call_0 (thunk);
   scm_dynwinds = SCM_CDR (scm_dynwinds);
-  scm_apply (out_guard, SCM_EOL, SCM_EOL);
+  scm_call_0 (out_guard);
   return ans;
 }
 #undef FUNC_NAME
@@ -186,16 +184,16 @@ SCM_DEFINE (scm_wind_chain, "wind-chain", 0, 0, 0,
 #undef FUNC_NAME
 #endif
 
-static void
-scm_swap_bindings (SCM glocs, SCM vals)
+void
+scm_swap_bindings (SCM vars, SCM vals)
 {
   SCM tmp;
   while (SCM_NIMP (vals))
     {
-      tmp = SCM_GLOC_VAL (SCM_CAR (glocs));
-      SCM_GLOC_SET_VAL (SCM_CAR (glocs), SCM_CAR (vals));
+      tmp = SCM_VARIABLE_REF (SCM_CAR (vars));
+      SCM_VARIABLE_SET (SCM_CAR (vars), SCM_CAR (vals));
       SCM_SETCAR (vals, tmp);
-      glocs = SCM_CDR (glocs);
+      vars = SCM_CDR (vars);
       vals = SCM_CDR (vals);
     }
 }
@@ -221,17 +219,20 @@ scm_dowinds (SCM to, long delta)
 #endif
        {
          wind_key = SCM_CAR (wind_elt);
-         /* key = #t | symbol | thunk | list of glocs | list of fluids */
+         /* key = #t | symbol | thunk | list of variables | list of fluids */
          if (SCM_NIMP (wind_key))
            {
-             if (SCM_TYP3 (wind_key) == scm_tc3_cons_gloc)
-               scm_swap_bindings (wind_key, SCM_CDR (wind_elt));
-             else if (SCM_TYP3 (wind_key) == scm_tc3_cons)
-               scm_swap_fluids (wind_key, SCM_CDR (wind_elt));
+             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_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_call_0 (wind_key);
            }
        }
       scm_dynwinds = to;
@@ -256,14 +257,17 @@ scm_dowinds (SCM to, long delta)
          wind_key = SCM_CAR (wind_elt);
          if (SCM_NIMP (wind_key))
            {
-             if (SCM_TYP3 (wind_key) == scm_tc3_cons_gloc)
-               scm_swap_bindings (wind_key, from);
-             else if (SCM_TYP3 (wind_key) == scm_tc3_cons)
-               scm_swap_fluids_reverse (wind_key, from);
+             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_swap_fluids_reverse (wind_key, SCM_CDR (wind_elt));
+               }
              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);
+               scm_call_0 (from);
            }
        }
       delta--;