mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-12 14:50:19 +02:00
* throw.h (scm_handle_by_proc_catching_all): New prototype
throw.c (scm_handle_by_proc_catching_all): New function
This commit is contained in:
parent
45113884d6
commit
1345df5d0d
2 changed files with 34 additions and 0 deletions
|
@ -428,6 +428,39 @@ scm_handle_by_proc (handler_data, tag, throw_args)
|
||||||
return scm_apply (*handler_proc_p, scm_cons (tag, throw_args), SCM_EOL);
|
return scm_apply (*handler_proc_p, scm_cons (tag, throw_args), SCM_EOL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* SCM_HANDLE_BY_PROC_CATCHING_ALL is like SCM_HANDLE_BY_PROC but
|
||||||
|
catches all throws that the handler might emit itself. The handler
|
||||||
|
used for these `secondary' throws is SCM_HANDLE_BY_MESSAGE_NO_EXIT. */
|
||||||
|
|
||||||
|
struct hbpca_data {
|
||||||
|
SCM proc;
|
||||||
|
SCM args;
|
||||||
|
};
|
||||||
|
|
||||||
|
static SCM
|
||||||
|
hbpca_body (body_data, jmpbuf)
|
||||||
|
void *body_data;
|
||||||
|
SCM jmpbuf;
|
||||||
|
{
|
||||||
|
struct hbpca_data *data = (struct hbpca_data *)body_data;
|
||||||
|
return scm_apply (data->proc, data->args, SCM_EOL);
|
||||||
|
}
|
||||||
|
|
||||||
|
SCM
|
||||||
|
scm_handle_by_proc_catching_all (handler_data, tag, throw_args)
|
||||||
|
void *handler_data;
|
||||||
|
SCM tag;
|
||||||
|
SCM throw_args;
|
||||||
|
{
|
||||||
|
SCM *handler_proc_p = (SCM *) handler_data;
|
||||||
|
struct hbpca_data data;
|
||||||
|
data.proc = *handler_proc_p;
|
||||||
|
data.args = scm_cons (tag, throw_args);
|
||||||
|
|
||||||
|
return scm_internal_catch (SCM_BOOL_T,
|
||||||
|
hbpca_body, &data,
|
||||||
|
scm_handle_by_message_noexit, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/* Derive the an exit status from the arguments to (quit ...). */
|
/* Derive the an exit status from the arguments to (quit ...). */
|
||||||
int
|
int
|
||||||
|
|
|
@ -88,6 +88,7 @@ extern SCM scm_body_thunk SCM_P ((void *, SCM));
|
||||||
|
|
||||||
|
|
||||||
extern SCM scm_handle_by_proc SCM_P ((void *, SCM, SCM));
|
extern SCM scm_handle_by_proc SCM_P ((void *, SCM, SCM));
|
||||||
|
extern SCM scm_handle_by_proc_catching_all SCM_P ((void *, SCM, SCM));
|
||||||
extern SCM scm_handle_by_message SCM_P ((void *, SCM, SCM));
|
extern SCM scm_handle_by_message SCM_P ((void *, SCM, SCM));
|
||||||
extern SCM scm_handle_by_message_noexit SCM_P ((void *, SCM, SCM));
|
extern SCM scm_handle_by_message_noexit SCM_P ((void *, SCM, SCM));
|
||||||
extern int scm_exit_status SCM_P ((SCM args));
|
extern int scm_exit_status SCM_P ((SCM args));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue