diff --git a/libguile/__scm.h b/libguile/__scm.h index b4e1bd93a..93f666244 100644 --- a/libguile/__scm.h +++ b/libguile/__scm.h @@ -498,12 +498,24 @@ SCM_API void scm_async_tick (void); #ifdef BUILDING_LIBGUILE /* FIXME: should change names */ -# define SCM_ASYNC_TICK \ - do \ - { \ - if (SCM_I_CURRENT_THREAD->pending_asyncs) \ - scm_async_click (); \ - } \ +# define SCM_ASYNC_TICK \ + do \ + { \ + if (SCM_UNLIKELY (SCM_I_CURRENT_THREAD->pending_asyncs)) \ + scm_async_click (); \ + } \ + while (0) + +/* SCM_ASYNC_TICK_WITH_CODE is only available to Guile itself */ +# define SCM_ASYNC_TICK_WITH_CODE(stmt) \ + do \ + { \ + if (SCM_UNLIKELY (SCM_I_CURRENT_THREAD->pending_asyncs)) \ + { \ + stmt; \ + scm_async_click (); \ + } \ + } \ while (0) #else /* !BUILDING_LIBGUILE */ diff --git a/libguile/vm-engine.h b/libguile/vm-engine.h index ebe40b2d1..838ed202e 100644 --- a/libguile/vm-engine.h +++ b/libguile/vm-engine.h @@ -228,6 +228,9 @@ #define EXIT_HOOK() RUN_HOOK (SCM_VM_EXIT_HOOK) #define RETURN_HOOK() RUN_HOOK (SCM_VM_RETURN_HOOK) +#define VM_HANDLE_INTERRUPTS \ + SCM_ASYNC_TICK_WITH_CODE (SYNC_REGISTER ()) + /* * Stack operation diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c index 7de11e7d5..8eaf59cb6 100644 --- a/libguile/vm-i-system.c +++ b/libguile/vm-i-system.c @@ -747,8 +747,7 @@ VM_DEFINE_INSTRUCTION (54, call, "call", 1, -1, 1) vm_call: x = sp[-nargs]; - SYNC_REGISTER (); - SCM_TICK; /* allow interrupt here */ + VM_HANDLE_INTERRUPTS; /* * Subprogram call @@ -813,8 +812,7 @@ VM_DEFINE_INSTRUCTION (55, goto_args, "goto/args", 1, -1, 1) vm_goto_args: x = sp[-nargs]; - SYNC_REGISTER (); - SCM_TICK; /* allow interrupt here */ + VM_HANDLE_INTERRUPTS; /* * Tail call @@ -1085,8 +1083,9 @@ VM_DEFINE_INSTRUCTION (63, return, "return", 0, 1, 1) vm_return: EXIT_HOOK (); RETURN_HOOK (); - SYNC_REGISTER (); - SCM_TICK; /* allow interrupt here */ + + VM_HANDLE_INTERRUPTS; + { SCM ret;