summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--eval.h2
-rw-r--r--signal.h74
-rw-r--r--unwind.c31
3 files changed, 52 insertions, 55 deletions
diff --git a/eval.h b/eval.h
index d10e7f8b..8d71a706 100644
--- a/eval.h
+++ b/eval.h
@@ -35,6 +35,8 @@ extern val last_form_evaled;
extern val load_path_s, load_recursive_s;
extern val special_s, struct_s;
+extern val dyn_env;
+
#define load_path (deref(lookup_var_l(nil, load_path_s)))
noreturn val eval_error(val ctx, val fmt, ...);
diff --git a/signal.h b/signal.h
index 09204fc3..863bbf68 100644
--- a/signal.h
+++ b/signal.h
@@ -26,21 +26,6 @@
*/
-#if CONFIG_DEBUG_SUPPORT
-extern unsigned debug_state;
-#define EJ_DBG_MEMB int ds;
-#define EJ_DBG_SAVE(EJB) ((EJB).ds = debug_state),
-#define EJ_DBG_REST(EJB) (debug_state = (EJB).ds),
-#else
-#define EJ_DBG_MEMB
-#define EJ_DBG_SAVE(EJB)
-#define EJ_DBG_REST(EJB)
-#endif
-
-#define EJ_OPT_MEMB EJ_DBG_MEMB
-#define EJ_OPT_SAVE(EJB) EJ_DBG_SAVE(EJB)
-#define EJ_OPT_REST(EJB) EJ_DBG_REST(EJB)
-
#if __i386__
struct jmp {
@@ -172,12 +157,22 @@ void jmp_restore(struct jmp *, int);
}
#endif
+#if CONFIG_DEBUG_SUPPORT
+#define EJ_DBG_MEMB int ds;
+#else
+#define EJ_DBG_MEMB
+#endif
+
+#define EJ_OPT_MEMB EJ_DBG_MEMB
+
#if HAVE_POSIX_SIGS
typedef struct {
unsigned int set;
} small_sigset_t;
+extern small_sigset_t sig_blocked_cache;
+
#define sig_save_enable \
do { \
int sig_save = async_sig_enabled; \
@@ -225,29 +220,6 @@ typedef struct {
volatile int rv;
} extended_jmp_buf;
-#define extended_setjmp(EJB) \
- (jmp_save(&(EJB).jb) \
- ? (async_sig_enabled = (EJB).se, \
- dyn_env = (EJB).de, \
- gc_enabled = (EJB).gc, \
- gc_prot_top = (EJB).gc_pt, \
- sig_mask(SIG_SETMASK, \
- strip_qual(small_sigset_t *, \
- &(EJB).blocked), 0), \
- EJ_OPT_REST(EJB) \
- (EJB).rv) \
- : ((EJB).se = async_sig_enabled, \
- (EJB).de = dyn_env, \
- (EJB).gc = gc_enabled, \
- (EJB).gc_pt = gc_prot_top, \
- (EJB).blocked.set = sig_blocked_cache.set,\
- EJ_OPT_SAVE(EJB) \
- 0))
-
-#define extended_longjmp(EJB, ARG) \
- ((EJB).rv = (ARG), jmp_restore(&(EJB).jb, 1))
-
-extern small_sigset_t sig_blocked_cache;
extern volatile sig_atomic_t async_sig_enabled;
#else
@@ -269,28 +241,20 @@ typedef struct {
volatile int rv;
} extended_jmp_buf;
-#define extended_setjmp(EJB) \
- (jmp_save(&(EJB).jb) \
- ? (dyn_env = (EJB).de, \
- gc_enabled = ((EJB).gc), \
- gc_prot_top = (EJB).gc_pt, \
- EJ_OPT_REST(EJB) \
- (EJB).rv) \
- : ((EJB).de = dyn_env, \
- (EJB).gc = gc_enabled, \
- (EJB).gc_pt = gc_prot_top, \
- EJ_OPT_SAVE(EJB) \
- 0))
-
-#define extended_longjmp(EJB, ARG) \
- ((EJB).rv = (ARG), jmp_restore(&(EJB).jb, 1))
-
extern int async_sig_enabled;
#endif
-extern val dyn_env; /* eval.c */
+#define extended_setjmp(EJB) \
+ (jmp_save(&(EJB).jb) \
+ ? ((EJB).rv) \
+ : (extjmp_save(&(EJB)), 0))
+
+#define extended_longjmp(EJB, ARG) \
+ ((EJB).rv = (ARG), extjmp_restore(&(EJB)), jmp_restore(&(EJB).jb, 1))
+void extjmp_save(extended_jmp_buf *ejb);
+void extjmp_restore(extended_jmp_buf *);
void sig_init(void);
val set_sig_handler(val signo, val lambda);
val get_sig_handler(val signo);
diff --git a/unwind.c b/unwind.c
index 93b09fe1..449062f9 100644
--- a/unwind.c
+++ b/unwind.c
@@ -1175,6 +1175,37 @@ val uw_capture_cont(val tag, val fun, val ctx_form)
return capture_cont(tag, fun, fr);
}
+void extjmp_save(extended_jmp_buf *ejb)
+{
+ ejb->de = dyn_env;
+ ejb->gc = gc_enabled;
+ ejb->gc_pt = gc_prot_top;
+#if HAVE_POSIX_SIGS
+ ejb->se = async_sig_enabled;
+ ejb->blocked.set = sig_blocked_cache.set;
+#endif
+#if CONFIG_DEBUG_SUPPORT
+ ejb->ds = debug_state;
+#endif
+}
+
+void extjmp_restore(extended_jmp_buf *ejb)
+{
+ dyn_env = ejb->de;
+ gc_enabled = ejb->gc;
+ gc_prot_top = ejb->gc_pt;
+#if HAVE_POSIX_SIGS
+ async_sig_enabled = ejb->se;
+ ejb->blocked.set = sig_blocked_cache.set;
+ sig_mask(SIG_SETMASK,
+ strip_qual(small_sigset_t *, &ejb->blocked), 0);
+
+#endif
+#if CONFIG_DEBUG_SUPPORT
+ ejb->ds = debug_state;
+#endif
+}
+
void uw_init(void)
{
protect(&toplevel_env.ev.func_bindings,