summaryrefslogtreecommitdiff
path: root/src/keyboard.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2014-09-24 19:01:14 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2014-09-24 19:01:14 -0700
commit10381f58949355413c86315c571508afb40f0de6 (patch)
tree06761cfffeb1dcd54a633da833b7f0021f1b71c0 /src/keyboard.c
parent59355ea9ce310eb45b33e10f2ffaedbc4e2f47a9 (diff)
downloademacs-10381f58949355413c86315c571508afb40f0de6.tar.gz
Fix local_cons etc. to not exhaust the stack when in a loop.
Problem reported in: http://lists.gnu.org/archive/html/emacs-devel/2014-09/msg00696.html * buffer.c (Fother_buffer, other_buffer_safely, init_buffer): * charset.c (load_charset_map_from_file, Ffind_charset_region) (Ffind_charset_string): * chartab.c (uniprop_encode_value_numeric, uniprop_table): * data.c (wrong_range): * editfns.c (Fpropertize, format2): * emacs.c (init_cmdargs, decode_env_path): * fileio.c (auto_save_error): * fns.c (Fyes_or_no_p): * font.c (font_style_to_value, font_parse_xlfd) (font_parse_family_registry, font_delete_unmatched) (font_add_log): * fontset.c (Fset_fontset_font): * frame.c (x_get_arg): * keyboard.c (echo_dash, safe_run_hooks_error, parse_menu_item) (read_char_minibuf_menu_prompt): * keymap.c (silly_event_symbol_error, describe_vector): * lread.c (load_warn_old_style_backquotes): * menu.c (single_menu_item): * minibuf.c (Fread_buffer): * process.c (status_message, Fformat_network_address) (server_accept_connection): * textprop.c (copy_text_properties): * xdisp.c (Fcurrent_bidi_paragraph_direction): * xfns.c (x_default_scroll_bar_color_parameter): * xfont.c (xfont_open): * xselect.c (x_clipboard_manager_error_1): * xterm.c (x_term_init): Put USE_LOCAL_ALLOCA at the start of the function. * fns.c (maybe_resize_hash_table): Use build_string instead of build_local_string, since we'd otherwise need a conditional USE_LOCAL_ALLOCA here, but this is just debugging output and is not worth the bother of optimization. * font.c (font_delete_unmatched): Remove by-hand code that observed MAX_ALLOCA limit, since it's now done automatically. * keymap.c (Fsingle_key_description): Put USE_SAFE_ALLOCA at top, since build_local_string needs its sa_alloc. * lisp.h (lisp_word_count): New function. (SAFE_ALLOCA_LISP): Use it. (USE_LOCAL_ALLOCA): New macro. (local_cons, make_local_vector, make_local_string): Observe the MAX_ALLOCA limit. (LISP_STRING_OVERHEAD): New constant. (make_local_string): Use it.
Diffstat (limited to 'src/keyboard.c')
-rw-r--r--src/keyboard.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/keyboard.c b/src/keyboard.c
index 704109e1671..e242a886f05 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -597,6 +597,8 @@ echo_char (Lisp_Object c)
static void
echo_dash (void)
{
+ USE_LOCAL_ALLOCA;
+
/* Do nothing if not echoing at all. */
if (NILP (KVAR (current_kboard, echo_string)))
return;
@@ -1894,6 +1896,7 @@ safe_run_hooks_1 (ptrdiff_t nargs, Lisp_Object *args)
static Lisp_Object
safe_run_hooks_error (Lisp_Object error, ptrdiff_t nargs, Lisp_Object *args)
{
+ USE_LOCAL_ALLOCA;
Lisp_Object hook, fun;
eassert (nargs == 2);
@@ -7700,6 +7703,7 @@ menu_item_eval_property (Lisp_Object sexpr)
bool
parse_menu_item (Lisp_Object item, int inmenubar)
{
+ USE_LOCAL_ALLOCA;
Lisp_Object def, tem, item_string, start;
Lisp_Object filter;
Lisp_Object keyhint;
@@ -8523,7 +8527,8 @@ static Lisp_Object
read_char_minibuf_menu_prompt (int commandflag,
Lisp_Object map)
{
- register Lisp_Object name;
+ USE_LOCAL_ALLOCA;
+ Lisp_Object name;
ptrdiff_t nlength;
/* FIXME: Use the minibuffer's frame width. */
ptrdiff_t width = FRAME_COLS (SELECTED_FRAME ()) - 4;