commit b01a4295c2f9bb58858880e4e28b05cc8396791c (HEAD, refs/remotes/origin/master) Author: Dmitry Gutov Date: Fri Feb 1 03:01:39 2019 +0300 js--re-search-backward-inner: Fix infloop Fix JS indentation infloop reported in https://github.com/mooz/js2-mode/issues/513. * lisp/progmodes/js.el (js--re-search-backward-inner): Account for multiline string literals. * test/manual/indent/js.js: New test example. diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el index e55539c17f..a94a2fe134 100644 --- a/lisp/progmodes/js.el +++ b/lisp/progmodes/js.el @@ -785,7 +785,6 @@ macro as normal text." (defun js--re-search-backward-inner (regexp &optional bound count) "Auxiliary function for `js--re-search-backward'." (let ((parse) - str-terminator (orig-macro-start (save-excursion (and (js--beginning-of-macro) @@ -796,13 +795,7 @@ macro as normal text." (save-excursion (backward-char) (looking-at "/[/*]"))) (forward-char)) (setq parse (syntax-ppss)) - (cond ((setq str-terminator (nth 3 parse)) - (when (eq str-terminator t) - (setq str-terminator ?/)) - (re-search-backward - (concat "\\([^\\]\\|^\\)" (string str-terminator)) - (point-at-bol) t)) - ((nth 7 parse) + (cond ((nth 8 parse) (goto-char (nth 8 parse))) ((or (nth 4 parse) (and (eq (char-before) ?/) (eq (char-after) ?*))) diff --git a/test/manual/indent/js.js b/test/manual/indent/js.js index b0d8bcabd2..df79098694 100644 --- a/test/manual/indent/js.js +++ b/test/manual/indent/js.js @@ -144,6 +144,13 @@ bar( /abc/ ) +// No infloop inside js--re-search-backward-inner +let b = { + a : ` + //1 + ` +} + // Local Variables: // indent-tabs-mode: nil // js-indent-level: 2 commit 47679e63230da94cffed568a4d5167ffc1baea96 Author: Paul Eggert Date: Thu Jan 31 15:31:41 2019 -0800 Prefer static to extern where either will do * src/charset.c (charset_table_size): * src/pdumper.c (dump_private): * src/sysdep.c (init_sigsegv): * src/window.c (old_selected_window): Now static. * src/charset.c (charset_table_size): Now int, since the value always fits in int. * src/gtkutil.c (xg_gtk_initialized): Now present only if HAVE_XWIDGETS, to make it clearer that this is an xwidgets hack. All uses changed. * src/lread.c (ndefsubr): Remove; unused. * src/pdumper.h: Use usual GNU indenting style for functions, since my static-vs-extern checking hack relies on it. (dump_public): Always declare; simpler and doesn’t hurt. (pdumper_handle_page_fault): Remove unused decl. diff --git a/src/charset.c b/src/charset.c index 28f6203a66..7e2e657c7f 100644 --- a/src/charset.c +++ b/src/charset.c @@ -62,7 +62,7 @@ Lisp_Object Vcharset_hash_table; /* Table of struct charset. */ struct charset *charset_table; -ptrdiff_t charset_table_size; +static int charset_table_size; int charset_table_used; /* Special charsets corresponding to symbols. */ diff --git a/src/charset.h b/src/charset.h index f4bed558cf..ee697b8d3e 100644 --- a/src/charset.h +++ b/src/charset.h @@ -248,7 +248,6 @@ extern Lisp_Object Vcharset_hash_table; /* Table of struct charset. */ extern struct charset *charset_table; -extern ptrdiff_t charset_table_size; extern int charset_table_used; #define CHARSET_FROM_ID(id) (charset_table + (id)) diff --git a/src/gtkutil.c b/src/gtkutil.c index 92199bb0af..75fc9ea547 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -147,7 +147,9 @@ struct xg_frame_tb_info GtkTextDirection dir; }; +#ifdef HAVE_XWIDGETS bool xg_gtk_initialized; /* Used to make sure xwidget calls are possible */ +#endif static GtkWidget * xg_get_widget_from_map (ptrdiff_t idx); @@ -5324,7 +5326,9 @@ xg_initialize (void) x_last_font_name = NULL; #endif +#ifdef HAVE_XWIDGETS xg_gtk_initialized = true; +#endif } #endif /* USE_GTK */ diff --git a/src/lread.c b/src/lread.c index dde9ccef54..ff9b75475b 100644 --- a/src/lread.c +++ b/src/lread.c @@ -4402,8 +4402,6 @@ init_obarray_once (void) } -int ndefsubr; - void defsubr (union Aligned_Lisp_Subr *aname) { @@ -4413,7 +4411,6 @@ defsubr (union Aligned_Lisp_Subr *aname) XSETPVECTYPE (sname, PVEC_SUBR); XSETSUBR (tem, sname); set_symbol_function (sym, tem); - ++ndefsubr; } #ifdef NOTDEF /* Use fset in subr.el now! */ diff --git a/src/pdumper.c b/src/pdumper.c index d4fbc4b049..301a52804f 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -5019,7 +5019,7 @@ struct pdumper_loaded_dump_private }; struct pdumper_loaded_dump dump_public; -struct pdumper_loaded_dump_private dump_private; +static struct pdumper_loaded_dump_private dump_private; /* Return a pointer to offset OFFSET within the dump, which begins at DUMP_BASE. DUMP_BASE must be equal to the current dump load diff --git a/src/pdumper.h b/src/pdumper.h index 90c744f0a4..7be8a8f877 100644 --- a/src/pdumper.h +++ b/src/pdumper.h @@ -52,8 +52,7 @@ INLINE_HEADER_BEGIN extern void pdumper_remember_scalar_impl (void *data, ptrdiff_t nbytes); -INLINE -void +INLINE void pdumper_remember_scalar (void *data, ptrdiff_t nbytes) { #ifdef HAVE_PDUMPER @@ -70,8 +69,7 @@ extern void pdumper_remember_lv_ptr_raw_impl ( /* Remember the pointer at *PTR. *PTR must be null or point to a Lisp object. TYPE is the rough type of Lisp object to which *PTR points. */ -INLINE -void +INLINE void pdumper_remember_lv_ptr_raw (void* ptr, enum Lisp_Type type) { #ifdef HAVE_PDUMPER @@ -137,15 +135,12 @@ struct pdumper_loaded_dump { uintptr_t end; }; -#ifdef HAVE_PDUMPER extern struct pdumper_loaded_dump dump_public; -#endif /* Return whether the OBJ points somewhere into the loaded dump image. Works even when we have no dump loaded --- in this case, it just returns false. */ -INLINE _GL_ATTRIBUTE_CONST -bool +INLINE _GL_ATTRIBUTE_CONST bool pdumper_object_p (const void *obj) { #ifdef HAVE_PDUMPER @@ -163,8 +158,7 @@ extern bool pdumper_cold_object_p_impl (const void *obj); Only bool-vectors and floats should end up there. pdumper_object_p() and pdumper_object_p_precise() must have returned true for OBJ before calling this function. */ -INLINE _GL_ATTRIBUTE_CONST -bool +INLINE _GL_ATTRIBUTE_CONST bool pdumper_cold_object_p (const void *obj) { #ifdef HAVE_PDUMPER @@ -181,8 +175,7 @@ extern enum Lisp_Type pdumper_find_object_type_impl (const void *obj); /* Return the type of the dumped object that starts at OBJ. It is a programming error to call this routine for an OBJ for which pdumper_object_p would return false. */ -INLINE _GL_ATTRIBUTE_CONST -enum Lisp_Type +INLINE _GL_ATTRIBUTE_CONST enum Lisp_Type pdumper_find_object_type (const void *obj) { #ifdef HAVE_PDUMPER @@ -197,8 +190,7 @@ pdumper_find_object_type (const void *obj) the loaded dump image. It is a programming error to call this routine for an OBJ for which pdumper_object_p would return false. */ -INLINE _GL_ATTRIBUTE_CONST -bool +INLINE _GL_ATTRIBUTE_CONST bool pdumper_object_p_precise (const void *obj) { #ifdef HAVE_PDUMPER @@ -214,8 +206,7 @@ extern bool pdumper_marked_p_impl (const void *obj); /* Return whether OBJ is marked according to the portable dumper. It is an error to call this routine for an OBJ for which pdumper_object_p_precise would return false. */ -INLINE -bool +INLINE bool pdumper_marked_p (const void *obj) { #ifdef HAVE_PDUMPER @@ -231,8 +222,7 @@ extern void pdumper_set_marked_impl (const void *obj); /* Set the pdumper mark bit for OBJ. It is a programming error to call this function with an OBJ for which pdumper_object_p_precise would return false. */ -INLINE -void +INLINE void pdumper_set_marked (const void *obj) { #ifdef HAVE_PDUMPER @@ -246,8 +236,7 @@ pdumper_set_marked (const void *obj) extern void pdumper_clear_marks_impl (void); /* Clear all the mark bits for pdumper objects. */ -INLINE -void +INLINE void pdumper_clear_marks (void) { #ifdef HAVE_PDUMPER @@ -255,11 +244,6 @@ pdumper_clear_marks (void) #endif } -/* Handle a page fault that occurs when we access the portable dumper - mapping. Return true iff the fault should be considered handled - and execution should resume. */ -bool pdumper_handle_page_fault (void *fault_addr_ptr); - /* Record the Emacs startup directory, relative to which the pdump file was loaded. */ extern void pdumper_record_wd (const char *); diff --git a/src/sysdep.c b/src/sysdep.c index f8594d6a91..6d85692ab1 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -1893,7 +1893,7 @@ handle_sigsegv (int sig, siginfo_t *siginfo, void *arg) /* Return true if we have successfully set up SIGSEGV handler on alternate stack. Otherwise we just treat SIGSEGV among the rest of fatal signals. */ -bool +static bool init_sigsegv (void) { struct sigaction sa; @@ -1916,7 +1916,7 @@ init_sigsegv (void) #else /* not HAVE_STACK_OVERFLOW_HANDLING or WINDOWSNT */ -bool +static bool init_sigsegv (void) { return 0; diff --git a/src/syssignal.h b/src/syssignal.h index ecd6c9cc8c..82e376126a 100644 --- a/src/syssignal.h +++ b/src/syssignal.h @@ -23,7 +23,6 @@ along with GNU Emacs. If not, see . */ #include extern void init_signals (void); -extern bool init_sigsegv (void); extern void block_child_signal (sigset_t *); extern void unblock_child_signal (sigset_t const *); extern void block_interrupt_signal (sigset_t *); diff --git a/src/window.c b/src/window.c index c0d745995a..1b474a663a 100644 --- a/src/window.c +++ b/src/window.c @@ -81,7 +81,7 @@ Lisp_Object selected_window; /* The value of selected_window at the last time window change functions were run. This is always the same as FRAME_OLD_SELECTED_WINDOW (old_selected_frame). */ -Lisp_Object old_selected_window; +static Lisp_Object old_selected_window; /* A list of all windows for use by next_window and Fwindow_list. Functions creating or deleting windows should invalidate this cache diff --git a/src/window.h b/src/window.h index 514bf1fb6e..d816bb1683 100644 --- a/src/window.h +++ b/src/window.h @@ -1039,7 +1039,6 @@ wset_next_buffers (struct window *w, Lisp_Object val) This value is always the same as FRAME_SELECTED_WINDOW (selected_frame). */ extern Lisp_Object selected_window; -extern Lisp_Object old_selected_window; /* This is a time stamp for window selection, so we can find the least recently used window. Its only users are Fselect_window, commit 05d2fc7170fb66a87601b1c76ddae2c1b7b4b934 Author: Paul Eggert Date: Thu Jan 31 10:29:50 2019 -0800 Widen modiff counts to avoid wraparound Widen modification counts to at least 64 bits, to make wraparound practically impossible. * doc/lispref/buffers.texi (Buffer Modification): Don’t say the modification-count can wrap around. * src/buffer.c (Frestore_buffer_modified_p, Fbuffer_swap_text) (modify_overlay): * src/insdel.c (insert_1_both, insert_from_string_1) (insert_from_gap, insert_from_buffer_1) (adjust_after_replace, replace_range, replace_range_2) (del_range_2, modify_text): * src/textprop.c (modify_text_properties): Use modiff_incr instead of incrementing directly. (Fbuffer_modified_tick, Fbuffer_chars_modified_tick): Don’t assume modification counts fit into fixnums. * src/buffer.h (struct buffer_text, struct buffer): * src/cmds.c (internal_self_insert): * src/fileio.c (Finsert_file_contents): * src/indent.c (last_known_column_modified): * src/keyboard.c (command_loop_1): * src/marker.c (cached_modiff): * src/syntax.c (find_start_modiff, parse_sexp_propertize) (find_defun_start): * src/window.h (struct window): Use modiff_count for modification counts. * src/editfns.c (Fsubst_char_in_region): Copy instead of incrementing modification counts, since integer overflow checking is not needed here. * src/lisp.h (modiff_count): New type. (modiff_incr, modiff_to_integer): New inline functions. * src/pdumper.c (dump_buffer): Update hash. diff --git a/doc/lispref/buffers.texi b/doc/lispref/buffers.texi index e6e03ac27a..2dbe9c27f2 100644 --- a/doc/lispref/buffers.texi +++ b/doc/lispref/buffers.texi @@ -573,7 +573,6 @@ echo area; use @code{set-buffer-modified-p} (above) instead. This function returns @var{buffer}'s modification-count. This is a counter that increments every time the buffer is modified. If @var{buffer} is @code{nil} (or omitted), the current buffer is used. -The counter can wrap around occasionally. @end defun @defun buffer-chars-modified-tick &optional buffer diff --git a/src/buffer.c b/src/buffer.c index a12c80ec0b..e5cc5f367f 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1413,7 +1413,7 @@ state of the current buffer. Use with care. */) /* If SAVE_MODIFF == auto_save_modified == MODIFF, we can either decrease SAVE_MODIFF and auto_save_modified or increase MODIFF. */ - : MODIFF++); + : modiff_incr (&MODIFF)); return flag; } @@ -1422,11 +1422,11 @@ DEFUN ("buffer-modified-tick", Fbuffer_modified_tick, Sbuffer_modified_tick, 0, 1, 0, doc: /* Return BUFFER's tick counter, incremented for each change in text. Each buffer has a tick counter which is incremented each time the -text in that buffer is changed. It wraps around occasionally. -No argument or nil as argument means use current buffer as BUFFER. */) - (register Lisp_Object buffer) +text in that buffer is changed. No argument or nil as argument means +use current buffer as BUFFER. */) + (Lisp_Object buffer) { - return make_fixnum (BUF_MODIFF (decode_buffer (buffer))); + return modiff_to_integer (BUF_MODIFF (decode_buffer (buffer))); } DEFUN ("buffer-chars-modified-tick", Fbuffer_chars_modified_tick, @@ -1439,9 +1439,9 @@ values returned by two individual calls of `buffer-chars-modified-tick', you can tell whether a character change occurred in that buffer in between these calls. No argument or nil as argument means use current buffer as BUFFER. */) - (register Lisp_Object buffer) + (Lisp_Object buffer) { - return make_fixnum (BUF_CHARS_MODIFF (decode_buffer (buffer))); + return modiff_to_integer (BUF_CHARS_MODIFF (decode_buffer (buffer))); } DEFUN ("rename-buffer", Frename_buffer, Srename_buffer, 1, 2, @@ -2375,9 +2375,12 @@ results, see Info node `(elisp)Swapping Text'. */) bset_point_before_scroll (current_buffer, Qnil); bset_point_before_scroll (other_buffer, Qnil); - current_buffer->text->modiff++; other_buffer->text->modiff++; - current_buffer->text->chars_modiff++; other_buffer->text->chars_modiff++; - current_buffer->text->overlay_modiff++; other_buffer->text->overlay_modiff++; + modiff_incr (¤t_buffer->text->modiff); + modiff_incr (&other_buffer->text->modiff); + modiff_incr (¤t_buffer->text->chars_modiff); + modiff_incr (&other_buffer->text->chars_modiff); + modiff_incr (¤t_buffer->text->overlay_modiff); + modiff_incr (&other_buffer->text->overlay_modiff); current_buffer->text->beg_unchanged = current_buffer->text->gpt; current_buffer->text->end_unchanged = current_buffer->text->gpt; other_buffer->text->beg_unchanged = other_buffer->text->gpt; @@ -3913,7 +3916,7 @@ modify_overlay (struct buffer *buf, ptrdiff_t start, ptrdiff_t end) bset_redisplay (buf); - ++BUF_OVERLAY_MODIFF (buf); + modiff_incr (&BUF_OVERLAY_MODIFF (buf)); } /* Remove OVERLAY from LIST. */ diff --git a/src/buffer.h b/src/buffer.h index 82cc2ebfbf..d3528ac50e 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -422,20 +422,20 @@ struct buffer_text ptrdiff_t gpt_byte; /* Byte pos of gap in buffer. */ ptrdiff_t z_byte; /* Byte pos of end of buffer. */ ptrdiff_t gap_size; /* Size of buffer's gap. */ - EMACS_INT modiff; /* This counts buffer-modification events + modiff_count modiff; /* This counts buffer-modification events for this buffer. It is incremented for each such event, and never otherwise changed. */ - EMACS_INT chars_modiff; /* This is modified with character change + modiff_count chars_modiff; /* This is modified with character change events for this buffer. It is set to modiff for each such event, and never otherwise changed. */ - EMACS_INT save_modiff; /* Previous value of modiff, as of last + modiff_count save_modiff; /* Previous value of modiff, as of last time buffer visited or saved a file. */ - EMACS_INT overlay_modiff; /* Counts modifications to overlays. */ + modiff_count overlay_modiff; /* Counts modifications to overlays. */ - EMACS_INT compact; /* Set to modiff each time when compact_buffer + modiff_count compact; /* Set to modiff each time when compact_buffer is called for this buffer. */ /* Minimum value of GPT - BEG since last redisplay that finished. */ @@ -446,12 +446,12 @@ struct buffer_text /* MODIFF as of last redisplay that finished; if it matches MODIFF, beg_unchanged and end_unchanged contain no useful information. */ - EMACS_INT unchanged_modified; + modiff_count unchanged_modified; /* BUF_OVERLAY_MODIFF of current buffer, as of last redisplay that finished; if it matches BUF_OVERLAY_MODIFF, beg_unchanged and end_unchanged contain no useful information. */ - EMACS_INT overlay_unchanged_modified; + modiff_count overlay_unchanged_modified; /* Properties of this buffer's text. */ INTERVAL intervals; @@ -812,11 +812,11 @@ struct buffer off_t modtime_size; /* The value of text->modiff at the last auto-save. */ - EMACS_INT auto_save_modified; + modiff_count auto_save_modified; /* The value of text->modiff at the last display error. Redisplay of this buffer is inhibited until it changes again. */ - EMACS_INT display_error_modiff; + modiff_count display_error_modiff; /* The time at which we detected a failure to auto-save, Or 0 if we didn't have a failure. */ diff --git a/src/cmds.c b/src/cmds.c index 239e3be5c0..9f3c8610e6 100644 --- a/src/cmds.c +++ b/src/cmds.c @@ -423,7 +423,7 @@ internal_self_insert (int c, EMACS_INT n) : UNIBYTE_TO_CHAR (XFIXNAT (Fprevious_char ()))) == Sword)) { - EMACS_INT modiff = MODIFF; + modiff_count modiff = MODIFF; Lisp_Object sym; sym = call0 (Qexpand_abbrev); diff --git a/src/editfns.c b/src/editfns.c index 3edfd1dc20..360cdbe02e 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -2291,10 +2291,11 @@ Both characters must have the same length of multi-byte form. */) if (! NILP (noundo)) { - if (MODIFF - 1 == SAVE_MODIFF) - SAVE_MODIFF++; - if (MODIFF - 1 == BUF_AUTOSAVE_MODIFF (current_buffer)) - BUF_AUTOSAVE_MODIFF (current_buffer)++; + modiff_count m = MODIFF; + if (SAVE_MODIFF == m - 1) + SAVE_MODIFF = m; + if (BUF_AUTOSAVE_MODIFF (current_buffer) == m - 1) + BUF_AUTOSAVE_MODIFF (current_buffer) = m; } /* The before-change-function may have moved the gap diff --git a/src/fileio.c b/src/fileio.c index aececcda30..55c9f26b75 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -4618,7 +4618,7 @@ by calling `format-decode', which see. */) ptrdiff_t opoint = PT; ptrdiff_t opoint_byte = PT_BYTE; ptrdiff_t oinserted = ZV - BEGV; - EMACS_INT ochars_modiff = CHARS_MODIFF; + modiff_count ochars_modiff = CHARS_MODIFF; TEMP_SET_PT_BOTH (BEGV, BEGV_BYTE); insval = call3 (Qformat_decode, @@ -4658,7 +4658,7 @@ by calling `format-decode', which see. */) ptrdiff_t opoint = PT; ptrdiff_t opoint_byte = PT_BYTE; ptrdiff_t oinserted = ZV - BEGV; - EMACS_INT ochars_modiff = CHARS_MODIFF; + modiff_count ochars_modiff = CHARS_MODIFF; TEMP_SET_PT_BOTH (BEGV, BEGV_BYTE); insval = call1 (XCAR (p), make_fixnum (oinserted)); diff --git a/src/indent.c b/src/indent.c index 0970532f30..bc1aa8ca2c 100644 --- a/src/indent.c +++ b/src/indent.c @@ -49,7 +49,7 @@ ptrdiff_t last_known_column_point; /* Value of MODIFF when current_column was called. */ -static EMACS_INT last_known_column_modified; +static modiff_count last_known_column_modified; static ptrdiff_t current_column_1 (void); static ptrdiff_t position_indentation (ptrdiff_t); diff --git a/src/insdel.c b/src/insdel.c index a6f006a521..fd725ac878 100644 --- a/src/insdel.c +++ b/src/insdel.c @@ -903,7 +903,7 @@ insert_1_both (const char *string, the insertion. This, together with recording the insertion, will add up to the right stuff in the undo list. */ record_insert (PT, nchars); - MODIFF++; + modiff_incr (&MODIFF); CHARS_MODIFF = MODIFF; memcpy (GPT_ADDR, string, nbytes); @@ -1031,7 +1031,7 @@ insert_from_string_1 (Lisp_Object string, ptrdiff_t pos, ptrdiff_t pos_byte, #endif record_insert (PT, nchars); - MODIFF++; + modiff_incr (&MODIFF); CHARS_MODIFF = MODIFF; GAP_SIZE -= outgoing_nbytes; @@ -1088,7 +1088,7 @@ insert_from_gap (ptrdiff_t nchars, ptrdiff_t nbytes, bool text_at_gap_tail) of this dance. */ invalidate_buffer_caches (current_buffer, GPT, GPT); record_insert (GPT, nchars); - MODIFF++; + modiff_incr (&MODIFF); GAP_SIZE -= nbytes; if (! text_at_gap_tail) @@ -1228,7 +1228,7 @@ insert_from_buffer_1 (struct buffer *buf, #endif record_insert (PT, nchars); - MODIFF++; + modiff_incr (&MODIFF); CHARS_MODIFF = MODIFF; GAP_SIZE -= outgoing_nbytes; @@ -1329,7 +1329,7 @@ adjust_after_replace (ptrdiff_t from, ptrdiff_t from_byte, if (len == 0) evaporate_overlays (from); - MODIFF++; + modiff_incr (&MODIFF); CHARS_MODIFF = MODIFF; } @@ -1524,7 +1524,7 @@ replace_range (ptrdiff_t from, ptrdiff_t to, Lisp_Object new, check_markers (); - MODIFF++; + modiff_incr (&MODIFF); CHARS_MODIFF = MODIFF; if (adjust_match_data) @@ -1655,7 +1655,7 @@ replace_range_2 (ptrdiff_t from, ptrdiff_t from_byte, check_markers (); - MODIFF++; + modiff_incr (&MODIFF); CHARS_MODIFF = MODIFF; } @@ -1830,7 +1830,7 @@ del_range_2 (ptrdiff_t from, ptrdiff_t from_byte, at the end of the text before the gap. */ adjust_markers_for_delete (from, from_byte, to, to_byte); - MODIFF++; + modiff_incr (&MODIFF); CHARS_MODIFF = MODIFF; /* Relocate point as if it were a marker. */ @@ -1884,7 +1884,7 @@ modify_text (ptrdiff_t start, ptrdiff_t end) BUF_COMPUTE_UNCHANGED (current_buffer, start - 1, end); if (MODIFF <= SAVE_MODIFF) record_first_change (); - MODIFF++; + modiff_incr (&MODIFF); CHARS_MODIFF = MODIFF; bset_point_before_scroll (current_buffer, Qnil); diff --git a/src/keyboard.c b/src/keyboard.c index b3b55e73b6..cd1747ea88 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -1238,7 +1238,7 @@ static void adjust_point_for_property (ptrdiff_t, bool); Lisp_Object command_loop_1 (void) { - EMACS_INT prev_modiff = 0; + modiff_count prev_modiff = 0; struct buffer *prev_buffer = NULL; bool already_adjusted = 0; diff --git a/src/lisp.h b/src/lisp.h index 5159f050a4..5a0de4b12c 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -3490,6 +3490,28 @@ integer_to_uintmax (Lisp_Object num, uintmax_t *n) } } +/* A modification count. These are wide enough, and incremented + rarely enough, so that they should never overflow a 60-bit counter + in practice, and the code below assumes this so a compiler can + generate better code if EMACS_INT is 64 bits. */ +typedef intmax_t modiff_count; + +INLINE modiff_count +modiff_incr (modiff_count *a) +{ + modiff_count a0 = *a; + bool modiff_overflow = INT_ADD_WRAPV (a0, 1, a); + eassert (!modiff_overflow && *a >> 30 >> 30 == 0); + return a0; +} + +INLINE Lisp_Object +modiff_to_integer (modiff_count a) +{ + eassume (0 <= a && a >> 30 >> 30 == 0); + return make_int (a); +} + /* Defined in data.c. */ extern _Noreturn void wrong_choice (Lisp_Object, Lisp_Object); extern void notify_variable_watchers (Lisp_Object, Lisp_Object, diff --git a/src/marker.c b/src/marker.c index 36d6b10c74..b58051a8c2 100644 --- a/src/marker.c +++ b/src/marker.c @@ -30,7 +30,7 @@ along with GNU Emacs. If not, see . */ static ptrdiff_t cached_charpos; static ptrdiff_t cached_bytepos; static struct buffer *cached_buffer; -static EMACS_INT cached_modiff; +static modiff_count cached_modiff; /* Juanma Barranquero reported ~3x increased bootstrap time when byte_char_debug_check is enabled; so this diff --git a/src/pdumper.c b/src/pdumper.c index 7a8a90d4cf..d4fbc4b049 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -2797,7 +2797,7 @@ dump_hash_table (struct dump_context *ctx, static dump_off dump_buffer (struct dump_context *ctx, const struct buffer *in_buffer) { -#if CHECK_STRUCTS && !defined (HASH_buffer_E8695CAE09) +#if CHECK_STRUCTS && !defined HASH_buffer_AE2C8CE357 # error "buffer changed. See CHECK_STRUCTS comment." #endif struct buffer munged_buffer = *in_buffer; diff --git a/src/syntax.c b/src/syntax.c index 4616ae296f..dd2f56f2cf 100644 --- a/src/syntax.c +++ b/src/syntax.c @@ -175,7 +175,7 @@ static ptrdiff_t find_start_value; static ptrdiff_t find_start_value_byte; static struct buffer *find_start_buffer; static ptrdiff_t find_start_begv; -static EMACS_INT find_start_modiff; +static modiff_count find_start_modiff; static Lisp_Object skip_chars (bool, Lisp_Object, Lisp_Object, bool); @@ -489,7 +489,7 @@ parse_sexp_propertize (ptrdiff_t charpos) if (syntax_propertize__done <= charpos && syntax_propertize__done < zv) { - EMACS_INT modiffs = CHARS_MODIFF; + modiff_count modiffs = CHARS_MODIFF; safe_call1 (Qinternal__syntax_propertize, make_fixnum (min (zv, 1 + charpos))); if (modiffs != CHARS_MODIFF) @@ -608,7 +608,7 @@ find_defun_start (ptrdiff_t pos, ptrdiff_t pos_byte) if (!NILP (Vcomment_use_syntax_ppss)) { - EMACS_INT modiffs = CHARS_MODIFF; + modiff_count modiffs = CHARS_MODIFF; Lisp_Object ppss = call1 (Qsyntax_ppss, make_fixnum (pos)); if (modiffs != CHARS_MODIFF) error ("syntax-ppss modified the buffer!"); diff --git a/src/textprop.c b/src/textprop.c index 7e29ed6e8b..bb063d3eaa 100644 --- a/src/textprop.c +++ b/src/textprop.c @@ -89,7 +89,7 @@ modify_text_properties (Lisp_Object buffer, Lisp_Object start, Lisp_Object end) BUF_COMPUTE_UNCHANGED (buf, b - 1, e); if (MODIFF <= SAVE_MODIFF) record_first_change (); - MODIFF++; + modiff_incr (&MODIFF); bset_point_before_scroll (current_buffer, Qnil); diff --git a/src/window.h b/src/window.h index 9c4aea85ea..514bf1fb6e 100644 --- a/src/window.h +++ b/src/window.h @@ -281,11 +281,11 @@ struct window /* Displayed buffer's text modification events counter as of last time display completed. */ - EMACS_INT last_modified; + modiff_count last_modified; /* Displayed buffer's overlays modification events counter as of last complete update. */ - EMACS_INT last_overlay_modified; + modiff_count last_overlay_modified; /* Value of point at that time. Since this is a position in a buffer, it should be positive. */ commit a68eee50eb515b28b448894299334afced26ef78 Author: Paul Eggert Date: Thu Jan 31 07:30:32 2019 -0800 Minor pdumper simplification * src/pdumper.c (dump_roots, pdumper_load): Simplify initialization. (dump_bitset_init, pdumper_load): Omit unnecessary assignments. (dump_bitset_destroy): Remove; never called. All callers removed. (dump_do_dump_relocation, pdumper_load): Add FIXME comment. (pdumper_load): Simplify by assuming C99. Remove unused local. diff --git a/src/pdumper.c b/src/pdumper.c index f9638d4357..7a8a90d4cf 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -1785,10 +1785,8 @@ dump_root_visitor (Lisp_Object *root_ptr, enum gc_root_type type, void *data) static void dump_roots (struct dump_context *ctx) { - struct gc_root_visitor visitor; - memset (&visitor, 0, sizeof (visitor)); - visitor.visit = dump_root_visitor; - visitor.data = ctx; + struct gc_root_visitor visitor = { .visit = dump_root_visitor, + .data = ctx }; visit_static_gc_roots (visitor); } @@ -4949,7 +4947,6 @@ struct dump_bitset { static bool dump_bitset_init (struct dump_bitset *bitset, size_t number_bits) { - memset (bitset, 0, sizeof (*bitset)); int xword_size = sizeof (bitset->bits[0]); int bits_per_word = xword_size * CHAR_BIT; ptrdiff_t words_needed = DIVIDE_ROUND_UP (number_bits, bits_per_word); @@ -4958,12 +4955,6 @@ dump_bitset_init (struct dump_bitset *bitset, size_t number_bits) return bitset->bits != NULL; } -static void -dump_bitset_destroy (struct dump_bitset *bitset) -{ - free (bitset->bits); -} - static dump_bitset_word * dump_bitset__bit_slot (const struct dump_bitset *bitset, size_t bit_number) @@ -5290,8 +5281,6 @@ dump_do_dump_relocation ( struct bignum_reload_info reload_info; verify (sizeof (reload_info) <= sizeof (bignum->value)); memcpy (&reload_info, &bignum->value, sizeof (reload_info)); - memset (&bignum->value, 0, sizeof (bignum->value)); - mpz_init (bignum->value); const mp_limb_t *limbs = dump_ptr (dump_base, reload_info.data_location); mpz_roinit_n (bignum->value, limbs, reload_info.nlimbs); @@ -5395,9 +5384,6 @@ enum dump_section enum pdumper_load_result pdumper_load (const char *dump_filename) { - enum pdumper_load_result err = PDUMPER_LOAD_ERROR; - - int dump_fd = -1; intptr_t dump_size; struct stat stat; uintptr_t dump_base; @@ -5405,18 +5391,14 @@ pdumper_load (const char *dump_filename) dump_off adj_discardable_start; struct dump_bitset mark_bits; - bool free_mark_bits = false; size_t mark_bits_needed; - struct dump_header header_buf; + struct dump_header header_buf = { 0 }; struct dump_header *header = &header_buf; - struct dump_memory_map sections[NUMBER_DUMP_SECTIONS]; + struct dump_memory_map sections[NUMBER_DUMP_SECTIONS] = { 0 }; const struct timespec start_time = current_timespec (); - char *dump_filename_copy = NULL; - - memset (&header_buf, 0, sizeof (header_buf)); - memset (§ions, 0, sizeof (sections)); + char *dump_filename_copy; /* Overwriting an initialized Lisp universe will not go well. */ eassert (!initialized); @@ -5424,8 +5406,8 @@ pdumper_load (const char *dump_filename) /* We can load only one dump. */ eassert (!dump_loaded_p ()); - err = PDUMPER_LOAD_FILE_NOT_FOUND; - dump_fd = emacs_open (dump_filename, O_RDONLY, 0); + enum pdumper_load_result err = PDUMPER_LOAD_FILE_NOT_FOUND; + int dump_fd = emacs_open (dump_filename, O_RDONLY, 0); if (dump_fd < 0) goto out; @@ -5470,10 +5452,10 @@ pdumper_load (const char *dump_filename) goto out; } - err = PDUMPER_LOAD_OOM; + /* FIXME: The comment at the start of this function says it should + not use xmalloc, but xstrdup calls xmalloc. Either fix the + comment or fix the following code. */ dump_filename_copy = xstrdup (dump_filename); - if (!dump_filename_copy) - goto out; err = PDUMPER_LOAD_OOM; @@ -5518,13 +5500,11 @@ pdumper_load (const char *dump_filename) DIVIDE_ROUND_UP (header->discardable_start, DUMP_ALIGNMENT); if (!dump_bitset_init (&mark_bits, mark_bits_needed)) goto out; - free_mark_bits = true; /* Point of no return. */ err = PDUMPER_LOAD_SUCCESS; dump_base = (uintptr_t) sections[DS_HOT].mapping; gflags.dumped_with_pdumper_ = true; - free_mark_bits = false; dump_private.header = *header; dump_private.mark_bits = mark_bits; dump_public.start = dump_base; @@ -5547,13 +5527,10 @@ pdumper_load (const char *dump_filename) timespec_sub (current_timespec (), start_time); dump_private.load_time = timespectod (load_timespec); dump_private.dump_filename = dump_filename_copy; - dump_filename_copy = NULL; out: for (int i = 0; i < ARRAYELTS (sections); ++i) dump_mmap_release (§ions[i]); - if (free_mark_bits) - dump_bitset_destroy (&mark_bits); if (dump_fd >= 0) emacs_close (dump_fd); return err;