build: Don't include <config.h> in native programs when cross-compiling.
[bpt/guile.git] / libguile / root.c
index 07209c9..8c8fd1a 100644 (file)
@@ -1,22 +1,26 @@
-/* Copyright (C) 1995,1996,1997,1998,1999,2000, 2001, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1995,1996,1997,1998,1999,2000, 2001, 2002, 2006, 2008, 2009 Free Software Foundation, Inc.
  * 
  * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 3 of
+ * the License, or (at your option) any later version.
  *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
  */
 
 
 \f
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
 
 #include <string.h>
 #include <stdio.h>
 #include "libguile/root.h"
 \f
 
-SCM scm_sys_protects[SCM_NUM_PROTECTS];
-
-\f
-
 /* {call-with-dynamic-root}
  *
  * Suspending the current thread to evaluate a thunk on the
@@ -116,14 +116,15 @@ scm_internal_cwdr (scm_t_catch_body body, void *body_data,
   old_winds = scm_i_dynwinds ();
   scm_dowinds (SCM_EOL, scm_ilength (old_winds));
 
-  scm_frame_begin (SCM_F_FRAME_REWINDABLE);
-  scm_frame_current_dynamic_state (scm_make_dynamic_state (SCM_UNDEFINED));
+  scm_dynwind_begin (SCM_F_DYNWIND_REWINDABLE);
+  scm_dynwind_current_dynamic_state (scm_make_dynamic_state (SCM_UNDEFINED));
 
   my_handler_data.run_handler = 0;
   answer = scm_i_with_continuation_barrier (body, body_data,
-                                           cwdr_handler, &my_handler_data);
+                                           cwdr_handler, &my_handler_data,
+                                           NULL, NULL);
 
-  scm_frame_end ();
+  scm_dynwind_end ();
 
   /* Enter caller's dynamic state.
    */
@@ -154,41 +155,10 @@ cwdr (SCM proc, SCM a1, SCM args, SCM handler, SCM_STACKITEM *stack_start)
 
 SCM_DEFINE (scm_call_with_dynamic_root, "call-with-dynamic-root", 2, 0, 0,
            (SCM thunk, SCM handler),
-           "Evaluate @code{(thunk)} in a new dynamic context, returning its value.\n\n"
-           "If an error occurs during evaluation, apply @var{handler} to the\n"
-           "arguments to the throw, just as @code{throw} would.  If this happens,\n"
-           "@var{handler} is called outside the scope of the new root -- it is\n"
-           "called in the same dynamic context in which\n"
-           "@code{call-with-dynamic-root} was evaluated.\n\n"
-           "If @var{thunk} captures a continuation, the continuation is rooted at\n"
-           "the call to @var{thunk}.  In particular, the call to\n"
-           "@code{call-with-dynamic-root} is not captured.  Therefore,\n"
-           "@code{call-with-dynamic-root} always returns at most one time.\n\n"
-           "Before calling @var{thunk}, the dynamic-wind chain is un-wound back to\n"
-           "the root and a new chain started for @var{thunk}.  Therefore, this call\n"
-           "may not do what you expect:\n\n"
-           "@lisp\n"
-           ";; Almost certainly a bug:\n"
-           "(with-output-to-port\n"
-           " some-port\n\n"
-           " (lambda ()\n"
-           "   (call-with-dynamic-root\n"
-           "    (lambda ()\n"
-           "      (display 'fnord)\n"
-           "      (newline))\n"
-           "    (lambda (errcode) errcode))))\n"
-           "@end lisp\n\n"
-           "The problem is, on what port will @samp{fnord} be displayed?  You\n"
-           "might expect that because of the @code{with-output-to-port} that\n"
-           "it will be displayed on the port bound to @code{some-port}.  But it\n"
-           "probably won't -- before evaluating the thunk, dynamic winds are\n"
-           "unwound, including those created by @code{with-output-to-port}.\n"
-           "So, the standard output port will have been re-set to its default value\n"
-           "before @code{display} is evaluated.\n\n"
-           "(This function was added to Guile mostly to help calls to functions in C\n"
-           "libraries that can not tolerate non-local exits or calls that return\n"
-           "multiple times.  If such functions call back to the interpreter, it should\n"
-           "be under a new dynamic root.)")
+           "Call @var{thunk} with a new dynamic state and within\n"
+           "a continuation barrier.  The @var{handler} catches all\n"
+           "otherwise uncaught throws and executes within the same\n"
+           "dynamic context as @var{thunk}.")
 #define FUNC_NAME s_scm_call_with_dynamic_root
 {
   SCM_STACKITEM stack_place;