diff options
author | Marius Vollmer <mvo@zagadka.de> | 2005-03-02 20:42:01 +0000 |
---|---|---|
committer | Marius Vollmer <mvo@zagadka.de> | 2005-03-02 20:42:01 +0000 |
commit | 9de87eea47536e25ef99bc25f07afdd759ee3575 (patch) | |
tree | 936d52588ace67469aba68f6ad47cbf1a12462ca /libguile/throw.c | |
parent | cb1cfc42a4f5ac4d60a64b425795432a0388ad7e (diff) | |
download | guile-9de87eea47536e25ef99bc25f07afdd759ee3575.tar.gz |
See ChangeLog from 2005-03-02.
Diffstat (limited to 'libguile/throw.c')
-rw-r--r-- | libguile/throw.c | 63 |
1 files changed, 32 insertions, 31 deletions
diff --git a/libguile/throw.c b/libguile/throw.c index b5bbbaefe..8547fb2f7 100644 --- a/libguile/throw.c +++ b/libguile/throw.c @@ -33,9 +33,9 @@ #include "libguile/fluids.h" #include "libguile/ports.h" #include "libguile/lang.h" - #include "libguile/validate.h" #include "libguile/throw.h" +#include "libguile/init.h" /* the jump buffer data structure */ @@ -68,13 +68,13 @@ static SCM make_jmpbuf (void) { SCM answer; - SCM_REDEFER_INTS; + SCM_CRITICAL_SECTION_START; { SCM_NEWSMOB2 (answer, tc16_jmpbuffer, 0, 0); SETJBJMPBUF(answer, (jmp_buf *)0); DEACTIVATEJB(answer); } - SCM_REALLOW_INTS; + SCM_CRITICAL_SECTION_END; return answer; } @@ -145,9 +145,9 @@ scm_internal_catch (SCM tag, scm_t_catch_body body, void *body_data, scm_t_catch jmpbuf = make_jmpbuf (); answer = SCM_EOL; - scm_dynwinds = scm_acons (tag, jmpbuf, scm_dynwinds); + scm_i_set_dynwinds (scm_acons (tag, jmpbuf, scm_i_dynwinds ())); SETJBJMPBUF(jmpbuf, &jbr.buf); - SCM_SETJBDFRAME(jmpbuf, scm_last_debug_frame); + SCM_SETJBDFRAME(jmpbuf, scm_i_last_debug_frame ()); if (setjmp (jbr.buf)) { SCM throw_tag; @@ -156,10 +156,10 @@ scm_internal_catch (SCM tag, scm_t_catch_body body, void *body_data, scm_t_catch #ifdef STACK_CHECKING scm_stack_checking_enabled_p = SCM_STACK_CHECKING_P; #endif - SCM_REDEFER_INTS; + SCM_CRITICAL_SECTION_START; DEACTIVATEJB (jmpbuf); - scm_dynwinds = SCM_CDR (scm_dynwinds); - SCM_REALLOW_INTS; + scm_i_set_dynwinds (SCM_CDR (scm_i_dynwinds ())); + SCM_CRITICAL_SECTION_END; throw_args = jbr.retval; throw_tag = jbr.throw_tag; jbr.throw_tag = SCM_EOL; @@ -170,10 +170,10 @@ scm_internal_catch (SCM tag, scm_t_catch_body body, void *body_data, scm_t_catch { ACTIVATEJB (jmpbuf); answer = body (body_data); - SCM_REDEFER_INTS; + SCM_CRITICAL_SECTION_START; DEACTIVATEJB (jmpbuf); - scm_dynwinds = SCM_CDR (scm_dynwinds); - SCM_REALLOW_INTS; + scm_i_set_dynwinds (SCM_CDR (scm_i_dynwinds ())); + SCM_CRITICAL_SECTION_END; } return answer; } @@ -241,15 +241,15 @@ scm_internal_lazy_catch (SCM tag, scm_t_catch_body body, void *body_data, scm_t_ c.handler_data = handler_data; lazy_catch = make_lazy_catch (&c); - SCM_REDEFER_INTS; - scm_dynwinds = scm_acons (tag, lazy_catch, scm_dynwinds); - SCM_REALLOW_INTS; + SCM_CRITICAL_SECTION_START; + scm_i_set_dynwinds (scm_acons (tag, lazy_catch, scm_i_dynwinds ())); + SCM_CRITICAL_SECTION_END; answer = (*body) (body_data); - SCM_REDEFER_INTS; - scm_dynwinds = SCM_CDR (scm_dynwinds); - SCM_REALLOW_INTS; + SCM_CRITICAL_SECTION_START; + scm_i_set_dynwinds (SCM_CDR (scm_i_dynwinds ())); + SCM_CRITICAL_SECTION_END; return answer; } @@ -385,7 +385,7 @@ static void handler_message (void *handler_data, SCM tag, SCM args) { char *prog_name = (char *) handler_data; - SCM p = scm_cur_errp; + SCM p = scm_current_error_port (); if (scm_ilength (args) == 4) { @@ -455,12 +455,10 @@ SCM scm_handle_by_message (void *handler_data, SCM tag, SCM args) { if (scm_is_true (scm_eq_p (tag, scm_from_locale_symbol ("quit")))) - { - exit (scm_exit_status (args)); - } + exit (scm_exit_status (args)); handler_message (handler_data, tag, args); - exit (2); + scm_i_pthread_exit (NULL); } @@ -471,6 +469,9 @@ scm_handle_by_message (void *handler_data, SCM tag, SCM args) SCM scm_handle_by_message_noexit (void *handler_data, SCM tag, SCM args) { + if (scm_is_true (scm_eq_p (tag, scm_from_locale_symbol ("quit")))) + exit (scm_exit_status (args)); + handler_message (handler_data, tag, args); return SCM_BOOL_F; @@ -587,7 +588,7 @@ scm_ithrow (SCM key, SCM args, int noreturn SCM_UNUSED) /* Search the wind list for an appropriate catch. "Waiter, please bring us the wind list." */ - for (winds = scm_dynwinds; scm_is_pair (winds); winds = SCM_CDR (winds)) + for (winds = scm_i_dynwinds (); scm_is_pair (winds); winds = SCM_CDR (winds)) { dynpair = SCM_CAR (winds); if (scm_is_pair (dynpair)) @@ -614,7 +615,7 @@ scm_ithrow (SCM key, SCM args, int noreturn SCM_UNUSED) jmpbuf = SCM_CDR (dynpair); - for (wind_goal = scm_dynwinds; + for (wind_goal = scm_i_dynwinds (); !scm_is_eq (SCM_CDAR (wind_goal), jmpbuf); wind_goal = SCM_CDR (wind_goal)) ; @@ -625,12 +626,12 @@ scm_ithrow (SCM key, SCM args, int noreturn SCM_UNUSED) { struct lazy_catch *c = (struct lazy_catch *) SCM_CELL_WORD_1 (jmpbuf); SCM handle, answer; - scm_dowinds (wind_goal, (scm_ilength (scm_dynwinds) + scm_dowinds (wind_goal, (scm_ilength (scm_i_dynwinds ()) - scm_ilength (wind_goal))); - SCM_REDEFER_INTS; - handle = scm_dynwinds; - scm_dynwinds = SCM_CDR (scm_dynwinds); - SCM_REALLOW_INTS; + SCM_CRITICAL_SECTION_START; + handle = scm_i_dynwinds (); + scm_i_set_dynwinds (SCM_CDR (handle)); + SCM_CRITICAL_SECTION_END; answer = (c->handler) (c->handler_data, key, args); scm_misc_error ("throw", "lazy-catch handler did return.", SCM_EOL); } @@ -639,12 +640,12 @@ scm_ithrow (SCM key, SCM args, int noreturn SCM_UNUSED) else if (SCM_JMPBUFP (jmpbuf)) { struct jmp_buf_and_retval * jbr; - scm_dowinds (wind_goal, (scm_ilength (scm_dynwinds) + scm_dowinds (wind_goal, (scm_ilength (scm_i_dynwinds ()) - scm_ilength (wind_goal))); jbr = (struct jmp_buf_and_retval *)JBJMPBUF (jmpbuf); jbr->throw_tag = key; jbr->retval = args; - scm_last_debug_frame = SCM_JBDFRAME (jmpbuf); + scm_i_set_last_debug_frame (SCM_JBDFRAME (jmpbuf)); longjmp (*JBJMPBUF (jmpbuf), 1); } |