1. 04 Aug, 2020 1 commit
    • Paul Eggert's avatar
      Simplify use of __lsan_ignore_object · a1436544
      Paul Eggert authored
      * configure.ac: Use AC_CHECK_FUNCS_ONCE for __lsan_ignore_object.
      * src/buffer.c, src/data.c, src/emacs-module.c, src/regex-emacs.c:
      * src/search.c: Use __lsan_ignore_object unconditionally, and don’t
      include sanitizer/lsan_interface.h.
      * src/lisp.h (__lsan_ignore_object): Provide a dummy in the
      typical case where leak sanitization is not available.
      a1436544
  2. 01 Aug, 2020 2 commits
    • Philipp Stephani's avatar
      Use a more precise check for '__lsan_ignore_object' · 06310cf9
      Philipp Stephani authored
      * configure.ac: Add check for __lsan_ignore_object.
      
      * src/buffer.c (enlarge_buffer_text):
      * src/data.c (make_blv):
      * src/emacs-module.c (Fmodule_load, initialize_environment):
      * src/regex-emacs.c (regex_compile):
      * src/search.c (newline_cache_on_off): Use new configuration macro.
      06310cf9
    • Philipp Stephani's avatar
      Suppress leak detector in some cases · c3b53559
      Philipp Stephani authored
      We intentionally leak some objects.  Prevent the ASan leak detector
      from raising false alarms in these cases.
      
      * configure.ac: Search for lsan_interface.h header.
      
      * src/data.c (make_blv): Allow leaking of buffer-local values.
      
      * src/buffer.c (enlarge_buffer_text): Allow leaking of buffer text.
      
      * src/emacs-module.c (Fmodule_load, initialize_environment): Allow
      intentional leak of runtime and environment objects if module
      assertions are enabled.
      c3b53559
  3. 03 May, 2020 1 commit
  4. 26 Mar, 2020 1 commit
    • Paul Eggert's avatar
      Refactor and fix typo in CHECK_*_COERCE_MARKER · 57f5a63d
      Paul Eggert authored
      * src/data.c (check_integer_coerce_marker)
      (check_number_coerce_marker): New functions.
      Also, fix a typo in the former, by having it use
      Qinteger_or_marker_p not Qnumber_or_marker_p.
      (arithcompare, floatop_arith_driver, bignum_arith_driver)
      (arith_driver, Fplus, Fminus, Ftimes, Fquo, Frem, Fmod)
      (minmax_driver, Flogand, Flogior, Flogxor, Fadd1, Fsub1):
      Use them in place of the similarly-named macros.
      * src/lisp.h (CHECK_NUMBER_COERCE_MARKER)
      (CHECK_INTEGER_COERCE_MARKER): Remove; no longer used.
      57f5a63d
  5. 23 Mar, 2020 1 commit
    • Noam Postavsky's avatar
      Don't signal during backtrace unrewind (Bug#40088) · 8944310d
      Noam Postavsky authored
      backtrace_eval_unrewind is used to temporarily reverse
      let-bindings (it's called with a positive argument to reverse
      bindings, and then a negative argument to re-apply them) by
      backtrace--locals and backtrace-eval.  For the SPECPDL_LET_DEFAULT and
      SPECPDL_LET_LOCAL cases (which occur for let-bindings on buffer-local
      variables), the code calls Fdefault_value and Fbuffer_local_value on
      the symbol.
      
      For symbols which are unbound at top-level, the first (with positive
      argument) call to backtrace_eval_unrewind will set the symbol's value
      to unbound (putting the current value in the specpdl's "old value"
      slot).  On the second (with negative argument) call,
      backtrace_eval_unrewind attempts to retrieve the symbol's value with
      Fdefault_value or Fbuffer_local_value, but that raises a void-variable
      signal.  This interrupts the restoration of the let-bindings, so any
      other variables more recent on the stack will now have the wrong
      value.
      
      * src/data.c (default_value): Make non-static.
      * src/lisp.h: Declare it.
      * src/eval.c (backtrace_eval_unrewind): Replace the calls to
      Fdefault_value and Fbuffer_local_value with default_value and
      buffer_local_value, respectively.  The latter do exactly the same as
      the former, except if the symbol's value is Qunbound they just return
      it instead of signaling void-variable.
      8944310d
  6. 22 Feb, 2020 1 commit
    • Paul Eggert's avatar
      Restore runtime check for invalid tag · 202c3319
      Paul Eggert authored
      * src/data.c (wrong_type_argument): Restore check that the
      object’s tag is valid, since invalid tags exist again.
      * src/lisp.h (Lisp_Type_Unused0): New constant.
      202c3319
  7. 18 Jan, 2020 2 commits
    • Paul Eggert's avatar
      Make Faset nonrecursive · ac121d8c
      Paul Eggert authored
      * src/data.c (Faset): Refactor Faset so that it’s not recursive.
      This helps the compiler and makes the code a bit clearer.
      ac121d8c
    • Paul Eggert's avatar
      Improve performance when a string's byte count changes · c1b6d5c5
      Paul Eggert authored
      * src/alloc.c (allocate_string_data): Now static.
      Remove code for when Faset calls this function when S
      already has data assigned, as that can no longer happen.
      (resize_string_data): New function, which avoids relocation in
      more cases than the old code did, by not bothering to relocate
      when the size changes falls within the alignment slop.
      * src/data.c (Faset): Use resize_string_data.
      Change a while to a do-while since it must iterate at least once.
      c1b6d5c5
  8. 04 Jan, 2020 1 commit
    • Paul Eggert's avatar
      Let the OS clear new large strings of NUL · cadf985c
      Paul Eggert authored
      On my platform, this sped up (make-string 4000000000 0) from 2.5
      to 0.015 seconds (not that people should want to do this much :-).
      * src/alloc.c (allocate_string_data): New arg CLEARIT.
      Callers changed.
      (Fmake_string): Prefer calloc to malloc+memset when allocating a
      large string of NUL bytes.
      (make_clear_string): New function.
      (make_uninit_string): Use it.
      (make_clear_multibyte_string): New function.
      (make_uninit_multibyte_string): Use it.
      cadf985c
  9. 01 Jan, 2020 2 commits
    • Paul Eggert's avatar
      Assume C99-style ‘long long’ · 12d004d6
      Paul Eggert authored
      Now that Gnulib assumes ‘long long’, it is a good time to clean
      out old cruft porting to pre-C99 compilers that lack it.
      * src/data.c (ULL_WIDTH, ULL_MAX): Remove.
      All uses replaced by ULLONG_WIDTH, ULLONG_MAX.
      (bits_word_to_host_endian): Assume ‘unsigned long long’.
      By the way, the old code had a performance typo: it used
      HAVE_UNSIGNED_LONG_LONG where it should have used
      HAVE_UNSIGNED_LONG_LONG_INT.
      * src/sysdep.c (ULLONG_MAX): Remove, as lib/limits.h does this now.
      (time_from_jiffies) [GNU_LINUX]: Assume ‘long long’.
      12d004d6
    • Paul Eggert's avatar
      Update copyright year to 2020 · 365e01cc
      Paul Eggert authored
      Run "TZ=UTC0 admin/update-copyright $(git ls-files)".
      365e01cc
  10. 15 Nov, 2019 1 commit
  11. 13 Nov, 2019 1 commit
    • Paul Eggert's avatar
      Refactor bignum multiplication, exponentiation · 02e637ec
      Paul Eggert authored
      This doesn’t alter behavior, and simplifies the next commit.
      * src/bignum.c (GMP_NLIMBS_MAX, NLIMBS_LIMIT, emacs_mpz_size)
      (emacs_mpz_mul, emacs_mpz_mul_2exp, emacs_mpz_pow_ui): Move here ...
      * src/data.c: ... from here.
      02e637ec
  12. 06 Nov, 2019 2 commits
    • Paul Eggert's avatar
      Simplify fixnum division slightly · b5bcc6f9
      Paul Eggert authored
      * src/data.c (arith_driver): Streamline fixnum division a bit
      more, and add a comment about why overflow is impossible.
      This responds to a private comment by Stefan Monnier.
      b5bcc6f9
    • Paul Eggert's avatar
      Remove unneeded overflow check in integer division · 6039acb8
      Paul Eggert authored
      * src/data.c (arith_driver): Remove unnecessary runtime test,
      since integer overflow is impossible on division of fixnums,
      given that the worst case is MOST_NEGATIVE_FIXNUM / -1 which is
      representable as an EMACS_INT (albeit not as a fixnum).
      6039acb8
  13. 05 Nov, 2019 2 commits
    • Paul Eggert's avatar
      Overflow errors are range errors · 799d738b
      Paul Eggert authored
      * etc/NEWS: Mention this.
      * doc/lispref/errors.texi (Standard Errors):
      Document overflow-error, which was formerly undocumented.
      It is a range error, not a domain error.
      * src/data.c (syms_of_data): overflow-error and (undocumented)
      underflow-error are subtypes range-error, not domain-error.
      This fixes bugs in timezone-time-from-absolute and in
      erc-ctcp-reply-PING.
      799d738b
    • Paul Eggert's avatar
      Don’t signal overflow for (expt 1 bignum) · 5ab29400
      Paul Eggert authored
      Similarly for (expt 0 bignum) and (expt -1 bignum).
      The result is always a -1, 0 or 1, so do not signal overflow.
      * src/data.c (expt_integer): Do not signal an overflow if
      -1 <= X <= 1.  Be clearer about when overflow is signaled.
      * test/src/floatfns-tests.el (bignum-expt): Test this.
      5ab29400
  14. 24 Aug, 2019 4 commits
    • Paul Eggert's avatar
      Speed up % and mod with fixnum denom · a050cf80
      Paul Eggert authored
      * src/data.c (integer_remainder): New function.  When the
      numerator is a bignum and the denominator is small, this function
      uses mpz_tdiv_ui, which should be faster than mpz_tdiv_r.
      (Frem, Fmod): Use it.
      a050cf80
    • Paul Eggert's avatar
      Tweak integer mod performance · 2f7ca402
      Paul Eggert authored
      * src/data.c (integer_mod): Use mpz_tdiv_r not mpz_mod, as that’s
      more similar to the fixnum case, is a bit more efficient, and
      otherwise the later ‘sgn_r < 0’ code is useless anyway.
      2f7ca402
    • Paul Eggert's avatar
      Make (mod 1.0 0) consistent with (/ 1.0 0) · 575179f7
      Paul Eggert authored
      * src/data.c (Fmod): Do not signal an error for (mod 1.0 0), for
      the same reason (/ 1.0 0) does not signal an error.
      * test/src/data-tests.el (data-tests-mod-0): New test.
      575179f7
    • Paul Eggert's avatar
      extern function cleanup · b62eac0f
      Paul Eggert authored
      Most of these functions can be static.  A few are unused.
      * src/coding.c (encode_string_utf_8, decode_string_utf_8):
      Define only if ENABLE_UTF_8_CONVERTER_TEST, as they're
      not needed otherwise.
      * src/coding.c (encode_string_utf_8, decode_string_utf_8):
      * src/data.c (integer_mod):
      * src/fns.c (base64_encode_region_1, base64_encode_string_1):
      * src/ftfont.c (ftfont_get_fc_charset):
      Now static.
      * src/sysdep.c (verrprintf): Remove; unused.
      b62eac0f
  15. 22 Aug, 2019 1 commit
    • Paul Eggert's avatar
      Don’t debug fset by default · 2b552f34
      Paul Eggert authored
      This GC bug seems to have been fixed, so the check is no longer
      needed in production code.  From a suggestion by Pip Cet in:
      https://lists.gnu.org/r/emacs-devel/2019-08/msg00316.html
      * src/alloc.c (SUSPICIOUS_OBJECT_CHECKING) [!ENABLE_CHECKING]:
      Do not define.
      (find_suspicious_object_in_range, detect_suspicious_free):
      Expand to proper dummy expressions if !SUSPICIOUS_OBJECT_CHECKING.
      * src/data.c (Ffset): Convert test to an eassert.
      2b552f34
  16. 21 Aug, 2019 1 commit
    • Paul Eggert's avatar
      Be more careful about pointers to bignum vals · 39fee209
      Paul Eggert authored
      This uses ‘const’ to be better at catching bugs that
      mistakenly attempt to modify a bignum value.
      Lisp bignums are supposed to be immutable.
      * src/alloc.c (make_pure_bignum):
      * src/fns.c (sxhash_bignum):
      Accept Lisp_Object instead of struct Lisp_Bignum *, as that’s
      simpler now.  Caller changed.
      * src/bignum.h (bignum_val, xbignum_val): New inline functions.
      Prefer them to &i->value and XBIGNUM (i)->value, since they
      apply ‘const’ to the result.
      * src/timefns.c (lisp_to_timespec): Use mpz_t const *
      to point to a bignum value.
      39fee209
  17. 18 Aug, 2019 1 commit
    • Paul Eggert's avatar
      Improve bignum_integer static checking · 780509f2
      Paul Eggert authored
      * src/bignum.h (bignum_integer): Now returns pointer-to-const,
      to catch trivial mistakes where the caller might try to modify
      a Lisp bignum.  Lisp bignums are supposed to be immutable.
      All callers changed.
      780509f2
  18. 06 Aug, 2019 1 commit
    • Paul Eggert's avatar
      decode-time now returns subsec too · b06917a4
      Paul Eggert authored
      The list that decode-time returns now contains an extra
      trailing component that counts the subseconds part of the
      original timestamp (Bug#36549).
      This builds on a suggestion by Lars Ingebrigtsen in:
      https://lists.gnu.org/r/emacs-devel/2019-07/msg00734.html
      * doc/lispref/os.texi (Time Conversion):
      * doc/misc/emacs-mime.texi (time-date):
      * etc/NEWS: Document this.
      * lisp/calendar/icalendar.el (icalendar--decode-isodatetime):
      * lisp/calendar/iso8601.el (iso8601-parse)
      (iso8601-parse-time, iso8601-parse-duration)
      (iso8601--decoded-time):
      * lisp/calendar/parse-time.el (parse-time-string):
      * lisp/calendar/time-date.el (make-decoded-time)
      (decoded-time-set-defaults):
      * lisp/org/org.el (org-fix-decoded-time)
      (org-parse-time-string):
      * src/timefns.c (Fdecode_time):
      Generate subsec member for decoded time.
      * lisp/calendar/time-date.el (decoded-time-add)
      Add the decoded subsec too.
      * lisp/simple.el (decoded-time): New subsec member.
      * src/data.c (Frem): Simplify zero-check to match that of new Fmod.
      (integer_mod): New function, with most of the guts of the old Fmod.
      Remove redundant zero-check.
      (Fmod): Use it.
      * src/timefns.c (Fencode_time): Handle new subsec member
      or (with the obsolescent calling convention) subsec arg.
      It defaults to 0.
      * test/lisp/calendar/icalendar-tests.el:
      (icalendar--decode-isodatetime):
      * test/lisp/calendar/iso8601-tests.el (test-iso8601-date-years)
      (test-iso8601-date-dates, test-iso8601-date-obsolete)
      (test-iso8601-date-weeks, test-iso8601-date-ordinals)
      (test-iso8601-time, test-iso8601-combined)
      (test-iso8601-duration, test-iso8601-intervals)
      (standard-test-dates, standard-test-time-of-day-fractions)
      (standard-test-time-of-day-beginning-of-day)
      (standard-test-time-of-day-utc)
      (standard-test-time-of-day-zone)
      (standard-test-date-and-time-of-day, standard-test-interval):
      * test/lisp/calendar/parse-time-tests.el (parse-time-tests):
      * test/src/timefns-tests.el (format-time-string-with-zone)
      (encode-time-dst-numeric-zone):
      Adjust to match new behavior.
      b06917a4
  19. 27 Jun, 2019 1 commit
    • Paul Eggert's avatar
      Clean up use of XFIXNUM etc. · 4893a09c
      Paul Eggert authored
      A few bits of the code were relying on the fact that XFIXNUM,
      XFIXNAT, and XUFIXNUM do something even with arguments that
      are not fixnums/fixnats.  Separate these rare uses out into
      XFIXNUM_RAW and XUFIXNUM_RAW.
      Problem and original patch reported by Pip Cet (Bug#36370).
      * src/ccl.c (Fccl_execute_on_string):
      * src/fileio.c (Finsert_file_contents, a_write)
      (Fdo_auto_save):
      * src/process.c (conv_lisp_to_sockaddr):
      * src/textprop.c (Fnext_single_char_property_change)
      (Fprevious_single_char_property_change)
      (Fnext_property_change, Fnext_single_property_change)
      (Fprevious_property_change)
      (Fprevious_single_property_change):
      Don’t assume fixnums are nonnegative.
      * src/ccl.c (Fccl_execute_on_string):
      Fix range-checking bug if AREF (status, i) is out of int range.
      * src/data.c (arith_driver): Use XFIXNUM_RAW as we want
      efficient garbage if the value is not a fixnum.
      * src/dosfns.c (Fint86, Fdos_memput):
      Check that args are nonnegative.
      * src/image.c (lookup_image): Check that args are in range.
      * src/lisp.h (lisp_h_XHASH): Use XUFIXNUM_RAW, since this
      is for hashing.
      (lisp_h_XFIXNAT, XFIXNAT) [USE_LSB_TAG]: Remove macros.
      (lisp_h_XFIXNUM_RAW, XFIXNUM_RAW) [USE_LSB_TAG]: New macros, with
      the semantics of the old macros without _RAW.
      (XFIXNUM_RAW, XUFIXNUM_RAW): New inline functions, with the
      semantics of the old functions without _RAW.
      (FIXNUMP): Move definition up to avoid forward use.
      (XFIXNUM, XFIXNAT, XUFIXNUM): Use eassume to add a runtime
      check (when debugging) that the argument has the proper form.
      (XFIXNUM, XFIXNAT): Now inline functions only, since they
      refer to their arguments more than once now that they use eassume.
      * src/textprop.c (Fprevious_single_char_property_change):
      Avoid fixnum overflow with invalid input.
      (set_text_properties): Fix unlikely failure
      to validate arguments, by using EQ instead of XFIXNAT.
      * src/w32term.c (w32_draw_glyph_string):
      * src/xterm.c (x_draw_glyph_string):
      Treat negative minimums as 0 rather than as garbage patterns.
      4893a09c
  20. 22 May, 2019 1 commit
    • Paul Eggert's avatar
      Remove fixnum restriction on some display vars · dfed333b
      Paul Eggert authored
      This is a minor patch to remove some fixnum restrictions.
      Many more such patches are needed, but one thing at a time.
      * doc/emacs/custom.texi (Examining): Update fill-column example.
      * src/buffer.c (fill-column, left-margin, tab-width)
      (buffer-saved-size, left-margin-width, right-margin-width)
      (left-fringe-width, right-fringe-width, scroll-bar-width)
      (scroll-bar-height, buffer-display-count):
      Allow any integer; do not restrict to fixnums.
      * src/character.h (SANE_TAB_WIDTH): Do not assume tab_width
      is a nonnegative fixnum.
      (sanitize_tab_width): Take a Lisp_Object integer, not an
      EMACS_INT.  Only use changed.
      * src/data.c (store_symval_forwarding): Remove unnecessary
      SYMBOLP since the predicate (e.g., Qintegerp) is always a
      symbol (leave the test in as an eassert).  Avoid assignments
      inside if-conditions.
      * src/fileio.c (Fdo_auto_save): Do not assume
      buffer-saved-size is a fixnum.  Avoid undefined behavior
      on EMACS_INT overflow by multiplying a fixnum by at most 4,
      not by at most 13.
      * src/window.c (set_window_buffer): When buffer-display-count
      is too large for a fixnum, make it a bignum.
      * src/xdisp.c (FILL_COLUMN_INDICATOR_NEEDED): Remove macro, ...
      (fill_column_indicator_column): ... replacing with this new function.
      All uses changed.  The function is a bit pickier, to prevent
      problems with non-character fixnums and columns out of range
      for int, and to remove the assumption that integers are in
      fixnum range.
      (append_space_for_newline, extend_face_to_end_of_line):
      Avoid undefined behavior with signed integer overflow.
      Simplify.
      dfed333b
  21. 29 Apr, 2019 1 commit
  22. 19 Apr, 2019 2 commits
    • Philipp Stephani's avatar
      Remove some ineffective #ifdefs. · 992fd76c
      Philipp Stephani authored
      Since DEFSYM doesn't by itself do anything and make-docfile ignores
      preprocessor statements, conditional compilation of DEFSYMs is
      ineffective.
      
      * src/data.c (syms_of_data): Remove ineffective #ifdefs.
      992fd76c
    • Philipp Stephani's avatar
      Remove some #ifdefs for user pointers. · e7cb6eea
      Philipp Stephani authored
      Even if Emacs is compiled without module support, we don't have to
      comment out every bit of user pointer support.  Defining the basic
      structures and functions and detecting user pointers in switch
      statements is harmless, and we're already doing the same for module
      functions.  Removing these #ifdefs makes the code a bit easier to
      read.
      
      * src/lisp.h (PVEC_USER_PTR, struct Lisp_User_Ptr, USER_PTRP)
      (XUSER_PTR): Define unconditionally.
      
      * src/data.c (Ftype_of):
      * src/alloc.c (cleanup_vector):
      * src/print.c (print_vectorlike):
      * src/pdumper.c (dump_vectorlike): Remove #ifdef for user pointers.
      e7cb6eea
  23. 18 Apr, 2019 1 commit
    • Paul Eggert's avatar
      Mark _Noreturn error functions as cold · 6d6c55db
      Paul Eggert authored
      On my platform this made ‘make compile-always’ 1.3% faster.
      Suggested by Alex Gramiak in:
      https://lists.gnu.org/r/emacs-devel/2019-04/msg00684.html
      * configure.ac (nw): Don’t use -Wsuggest-attribute=cold.
      * lib-src/make-docfile.c (write_globals):
      Mark noreturn functions as cold.
      * src/callproc.c (exec_failed):
      * src/data.c (wrong_length_argument, wrong_type_argument):
      * src/emacs-module.c (module_abort):
      * src/emacs.c (terminate_due_to_signal):
      * src/eval.c (unwind_to_catch):
      * src/image.c (my_png_error, my_error_exit):
      * src/json.c (json_out_of_memory, json_parse_error):
      * src/keyboard.c (quit_throw_to_read_char, user_error):
      * src/lisp.h (die, wrong_type_argument, wrong_choice)
      (args_out_of_range, args_out_of_range_3, circular_list)
      (buffer_overflow, memory_full, buffer_memory_full)
      (string_overflow, xsignal, xsignal0, xsignal1, xsignal2)
      (xsignal3, signal_error, overflow_error, error, verror)
      (nsberror, report_file_errno, report_file_error)
      (report_file_notify_error, terminate_due_to_signal)
      (emacs_abort, fatal):
      * src/lread.c (load_error_old_style_backquotes)
      (end_of_file_error, invalid_syntax):
      * src/pdumper.c (error_unsupported_dump_object):
      * src/puresize.h (pure_write_error):
      * src/search.c (matcher_overflow):
      * src/sound.c (sound_perror, alsa_sound_perror):
      * src/sysdep.c (handle_arith_signal):
      * src/systime.h (time_overflow):
      * src/term.c (maybe_fatal, vfatal):
      * src/textprop.c (text_read_only):
      * src/timefns.c (invalid_time_zone_specification)
      (time_error, invalid_hz):
      * src/xterm.c (x_connection_closed):
      Use AVOID instead of _Noreturn void, so that it’s marked cold.
      * src/conf_post.h (__has_attribute_cold) [!__has_attribute]:
      New macro.
      (ATTRIBUTE_COLD): New macro.
      * src/frame.h (WINDOW_SYSTEM_RETURN): Add ATTRIBUTE_COLD.
      * src/lisp.h (AVOID): New macro.
      * src/xterm.c: Omit unnecessary static decls, so that we needn’t
      worry about which functions should be marked cold.
      (x_io_error_quitter): Mark as cold.
      6d6c55db
  24. 01 Apr, 2019 3 commits
    • Paul Eggert's avatar
      Make struct Lisp_Objfwd etc. objects read-only · 74b63d27
      Paul Eggert authored
      Initialize these objects statically, and make them constants.
      This is a bit safer and more efficient.
      * src/data.c (XBOOLFWD, XKBOARD_OBJFWD, XFIXNUMFWD, XOBJFWD):
      * src/lisp.h (XBUFFER_OBJFWD):
      Return a pointer-to-const instead of an unrestricted pointer.
      (lispfwd): fwdptr is now a pointer-to-const instead of an
      unrestricted pointer.  All uses changed.
      (SET_SYMBOL_FWD): Accept pointer-to-const instead of an
      unrestricted pointer.
      (DEFVAR_LISP, DEFVAR_LISP_NOPRO, DEFVAR_BOOL, DEFVAR_INT)
      (DEFVAR_KBOARD): Initialize static structures statically
      instead of dynamically, and make them const.
      * src/lread.c (defvar_int, defvar_bool, defvar_lisp_nopro)
      (defvar_lisp, defvar_kboard): Accept pointer-to-const instead
      of an unrestricted pointer; it’s now the caller’s
      responsibility to initialize the pointed-to storage.  No need
      for a separate address argument any more.  All callers
      changed.
      74b63d27
    • Paul Eggert's avatar
      Fix union Lisp_Fwd * alignment bug · 9287813d
      Paul Eggert authored
      It's not portable to cast (e.g.) struct Lisp_Objfwd * to union
      Lisp_Fwd * and then back again, because the compiler can then assume
      that the pointer is aligned for union Lisp_Fwd * when accessing
      the struct Lisp_Objfwd * components, and this assumption might
      be incorrect becase we don't force that alignment.
      * src/lisp.h (lispfwd): New type, replacing ...
      (union Lisp_Fwd): ... this type, which was removed.
      All uses changed.
      (SET_SYMBOL_FWD): 2nd arg is now void *, not lispfwd.
      All uses changed (casts no longer needed; they were
      not portable anyway).
      9287813d
    • Stefan Monnier's avatar
      * lisp/subr.el (setq-default): Define as a macro · 197fbfc7
      Stefan Monnier authored
      * lisp/emacs-lisp/bytecomp.el (byte-compile-setq-default): Delete.
      (byte-compile-set-default): Inline the part that it used.
      
      * lisp/emacs-lisp/edebug.el (setq-default): Remove the debug spec.
      
      * src/data.c (Fsetq_default): Delete.
      (syms_of_data): Don't register.
      197fbfc7
  25. 27 Feb, 2019 1 commit
    • Paul Eggert's avatar
      DEFVAR_INT variables are now intmax_t · e828765d
      Paul Eggert authored
      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.
      e828765d
  26. 12 Feb, 2019 1 commit
  27. 15 Jan, 2019 1 commit
    • Daniel Colascione's avatar
      Add portable dumper · d12e5d00
      Daniel Colascione authored
      Add a new portable dumper as an alternative to unexec.  Use it by default.
      
      * src/dmpstruct.awk: New file.
      * src/doc.c (get_doc_string): use will_dump_p().
      * src/editfns.c (styled_format): silence compiler warning
      with UNINIT.
      * src/emacs-module.c (syms_of_module): staticpro ltv_mark.
      * src/emacs.c (gflags): new variable.
      (init_cmdargs): unwrap
      (string_starts_with_p, find_argument, dump_error_to_string)
      (load_pdump): new functions.
      (main): detect pdumper and --temacs invocation; actually load
      portable dump when detected; set gflags as appropriate; changes to
      init functions throughout to avoid passing explicit
      'initialized' argument.
      * src/eval.c (inhibit_lisp_code): remove unused variable.
      (init_eval_once_for_pdumper): new function.
      (init_eval_once): call it.
      * src/filelock.c: CANNOT_DUMP -> will_dump_p()
      * src/fingerprint-dummy.c: new file
      * src/fingerprint.h: new file
      * src/fns.c: CANNOT_DUMP -> will_dump_p(), etc.
      (weak_hash_tables): remove
      (hashfn_equal, hashfn_eql): un-staticify
      (make_hash_table): set new 'next_weak' hash table field; drop
      global weak_hash_tables logic.
      (copy_hash_table): drop global weak_hash_tables logic.
      (hash_table_rehash): new function.
      (hash_lookup, hash_put, hash_remove_from_table, hash_clear):
      rehash if needed.
      (sweep_weak_table): un-staticify; explain logic; bool-ify.
      (sweep_weak_hash_tables): remove function.
      * src/font.c (syms_of_font): remember pdumper stuff.
      * src/fontset.c (syms_of_fontset): remember pdumper stuff.
      * src/frame.c (make_initial_frame): don't reset Vframe_list.
      (init_frame_once_for_pdumper, init_frame_once): new functions.
      (syms_of_frame): remove redundant staticpro.
      * src/fringe.c (init_fringe_once_for_pdumper): new functin.
      (init_fringe_once): call it.
      * src/ftcrfont.c (syms_of_ftcrfont_for_pdumper): new function.
      (syms_of_ftcrfont): call it.
      * src/ftfont.c (syms_of_ftfont_for_pdumper): new function.
      (syms_of_ftfont): call it.
      * src/ftxont.c (syms_of_ftxfont_for_pdumper): new function.
      (syms_of_ftxfont): call it.
      * src/gmalloc.c: adjust for pdumper througout
      (DUMPED): remove weird custom dumped indicator.
      * src/gnutls.c (syms_of_gnutls): pdumper note for
      gnutls_global_initialized.
      * src/image.c (syms_of_image): add pdumper comment,
      initializer note.
      * src/insdel.c (prepare_to_modify_buffer_1): account
      for buffer contents possibly being in dump image.
      * src/keyboard.c (syms_of_keyboard_for_pdumper): new function.
      (syms_of_keyboard): staticpro more; call pdumper syms function.
      * src/lisp.h: add comments throughout
      (gflags): declare.
      (will_dump_p, will_bootstrap_p, will_dump_with_pdumper_p)
      (dumped_with_pdumper_p, will_dump_with_unexec_p)
      (dumped_with_unexec_p, definitely_will_not_unexec_p): new
      functions.
      (POWER_OF_2, ROUNDUP): move macros.
      (PSEUDOVECTOR_TYPE, PSEUDOVECTOR_TYPEP): take vectorlike header
      pointer instead of vector; constify.
      (Lisp_Hash_Table): add comment about need to rehash on access; add
      comment for next_weak.
      (HASH_KEY, HASH_VALUE, HASH_HASH, HASH_TABLE_SIZE): const-ify.
      (hash_table_rehash): declare.
      (hash_rehash_needed_p, hash_rehash_if_needed): new functions.
      (finalizers, doomed_finalizers): declare extern.
      (SUBR_SECTION_ATTRIBUTE): new macro.
      (staticvec, staticidx): un-static-ify.
      (sweep_weak_hash_tables): remove declaration.
      (sweep_weak_table): declare.
      (hashfn_eql, hashfn_equal): declare.
      (number_finalizers_run): new variable.
      (Vdead): externify when ENABLE_CHECKING.
      (gc_root_type): new enumeration.
      (gc_root_visitor): new struct.
      (visit_static_gc_roots): declare.
      (vectorlike_nbytes): declare.
      (vector_nbytes): define as trivial inline function wrapper for
      vectorlike_nbytes.
      (init_obarray_once): change signature.
      (primary_thread): extern-ify.
      (init_buffer): change signature.
      (init_frame_once): declare.
      * src/lread.c (readevalloop): adjust for new dumped predicates.
      (init_obarray_once): new function.
      (ndefsubr): new variable.
      (defsubr): increment it.
      (load_path_check): adjust for pdumper.
      (load_path_default): use pdumper functions; adjust for
      dump search.
      * src/macfont.m (macfont_init_font_change_handler): avoid
      shadowing global.
      (syms_of_macfont_for_pdumper): new function.
      (syms_of_macfont): call it.
      * src/menu.c (syms_of_menu): staticpro more stuff.
      * src/minibuf.c (Ftry_completion): rehash if needed.
      (init_minibuf_once_for_pdumper): new function.
      (init_minibuf_once): call it.
      * src/nsfont.m (syms_of_nsfns): staticpro more.
      * src/nsfont.m (syms_of_nsfont_for_pdumper): new function.
      (syms_of_nsfont): call it.
      * src/nsterm.m (syms_of_nsfont): remember pdumper stuff.
      * src/pdumper.c: new file.
      * src/pdumper.h: new file.
      * src/process.c (init_process_emacs): use new pdumper functions
      instead of CANNOT_DUMP.
      * src/profiler.c (syms_of_profiler_for_pdumper): new function.
      (syms_of_profiler_for_pdumper): call it.
      * src/search.c (syms_of_search_for_pdumper): new function.
      (syms_of_search_for_pdumper): call it.
      * src/sheap.c (bss_sbrk_did_unexec): remove.
      * src/sheap.h (bss_sbrk_did_unexec): remove.
      * src/syntax.c (syms_of_syntax): don't redundantly staticpro
      re_match_object.
      * src/sysdep.c: use will_dump_with_unexec_p() instead of bss
      hack thing.
      * src/syssignals.h (init_sigsegv): declare.
      * src/systime.h (init_timefns): remove bool from signature.
      * src/textprop.c (syms_of_textprop): move staticpro.
      * src/thread.c (main_thread_p): constify.
      * src/thread.h (main_thread_p): constify.
      * src/timefns.c (init_timefns): remove bool from signature.
      (syms_of_timefns_for_pdumper): new function.
      (syms_of_timefns): call it.
      * src/w32.c: rearrange code.
      * src/w32.h (w32_relocate): declare.
      * src/w32fns.c (syms_of_w32fns): add pdumper note.
      * src/w32font.c (syms_of_w32font_for_pdumper): new function.
      (syms_of_w32font): call it.
      * src/w32heap.c (using_dynamic_heap): new variable.
      (init_heap): use it.
      * src/w32menu.c (syms_of_w32menu): add pdumper note.
      * src/w32proc.c
      (ctrl_c_handler, mainCRTStartup, _start, open_input_file)
      (rva_to_section, close_file_data): move here.
      * src/w32uniscribe.c (syms_of_w32uniscribe_for_pdumper):
      new function.
      (syms_of_w32uniscribe): call it.
      * src/window.c (init_window_once_for_pdumper): new function.
      (init_window_once): call it; staticpro more stuff.
      * src/xfont.c (syms_of_xfont_for_pdumper): new function.
      (syms_of_xfont): call it.
      * src/xftfont.c (syms_of_xftfont_for_pdumper): new function.
      (syms_of_xftfont): call it.
      * src/xmenu.c (syms_of_xmenu_for_pdumper): new function.
      (syms_of_xmenu): call it.
      * src/xselect.c (syms_of_xselect_for_pdumper): new function.
      (syms_of_xselect): call it.
      * src/xsettings.c (syms_of_xsettings): add more pdumper notes.
      * src/term.c (syms_of_xterm): add pdumper note.
      
      * src/dispnew.c (init_faces_initial): new function.
      (init_display_interactive): rename from init_display; use
      will_dump_p instead of !initialized.  Initialize faces early for
      pdumper if needed.
      (init_display): new function.
      (syms_of_display_for_pdumper): new function.
      (syms_of_display): call it.
      
      * src/dbusbind.c (syms_of_dbusbind): Add TODO for bus reset
      on pdumper load.
      
      * src/data.c (Fdefalias): Use will_dump_p
      instead of Vpurify_flag.
      (Fmake_variable_buffer_local): silence compiler warning with -Og
      by making valcontents UNINIT.
      (arith_driver): silence compiler warning with UNINIT.
      
      * src/conf_post.h (ATTRIBUTE_SECTION): new macro.
      
      * src/composite.c (composition_gstring_put_cache): rehash hash
      table if needed.
      
      * src/coding.c (init_coding_once, syms_of_coding): remember
      pdumper stuff.
      
      * src/charset.h (charset_table_size, charset_table_user): declare.
      
      * src/charset.c (charset_table_used, charset_table_size): un-static.
      (init_charset_oncem, syms_of_charset): remember pdumper stuff.
      
      * src/category.c (category_table_version): remove obsolete
      variable.
      
      * src/callint.c (syms_of_callint): staticpro 'preserved_fns'
      (init_callproc): use will_dump_p instead of !CANNOT_DUMP.
      
      * src/bytecode.c (exec_byte_code): rehash table tables if needed
      
      * src/buffer.c (alloc_buffer_text, free_buffer_text): account for
      pdumper
      (init_buffer_once): add TODO; remember stuff for pdumper.
      (init_buffer): don't take initialized argument; adjust
      for pdumper.
      
      * src/atimer.c (init_atimer): initialize subr only if
      !initialized.
      
      * src/alloc.c: (vector_marked_p, set_vector_marked)
      (vectorlike_marked_p, set_vectorlike_marked, cons_marked_p)
      (set_cons_marked, string_marked_p, set_string_marked)
      (symbol_marked_p, set_symbol_marked, interval_marked_p)
      (set_interval_marked): new accessor routines.  Use them
      instead of raw GC access throughout.
      (Vdead): make non-static when ENABLE_CHECKING.
      (vectorlike_nbytes): rename of 'vector_nbytes'; take a vectorlike
      header as input instead of a vector.
      (number_finalizers_run): new internal C variable.
      (mark_maybe_object): check for pdumper objects.
      (valid_pointer_p): don't be gratuitously inefficient under rr(1).
      (make_pure_c_string): add support for size_byte = -2 mode
      indicating that string data points into Emacs image rodata.
      (visit_vectorlike_root): visits GC roots embedded in
      vectorlike objects.
      (visit_buffer_root): visits GC roots embedded in
      our totally-not-a-buffer buffer global objects.
      (visit_static_gc_roots): visit GC roots in the Emacs data section.
      (mark_object_root_visitor): root callback used for conventional GC
      marking
      (weak_hash_tables): new internal variable for tracking found weak
      hash tables during GC.
      (mark_and_sweep_weak_table_contents): new weak hash table marking.
      (garbage_collect_1): use new GC root visitor machinery.
      (mark_vectorlike): accept a vectorlike_header instead of a
      Lisp_Vector.
      (mark_frame, mark_window, mark_hash_table): new functions.
      (mark_object): initialize 'm'; check for pdumper objects and use
      new mark-bit accessors throughout.  Remove some object-specific
      marking code and move to helper functions above.
      (survives_gc_p): check for pdumper objects.
      (gc-sweep): clear pdumper mark bits.
      (init_alloc_once_for_pdumper): new helper function for early init
      called both during normal init and pdumper load.
      (init_alloc_once): pdumper integration.
      
      * src/Makefile.in: Rewrite dumping for pdumper; add pdumper.o;
      invoke temacs with --temacs command line option; build dmpstruct.h
      from dmpstruct.awk; stop relying on CANNOT_DUMP; clean up pdumper
      intermediate files during build.
      
      * nextstep/Makefile.in: build emacs.pdmp into NS packages
      
      * lisp/startup.el: account for new '--temacs' and '--dump-file'
      command line option.
      
      * lisp/loadup.el: rewrite early init to account for pdumper; use
      injected 'dump-mode' variable (set via the new '--temacs' option)
      instead of parsing command line.
      
      * lisp/cus-start.el: Check 'dump-mode' instead of 'purify-flag',
      since the new 'dump-mode'
      
      * lib-src/make-fingerprint.c: new program
      
      * lib-src/Makefile.in: built make-fingerprint utility program
      
      * configure.ac: Add --with-pdumper toggle to control pdumper
      support; add --with-unexec toggle to control unexec support.
      Add --with-dumping option to control which dumping strategy we use
      by default.  Adjust for pdumper throughout.  Check for
      posix_madvise.
      
      * Makefile.in: Add @DUMPING@ substitution; add pdumper mode.
      
      * .gitignore: Add make-fingerprint, temacs.in, fingerprint.c,
      dmpstruct.h, and pdumper dump files.
      d12e5d00
  28. 09 Jan, 2019 1 commit
    • Paul Eggert's avatar
      Use shortcuts for Flength · a8465033
      Paul Eggert authored
      When calculating the length of a Lisp object whose type is
      known, use a specialized length operation on it to save a bit
      of runtime overhead.
      * src/callint.c (Fcall_interactively):
      * src/minibuf.c (read_minibuf_unwind):
      Use ASIZE rather than Flength on values that must be vectors.
      * src/charset.c (Fsort_charsets):
      * src/coding.c (detect_coding_sjis):
      (Fdefine_coding_system_internal):
      * src/data.c (wrong_choice):
      * src/eval.c (Flet, eval_sub, Fapply, apply_lambda):
      * src/fns.c (sort_list):
      * src/font.c (font_vconcat_entity_vectors)
      (font_find_for_lface):
      * src/frame.c (Fmodify_frame_parameters):
      * src/fringe.c (get_logical_fringe_bitmap):
      * src/ftfont.c (ftfont_get_open_type_spec):
      * src/gtkutil.c (xg_print_frames_dialog):
      * src/lread.c (read1, read_vector):
      * src/keymap.c (Fkey_description):
      * src/kqueue.c (Fkqueue_add_watch):
      * src/macfont.m (macfont_get_open_type_spec):
      * src/menu.c (parse_single_submenu, x_popup_menu_1):
      * src/minibuf.c (Finternal_complete_buffer):
      * src/nsfont.m (ns_findfonts, nsfont_list_family):
      * src/process.c (Fmake_process):
      * src/search.c (Fset_match_data):
      * src/xfaces.c (Fx_family_fonts):
      Use list_length rather than Flength on values that must be lists.
      * src/fns.c (list_length): New function.
      (Flength): Use it.
      * src/nsfont.m (ns_findfonts):
      Use !NILP (x) rather than XFIXNUM (Flength (x)) != 0.
      * src/xdisp.c (store_mode_line_string):
      Use SCHARS rather than Flength on values that must be strings.
      a8465033
  29. 01 Jan, 2019 1 commit