• Paul Eggert's avatar
    Avoid libgmp aborts by imposing limits · d6a497dd
    Paul Eggert authored
    libgmp calls ‘abort’ when given numbers too big for its
    internal data structures.  The numeric limit is large and
    platform-dependent; with 64-bit GMP 6.1.2 it is around
    2**2**37.  Work around the problem by refusing to call libgmp
    functions with arguments that would cause an abort.  With luck
    libgmp will have a better way to do this in the future.
    Also, introduce a variable integer-width that lets the user
    control how large bignums can be.  This currently defaults
    to 2**16, i.e., it allows bignums up to 2**2**16.  This
    should be enough for ordinary computation, and should
    help Emacs to avoid thrashing or hanging.
    Problem noted by Pip Cet (Bug#32463#71).
    * doc/lispref/numbers.texi, etc/NEWS:
    Document recent bignum changes, including this one.
    Improve documentation for bitwise operations, in the light
    of bignums.
    * src/alloc.c (make_number): Enforce integer-width.
    (integer_overflow): New function.
    (xrealloc_for_gmp, xfree_for_gmp):
    Move here from emacs.c, as it's memory allocation.
    (init_alloc): Initialize GMP here, rather than in emacs.c.
    (integer_width): New var.
    * src/data.c (GMP_NLIMBS_MAX, NLIMBS_LIMIT): New constants.
    (emacs_mpz_size, emacs_mpz_mul)
    (emacs_mpz_mul_2exp, emacs_mpz_pow_ui): New functions.
    (arith_driver, Fash, expt_integer): Use them.
    (expt_integer): New function, containing integer code
    that was out of place in floatfns.c.
    (check_bignum_size, xmalloc_for_gmp): Remove.
    * src/emacs.c (main): Do not initialize GMP here.
    * src/floatfns.c (Fexpt): Use expt_integer, which
    now contains integer code moved from here.
    * src/lisp.h (GMP_NUMB_BITS): Define if gmp.h doesn’t.
    d6a497dd
alloc.c 201 KB