aboutsummaryrefslogtreecommitdiffstats
path: root/src/window.c
diff options
context:
space:
mode:
authorPaul Eggert2019-02-27 01:14:27 -0800
committerPaul Eggert2019-02-27 01:23:30 -0800
commite828765d01313acddcf17279b6b43ae9f777f2a4 (patch)
tree8dd465c5899c62ad5613fe97172fad1ddf419097 /src/window.c
parent2f7885a4b3609dec19e4595c6c24f3a21f33c5d6 (diff)
downloademacs-e828765d01313acddcf17279b6b43ae9f777f2a4.tar.gz
emacs-e828765d01313acddcf17279b6b43ae9f777f2a4.zip
DEFVAR_INT variables are now intmax_t
Formerly they were fixnums, which led to problems when dealing with values that might not fit on 32-bit platforms, such as string-chars-consed or floats_consed. 64-bit counters should be good enough for these (for a while, anyway...). While we’re at it, fix some unlikely integer overflow bugs that have been in the code for a while. * lib-src/make-docfile.c (write_globals): * src/data.c (do_symval_forwarding, store_symval_forwarding): * src/eval.c (restore_stack_limits, call_debugger): * src/frame.h (struct frame.cost_calculation_baud_rate): * src/keyboard.c (last_auto_save, bind_polling_period, read_char): * src/lisp.h (struct Lisp_Intfwd.intvar): * src/lread.c (defvar_int): * src/pdumper.c (dump_fwd_int): * src/thread.h (struct thread_state.m_lisp_eval_depth): * src/undo.c (truncate_undo_list): * src/xselect.c (wait_for_property_change) (x_get_foreign_selection): * src/xterm.c (x_emacs_to_x_modifiers): DEFVAR_INT variables now have the C type intmax_t, not EMACS_INT. * src/data.c (store_symval_forwarding): * src/gnutls.c (Fgnutls_boot): * src/keyboard.c (bind_polling_period): * src/macros.c (pop_kbd_macro, Fexecute_kbd_macro): * src/undo.c (truncate_undo_list): Allow any integer that fits into intmax_t, instead of requiring it to be a Lisp fixnum. * src/dispnew.c (update_window): * src/frame.c (x_figure_window_size): * src/gnutls.c (init_gnutls_functions) (emacs_gnutls_handle_error): * src/keyboard.c (make_lisp_event): * src/nsterm.m (ns_dumpglyphs_image): * src/profiler.c (make_log): * src/scroll.c (calculate_scrolling) (calculate_direct_scrolling): * src/termcap.c (tputs): * src/xterm.c (x_draw_image_relief): Avoid implementation-defined behavior on conversion of out-of-range integers. * src/eval.c (when_entered_debugger): Now intmax_t. (max_ensure_room): New function, that avoids signed integer overflow. (call_debugger, signal_or_quit): Use it. * src/fileio.c (Fdo_auto_save): * src/keyboard.c (make_lisp_event): * src/term.c (calculate_costs): * src/xdisp.c (build_desired_tool_bar_string) (hscroll_window_tree, try_scrolling, decode_mode_spec) (x_produce_glyphs): Avoid signed integer overflow. * src/lisp.h (clip_to_bounds): Generalize to intmax_t. * src/pdumper.c (dump_emacs_reloc_immediate_emacs_int): Remove, ... (dump_emacs_reloc_immediate_intmax_t): ... replacing with this function. All uses changed. * src/profiler.c (make_log): Omit args. All callers changed. * src/termcap.c: Include stdlib.h, for atoi. Include intprops.h. * src/window.c (sanitize_next_screen_context_lines): New function. (window_scroll_pixel_based, window_scroll_line_based): Use it to avoid signed integer overflow.
Diffstat (limited to 'src/window.c')
-rw-r--r--src/window.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/window.c b/src/window.c
index 49d7fc2426b..fe685d5ab09 100644
--- a/src/window.c
+++ b/src/window.c
@@ -5445,6 +5445,11 @@ window_scroll_margin (struct window *window, enum margin_unit unit)
5445 return 0; 5445 return 0;
5446} 5446}
5447 5447
5448static int
5449sanitize_next_screen_context_lines (void)
5450{
5451 return clip_to_bounds (0, next_screen_context_lines, 1000000);
5452}
5448 5453
5449/* Implementation of window_scroll that works based on pixel line 5454/* Implementation of window_scroll that works based on pixel line
5450 heights. See the comment of window_scroll for parameter 5455 heights. See the comment of window_scroll for parameter
@@ -5515,9 +5520,11 @@ window_scroll_pixel_based (Lisp_Object window, int n, bool whole, bool noerror)
5515 height. This is important to ensure we get back to the 5520 height. This is important to ensure we get back to the
5516 same position when scrolling up, then down. */ 5521 same position when scrolling up, then down. */
5517 if (whole) 5522 if (whole)
5518 dy = max ((window_box_height (w) / dy 5523 {
5519 - next_screen_context_lines) * dy, 5524 int ht = window_box_height (w);
5520 dy); 5525 int nscls = sanitize_next_screen_context_lines ();
5526 dy = max (dy, (ht / dy - nscls) * dy);
5527 }
5521 dy *= n; 5528 dy *= n;
5522 5529
5523 if (n < 0) 5530 if (n < 0)
@@ -5598,13 +5605,14 @@ window_scroll_pixel_based (Lisp_Object window, int n, bool whole, bool noerror)
5598 { 5605 {
5599 ptrdiff_t start_pos = IT_CHARPOS (it); 5606 ptrdiff_t start_pos = IT_CHARPOS (it);
5600 int dy = frame_line_height; 5607 int dy = frame_line_height;
5608 int ht = window_box_height (w);
5609 int nscls = sanitize_next_screen_context_lines ();
5601 /* In the below we divide the window box height by the frame's 5610 /* In the below we divide the window box height by the frame's
5602 line height to make the result predictable when the window 5611 line height to make the result predictable when the window
5603 box is not an integral multiple of the line height. This is 5612 box is not an integral multiple of the line height. This is
5604 important to ensure we get back to the same position when 5613 important to ensure we get back to the same position when
5605 scrolling up, then down. */ 5614 scrolling up, then down. */
5606 dy = max ((window_box_height (w) / dy - next_screen_context_lines) * dy, 5615 dy = n * max (dy, (ht / dy - nscls) * dy);
5607 dy) * n;
5608 5616
5609 /* Note that move_it_vertically always moves the iterator to the 5617 /* Note that move_it_vertically always moves the iterator to the
5610 start of a line. So, if the last line doesn't have a newline, 5618 start of a line. So, if the last line doesn't have a newline,
@@ -5902,7 +5910,10 @@ window_scroll_line_based (Lisp_Object window, int n, bool whole, bool noerror)
5902 /* If scrolling screen-fulls, compute the number of lines to 5910 /* If scrolling screen-fulls, compute the number of lines to
5903 scroll from the window's height. */ 5911 scroll from the window's height. */
5904 if (whole) 5912 if (whole)
5905 n *= max (1, ht - next_screen_context_lines); 5913 {
5914 int nscls = sanitize_next_screen_context_lines ();
5915 n *= max (1, ht - nscls);
5916 }
5906 5917
5907 if (!NILP (Vscroll_preserve_screen_position)) 5918 if (!NILP (Vscroll_preserve_screen_position))
5908 { 5919 {