diff options
| author | Dmitry Antipov | 2014-08-26 10:25:59 +0400 |
|---|---|---|
| committer | Dmitry Antipov | 2014-08-26 10:25:59 +0400 |
| commit | ebd31792b292f63f09efa498b5df73bf86107259 (patch) | |
| tree | 8cd196b0c4c03a3e76e00ed6c0fa010af49d3aea /src/lisp.h | |
| parent | 940ac42ae3d5c5c5d80f984278446ab34c0bb26a (diff) | |
| download | emacs-ebd31792b292f63f09efa498b5df73bf86107259.tar.gz emacs-ebd31792b292f63f09efa498b5df73bf86107259.zip | |
Handle C stack overflow caused by too nested Lisp evaluation.
* configure.ac: Check for sigaltstack and related sigaction
support. Unconditionally check for sigsetjmp and siglongjmp.
(HAVE_STACK_OVERFLOW_HANDLING): Define if we can support it.
* src/lisp.h (toplevel) [HAVE_STACK_OVERFLOW_HANDLING]: Declare
siglongjmp point to transfer control from SIGSEGV handler.
* src/keyboard.c (return_to_command_loop, recover_top_level_message)
[HAVE_STACK_OVERFLOW_HANDLING]: New variables.
(regular_top_level_message): New variable.
(command_loop) [HAVE_STACK_OVERFLOW_HANDLING]: Handle non-local
exit from SIGSEGV handler and adjust message displayed by Vtop_level
if appropriate.
(syms_of_keyboard): DEFVAR Vtop_level_message and initialize
new variables described above.
* src/sysdep.c [HAVE_SYS_RESOURCE_H]: Include sys/resource.h as such.
(stack_grows_down, sigsegv_stack, handle_sigsegv)
[HAVE_STACK_OVERFLOW_HANDLING]: New variables and function.
(init_sigsegv): New function.
(init_signals): Use it.
* lisp/startup.el (normal-top-level): Use top-level-message.
Diffstat (limited to 'src/lisp.h')
| -rw-r--r-- | src/lisp.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/src/lisp.h b/src/lisp.h index 1e2a8b6535f..012e5fad18d 100644 --- a/src/lisp.h +++ b/src/lisp.h | |||
| @@ -4093,6 +4093,9 @@ extern Lisp_Object Qdisabled, QCfilter; | |||
| 4093 | extern Lisp_Object Qup, Qdown; | 4093 | extern Lisp_Object Qup, Qdown; |
| 4094 | extern Lisp_Object last_undo_boundary; | 4094 | extern Lisp_Object last_undo_boundary; |
| 4095 | extern bool input_pending; | 4095 | extern bool input_pending; |
| 4096 | #ifdef HAVE_STACK_OVERFLOW_HANDLING | ||
| 4097 | extern sigjmp_buf return_to_command_loop; | ||
| 4098 | #endif | ||
| 4096 | extern Lisp_Object menu_bar_items (Lisp_Object); | 4099 | extern Lisp_Object menu_bar_items (Lisp_Object); |
| 4097 | extern Lisp_Object tool_bar_items (Lisp_Object, int *); | 4100 | extern Lisp_Object tool_bar_items (Lisp_Object, int *); |
| 4098 | extern void discard_mouse_events (void); | 4101 | extern void discard_mouse_events (void); |