1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-12 06:41:13 +02:00

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.
This commit is contained in:
Neil Jerram 2009-10-02 22:18:52 +01:00
parent 0eb934f1f0
commit b25aa0b937
4 changed files with 38 additions and 58 deletions

View file

@ -1276,21 +1276,7 @@ a-cont
@end lisp @end lisp
@end deffn @end deffn
@deftp {C Type} scm_t_dynwind_flags @deftypefn {C Function} void scm_dynwind_begin (int 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)
The function @code{scm_dynwind_begin} starts a new dynamic context and The function @code{scm_dynwind_begin} starts a new dynamic context and
makes it the `current' one. 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 dynwind context is indeed ended properly. If you fail to call
@code{scm_dynwind_end} for each @code{scm_dynwind_begin}, the behavior @code{scm_dynwind_end} for each @code{scm_dynwind_begin}, the behavior
is undefined. 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 @end deftypefn
@deftypefn {C Function} void scm_dynwind_end () @deftypefn {C Function} void scm_dynwind_end ()
@ -1322,22 +1316,8 @@ End the current dynamic context explicitly and make the previous one
current. current.
@end deftypefn @end deftypefn
@deftp {C Type} scm_t_wind_flags @deftypefn {C Function} void scm_dynwind_unwind_handler (void (*func)(void *), void *data, int flags)
This is an enumeration of several flags that modify the behavior of @deftypefnx {C Function} void scm_dynwind_unwind_handler_with_scm (void (*func)(SCM), SCM data, int flags)
@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)
Arranges for @var{func} to be called with @var{data} as its arguments Arranges for @var{func} to be called with @var{data} as its arguments
when the current context ends implicitly. If @var{flags} contains when the current context ends implicitly. If @var{flags} contains
@code{SCM_F_WIND_EXPLICITLY}, @var{func} is also called when the @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. @var{data} is protected from garbage collection.
@end deftypefn @end deftypefn
@deftypefn {C Function} void scm_dynwind_rewind_handler (void (*func)(void *), void *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, scm_t_wind_flags 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 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} the current context is restarted by rewinding the stack. When @var{flags}
contains @code{SCM_F_WIND_EXPLICITLY}, @var{func} is called immediately 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. @var{data} is protected from garbage collection.
@end deftypefn @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) @deftypefn {C Function} void scm_dynwind_free (void *mem)
Arrange for @var{mem} to be freed automatically whenever the current Arrange for @var{mem} to be freed automatically whenever the current
context is exited, whether normally or non-locally. context is exited, whether normally or non-locally.

View file

@ -154,7 +154,7 @@ static scm_t_bits tc16_winder;
#define WINDER_MARK_P(w) (SCM_SMOB_FLAGS(w) & WINDER_F_MARK) #define WINDER_MARK_P(w) (SCM_SMOB_FLAGS(w) & WINDER_F_MARK)
void void
scm_dynwind_begin (scm_t_dynwind_flags flags) scm_dynwind_begin (int flags)
{ {
SCM f; SCM f;
SCM_NEWSMOB (f, tc16_frame, 0); SCM_NEWSMOB (f, tc16_frame, 0);
@ -192,8 +192,7 @@ scm_dynwind_end (void)
} }
void void
scm_dynwind_unwind_handler (void (*proc) (void *), void *data, scm_dynwind_unwind_handler (void (*proc) (void *), void *data, int flags)
scm_t_wind_flags flags)
{ {
SCM w; SCM w;
SCM_NEWSMOB2 (w, tc16_winder, (scm_t_bits) proc, (scm_t_bits) data); 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 void
scm_dynwind_rewind_handler (void (*proc) (void *), void *data, scm_dynwind_rewind_handler (void (*proc) (void *), void *data, int flags)
scm_t_wind_flags flags)
{ {
SCM w; SCM w;
SCM_NEWSMOB2 (w, tc16_winder, (scm_t_bits) proc, (scm_t_bits) data); 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 void
scm_dynwind_unwind_handler_with_scm (void (*proc) (SCM), SCM data, scm_dynwind_unwind_handler_with_scm (void (*proc) (SCM), SCM data, int flags)
scm_t_wind_flags flags)
{ {
SCM w; SCM w;
scm_t_bits fl = ((flags&SCM_F_WIND_EXPLICITLY)? WINDER_F_EXPLICIT : 0); 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 void
scm_dynwind_rewind_handler_with_scm (void (*proc) (SCM), SCM data, scm_dynwind_rewind_handler_with_scm (void (*proc) (SCM), SCM data, int flags)
scm_t_wind_flags flags)
{ {
SCM w; SCM w;
SCM_NEWSMOB2 (w, tc16_winder, (scm_t_bits) proc, SCM_UNPACK (data)); SCM_NEWSMOB2 (w, tc16_winder, (scm_t_bits) proc, SCM_UNPACK (data));

View file

@ -43,26 +43,21 @@ SCM_INTERNAL void scm_init_dynwind (void);
SCM_API void scm_swap_bindings (SCM vars, SCM vals); SCM_API void scm_swap_bindings (SCM vars, SCM vals);
typedef enum { /* Flags for scm_dynwind_begin. */
SCM_F_DYNWIND_REWINDABLE = (1 << 0) #define SCM_F_DYNWIND_REWINDABLE 1
} scm_t_dynwind_flags;
typedef enum { /* Flags for scm_dynwind_unwind_handler(_with_scm) and
SCM_F_WIND_EXPLICITLY = (1 << 0) scm_dynwind_rewind_handler(_with_scm). */
} scm_t_wind_flags; #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_end (void);
SCM_API void scm_dynwind_unwind_handler (void (*func) (void *), void *data, SCM_API void scm_dynwind_unwind_handler (void (*) (void *), void *, int);
scm_t_wind_flags); SCM_API void scm_dynwind_rewind_handler (void (*) (void *), void *, int);
SCM_API void scm_dynwind_rewind_handler (void (*func) (void *), void *data,
scm_t_wind_flags);
SCM_API void scm_dynwind_unwind_handler_with_scm (void (*func) (SCM), SCM data, SCM_API void scm_dynwind_unwind_handler_with_scm (void (*) (SCM), SCM, int);
scm_t_wind_flags); SCM_API void scm_dynwind_rewind_handler_with_scm (void (*) (SCM), SCM, int);
SCM_API void scm_dynwind_rewind_handler_with_scm (void (*func) (SCM), SCM data,
scm_t_wind_flags);
SCM_API void scm_dynwind_free (void *mem); SCM_API void scm_dynwind_free (void *mem);

View file

@ -136,7 +136,7 @@ check_flag1 (const char *tag, void (*func)(void), int val)
SCM SCM
check_cont_body (void *data) 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; int first;
SCM val; SCM val;