From 97a307b9825b49c1d4284cfa5cb23f3230012a08 Mon Sep 17 00:00:00 2001 From: Mikael Djurfeldt Date: Wed, 6 Nov 1996 15:05:00 +0000 Subject: [PATCH] * throw.c (scm_lazy_catch, scm_ithrow): Completed implementation of `lazy-catch'. --- libguile/throw.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/libguile/throw.c b/libguile/throw.c index 2b527c16a..988531212 100644 --- a/libguile/throw.c +++ b/libguile/throw.c @@ -214,11 +214,18 @@ scm_lazy_catch (tag, thunk, handler) SCM thunk; SCM handler; { + SCM answer; SCM_ASSERT ((SCM_NIMP(tag) && SCM_SYMBOLP(tag)) || (tag == SCM_BOOL_T), tag, SCM_ARG1, s_lazy_catch); + SCM_REDEFER_INTS; scm_dynwinds = scm_acons (tag, handler, scm_dynwinds); - return scm_apply (thunk, SCM_EOL, SCM_EOL); + SCM_REALLOW_INTS; + answer = scm_apply (thunk, SCM_EOL, SCM_EOL); + SCM_REDEFER_INTS; + scm_dynwinds = SCM_CDR (scm_dynwinds); + SCM_REALLOW_INTS; + return answer; } /* The user has thrown to an uncaught key --- print a message and die. @@ -326,17 +333,27 @@ scm_ithrow (key, args, noreturn) SCM_CDAR (wind_goal) != jmpbuf; wind_goal = SCM_CDR (wind_goal)) ; - scm_dowinds (wind_goal, scm_ilength (scm_dynwinds) - scm_ilength (wind_goal)); if (!SCM_JMPBUFP (jmpbuf)) { + SCM oldwinds = scm_dynwinds; + SCM handle, answer; + scm_dowinds (wind_goal, scm_ilength (scm_dynwinds) - scm_ilength (wind_goal)); SCM_REDEFER_INTS; + handle = scm_dynwinds; scm_dynwinds = SCM_CDR (scm_dynwinds); SCM_REALLOW_INTS; - return scm_apply (jmpbuf, scm_cons (key, args), SCM_EOL); + answer = scm_apply (jmpbuf, scm_cons (key, args), SCM_EOL); + SCM_REDEFER_INTS; + SCM_SETCDR (handle, scm_dynwinds); + scm_dynwinds = handle; + SCM_REALLOW_INTS; + scm_dowinds (oldwinds, scm_ilength (scm_dynwinds) - scm_ilength (oldwinds)); + return answer; } else { struct jmp_buf_and_retval * jbr; + scm_dowinds (wind_goal, scm_ilength (scm_dynwinds) - scm_ilength (wind_goal)); jbr = (struct jmp_buf_and_retval *)JBJMPBUF (jmpbuf); jbr->throw_tag = key; jbr->retval = args;