summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Jerram <neil@ossau.uklinux.net>2009-10-02 22:18:52 +0100
committerNeil Jerram <neil@ossau.uklinux.net>2009-10-02 22:20:47 +0100
commitb25aa0b9373d2798469e0fe999cd915e8beedc4f (patch)
treea52083d17cd71cb53c7c0721d1317a1eb4cfbaf3
parent0eb934f1f0e4d607a13cb918f062054556e9694b (diff)
Change dynwind flag enums to #defines, for greater portability
Thanks to Inge Gutheil for raising this problem. * doc/ref/api-control.texi (Dynamic Wind): Remove doc for scm_t_dynwind_flags, and change uses of scm_t_dynwind_flags to int. Mention possible flags inside doc for scm_dynwind_begin instead. Similarly for scm_t_wind_flags. In this case the doc on possible flags is moved to after the four functions that can use them. * libguile/dynwind.c (scm_dynwind_begin): Change scm_t_dynwind_flags to int. (scm_dynwind_unwind_handler): Change scm_t_wind_flags to int. (scm_dynwind_rewind_handler): Ditto. (scm_dynwind_unwind_handler_with_scm): Ditto. (scm_dynwind_rewind_handler_with_scm): Ditto. * libguile/dynwind.h (SCM_F_DYNWIND_REWINDABLE): Use #define instead of typedef enum. (SCM_F_WIND_EXPLICITLY): Ditto. (function declarations): Change scm_t_dynwind_flags and scm_t_wind_flags to int. * test-suite/standalone/test-unwind.c (check_cont_body): Change scm_t_dynwind_flags to int.
-rw-r--r--doc/ref/api-control.texi55
-rw-r--r--libguile/dynwind.c14
-rw-r--r--libguile/dynwind.h25
-rw-r--r--test-suite/standalone/test-unwind.c2
4 files changed, 38 insertions, 58 deletions
diff --git a/doc/ref/api-control.texi b/doc/ref/api-control.texi
index 66fb99ef2..429dcaa1e 100644
--- a/doc/ref/api-control.texi
+++ b/doc/ref/api-control.texi
@@ -1276,21 +1276,7 @@ a-cont
@end lisp
@end deffn
-@deftp {C Type} scm_t_dynwind_flags
-This is an enumeration of several flags that modify the behavior of
-@code{scm_dynwind_begin}. The flags are listed in the following
-table.
-
-@table @code
-@item SCM_F_DYNWIND_REWINDABLE
-The dynamic context is @dfn{rewindable}. This means that it can be
-reentered non-locally (via the invokation of a continuation). The
-default is that a dynwind context can not be reentered non-locally.
-@end table
-
-@end deftp
-
-@deftypefn {C Function} void scm_dynwind_begin (scm_t_dynwind_flags flags)
+@deftypefn {C Function} void scm_dynwind_begin (int flags)
The function @code{scm_dynwind_begin} starts a new dynamic context and
makes it the `current' one.
@@ -1315,6 +1301,14 @@ or explicitly with @code{scm_dynwind_end}. You must make sure that a
dynwind context is indeed ended properly. If you fail to call
@code{scm_dynwind_end} for each @code{scm_dynwind_begin}, the behavior
is undefined.
+
+Possible flags are:
+@table @code
+@item SCM_F_DYNWIND_REWINDABLE
+The dynamic context is @dfn{rewindable}. This means that it can be
+reentered non-locally (via the invokation of a continuation). The
+default is that a dynwind context can not be reentered non-locally.
+@end table
@end deftypefn
@deftypefn {C Function} void scm_dynwind_end ()
@@ -1322,22 +1316,8 @@ End the current dynamic context explicitly and make the previous one
current.
@end deftypefn
-@deftp {C Type} scm_t_wind_flags
-This is an enumeration of several flags that modify the behavior of
-@code{scm_dynwind_unwind_handler} and
-@code{scm_dynwind_rewind_handler}. The flags are listed in the
-following table.
-
-@table @code
-@item SCM_F_WIND_EXPLICITLY
-@vindex SCM_F_WIND_EXPLICITLY
-The registered action is also carried out when the dynwind context is
-entered or left locally.
-@end table
-@end deftp
-
-@deftypefn {C Function} void scm_dynwind_unwind_handler (void (*func)(void *), void *data, scm_t_wind_flags flags)
-@deftypefnx {C Function} void scm_dynwind_unwind_handler_with_scm (void (*func)(SCM), SCM data, scm_t_wind_flags flags)
+@deftypefn {C Function} void scm_dynwind_unwind_handler (void (*func)(void *), void *data, int flags)
+@deftypefnx {C Function} void scm_dynwind_unwind_handler_with_scm (void (*func)(SCM), SCM data, int flags)
Arranges for @var{func} to be called with @var{data} as its arguments
when the current context ends implicitly. If @var{flags} contains
@code{SCM_F_WIND_EXPLICITLY}, @var{func} is also called when the
@@ -1347,8 +1327,8 @@ The function @code{scm_dynwind_unwind_handler_with_scm} takes care that
@var{data} is protected from garbage collection.
@end deftypefn
-@deftypefn {C Function} void scm_dynwind_rewind_handler (void (*func)(void *), void *data, scm_t_wind_flags flags)
-@deftypefnx {C Function} void scm_dynwind_rewind_handler_with_scm (void (*func)(SCM), SCM data, scm_t_wind_flags flags)
+@deftypefn {C Function} void scm_dynwind_rewind_handler (void (*func)(void *), void *data, int flags)
+@deftypefnx {C Function} void scm_dynwind_rewind_handler_with_scm (void (*func)(SCM), SCM data, int flags)
Arrange for @var{func} to be called with @var{data} as its argument when
the current context is restarted by rewinding the stack. When @var{flags}
contains @code{SCM_F_WIND_EXPLICITLY}, @var{func} is called immediately
@@ -1358,6 +1338,15 @@ The function @code{scm_dynwind_rewind_handler_with_scm} takes care that
@var{data} is protected from garbage collection.
@end deftypefn
+The possible flags for the preceding four functions are as follows.
+
+@table @code
+@item SCM_F_WIND_EXPLICITLY
+@vindex SCM_F_WIND_EXPLICITLY
+The registered action is also carried out when the dynwind context is
+entered or left locally.
+@end table
+
@deftypefn {C Function} void scm_dynwind_free (void *mem)
Arrange for @var{mem} to be freed automatically whenever the current
context is exited, whether normally or non-locally.
diff --git a/libguile/dynwind.c b/libguile/dynwind.c
index b34f9bef3..8e87f6098 100644
--- a/libguile/dynwind.c
+++ b/libguile/dynwind.c
@@ -154,7 +154,7 @@ static scm_t_bits tc16_winder;
#define WINDER_MARK_P(w) (SCM_SMOB_FLAGS(w) & WINDER_F_MARK)
void
-scm_dynwind_begin (scm_t_dynwind_flags flags)
+scm_dynwind_begin (int flags)
{
SCM f;
SCM_NEWSMOB (f, tc16_frame, 0);
@@ -192,8 +192,7 @@ scm_dynwind_end (void)
}
void
-scm_dynwind_unwind_handler (void (*proc) (void *), void *data,
- scm_t_wind_flags flags)
+scm_dynwind_unwind_handler (void (*proc) (void *), void *data, int flags)
{
SCM w;
SCM_NEWSMOB2 (w, tc16_winder, (scm_t_bits) proc, (scm_t_bits) data);
@@ -203,8 +202,7 @@ scm_dynwind_unwind_handler (void (*proc) (void *), void *data,
}
void
-scm_dynwind_rewind_handler (void (*proc) (void *), void *data,
- scm_t_wind_flags flags)
+scm_dynwind_rewind_handler (void (*proc) (void *), void *data, int flags)
{
SCM w;
SCM_NEWSMOB2 (w, tc16_winder, (scm_t_bits) proc, (scm_t_bits) data);
@@ -215,8 +213,7 @@ scm_dynwind_rewind_handler (void (*proc) (void *), void *data,
}
void
-scm_dynwind_unwind_handler_with_scm (void (*proc) (SCM), SCM data,
- scm_t_wind_flags flags)
+scm_dynwind_unwind_handler_with_scm (void (*proc) (SCM), SCM data, int flags)
{
SCM w;
scm_t_bits fl = ((flags&SCM_F_WIND_EXPLICITLY)? WINDER_F_EXPLICIT : 0);
@@ -226,8 +223,7 @@ scm_dynwind_unwind_handler_with_scm (void (*proc) (SCM), SCM data,
}
void
-scm_dynwind_rewind_handler_with_scm (void (*proc) (SCM), SCM data,
- scm_t_wind_flags flags)
+scm_dynwind_rewind_handler_with_scm (void (*proc) (SCM), SCM data, int flags)
{
SCM w;
SCM_NEWSMOB2 (w, tc16_winder, (scm_t_bits) proc, SCM_UNPACK (data));
diff --git a/libguile/dynwind.h b/libguile/dynwind.h
index b178bc429..a8209905f 100644
--- a/libguile/dynwind.h
+++ b/libguile/dynwind.h
@@ -43,26 +43,21 @@ SCM_INTERNAL void scm_init_dynwind (void);
SCM_API void scm_swap_bindings (SCM vars, SCM vals);
-typedef enum {
- SCM_F_DYNWIND_REWINDABLE = (1 << 0)
-} scm_t_dynwind_flags;
+/* Flags for scm_dynwind_begin. */
+#define SCM_F_DYNWIND_REWINDABLE 1
-typedef enum {
- SCM_F_WIND_EXPLICITLY = (1 << 0)
-} scm_t_wind_flags;
+/* Flags for scm_dynwind_unwind_handler(_with_scm) and
+ scm_dynwind_rewind_handler(_with_scm). */
+#define SCM_F_WIND_EXPLICITLY 1
-SCM_API void scm_dynwind_begin (scm_t_dynwind_flags);
+SCM_API void scm_dynwind_begin (int);
SCM_API void scm_dynwind_end (void);
-SCM_API void scm_dynwind_unwind_handler (void (*func) (void *), void *data,
- scm_t_wind_flags);
-SCM_API void scm_dynwind_rewind_handler (void (*func) (void *), void *data,
- scm_t_wind_flags);
+SCM_API void scm_dynwind_unwind_handler (void (*) (void *), void *, int);
+SCM_API void scm_dynwind_rewind_handler (void (*) (void *), void *, int);
-SCM_API void scm_dynwind_unwind_handler_with_scm (void (*func) (SCM), SCM data,
- scm_t_wind_flags);
-SCM_API void scm_dynwind_rewind_handler_with_scm (void (*func) (SCM), SCM data,
- scm_t_wind_flags);
+SCM_API void scm_dynwind_unwind_handler_with_scm (void (*) (SCM), SCM, int);
+SCM_API void scm_dynwind_rewind_handler_with_scm (void (*) (SCM), SCM, int);
SCM_API void scm_dynwind_free (void *mem);
diff --git a/test-suite/standalone/test-unwind.c b/test-suite/standalone/test-unwind.c
index 2b0291dd5..e9306371e 100644
--- a/test-suite/standalone/test-unwind.c
+++ b/test-suite/standalone/test-unwind.c
@@ -136,7 +136,7 @@ check_flag1 (const char *tag, void (*func)(void), int val)
SCM
check_cont_body (void *data)
{
- scm_t_dynwind_flags flags = (data? SCM_F_DYNWIND_REWINDABLE : 0);
+ int flags = (data? SCM_F_DYNWIND_REWINDABLE : 0);
int first;
SCM val;