comparison src/alloc.c @ 5736:3192994c49ca

Convert C (un)signed long long values to bignums properly. This patch also does the following: - Uses make_fixnum instead of make_integer when the argument is guaranteed to be in the fixnum range. - Introduces make_unsigned_integer so that we handle unsigned values with the high bit set correctly. - Introduces conversions between bignums and (un)signed long long values. - Uses mp_set_memory_functions with the BSD MP code, if it exists. - Eliminates some unnecessary consing in the Lisp + and * implementations. - Fixes a problem with check_valid_xbm_inline(). This function is called during intialization. It calls Ftimes. When using pdump, this is a problem, because (a) the bignum code is not initialized until *after* dumping, so we don't try to dump any bignums, and (b) multiplication of integers is done inside bignums so we handle fixnum overflow correctly. I decided that an XBM file with dimensions that don't fit into fixnums is probably not something we want to try to handle anyway, and did the arithmetic with C values instead of Lisp values. Doing that broke one test, which started getting a different error message from the one it expected, so I adjusted the test to match the new reality. - Fixes a few miscellaneous bugs in the BSD MP code. See <CAHCOHQk0u0=eD1fUMHTNWi2Yh=1WgiYyCXdMbsGzHBNhdqYz4w@mail.gmail.com> in xemacs-patches, as well as followup messages.
author Jerry James <james@xemacs.org>
date Mon, 17 Jun 2013 10:23:00 -0600
parents 1a507c4c6c42
children 427a72c6ee17
comparison
equal deleted inserted replaced
5735:ff13c44ce0d9 5736:3192994c49ca
1581 (length, object)) 1581 (length, object))
1582 { 1582 {
1583 Lisp_Object val = Qnil; 1583 Lisp_Object val = Qnil;
1584 Elemcount size; 1584 Elemcount size;
1585 1585
1586 check_integer_range (length, Qzero, make_integer (MOST_POSITIVE_FIXNUM)); 1586 check_integer_range (length, Qzero, make_fixnum (MOST_POSITIVE_FIXNUM));
1587 1587
1588 size = XFIXNUM (length); 1588 size = XFIXNUM (length);
1589 1589
1590 while (size--) 1590 while (size--)
1591 val = Fcons (object, val); 1591 val = Fcons (object, val);
1636 Lisp_Bignum *b; 1636 Lisp_Bignum *b;
1637 1637
1638 ALLOC_FROB_BLOCK_LISP_OBJECT (bignum, Lisp_Bignum, b, &lrecord_bignum); 1638 ALLOC_FROB_BLOCK_LISP_OBJECT (bignum, Lisp_Bignum, b, &lrecord_bignum);
1639 bignum_init (bignum_data (b)); 1639 bignum_init (bignum_data (b));
1640 bignum_set_long (bignum_data (b), bignum_value); 1640 bignum_set_long (bignum_data (b), bignum_value);
1641 return wrap_bignum (b);
1642 }
1643
1644 /* WARNING: This function returns a bignum even if its argument fits into a
1645 fixnum. See Fcanonicalize_number(). */
1646 Lisp_Object
1647 make_bignum_un (unsigned long bignum_value)
1648 {
1649 Lisp_Bignum *b;
1650
1651 ALLOC_FROB_BLOCK_LISP_OBJECT (bignum, Lisp_Bignum, b, &lrecord_bignum);
1652 bignum_init (bignum_data (b));
1653 bignum_set_ulong (bignum_data (b), bignum_value);
1654 return wrap_bignum (b);
1655 }
1656
1657 /* WARNING: This function returns a bignum even if its argument fits into a
1658 fixnum. See Fcanonicalize_number(). */
1659 Lisp_Object
1660 make_bignum_ll (long long bignum_value)
1661 {
1662 Lisp_Bignum *b;
1663
1664 ALLOC_FROB_BLOCK_LISP_OBJECT (bignum, Lisp_Bignum, b, &lrecord_bignum);
1665 bignum_init (bignum_data (b));
1666 bignum_set_llong (bignum_data (b), bignum_value);
1667 return wrap_bignum (b);
1668 }
1669
1670 /* WARNING: This function returns a bignum even if its argument fits into a
1671 fixnum. See Fcanonicalize_number(). */
1672 Lisp_Object
1673 make_bignum_ull (unsigned long long bignum_value)
1674 {
1675 Lisp_Bignum *b;
1676
1677 ALLOC_FROB_BLOCK_LISP_OBJECT (bignum, Lisp_Bignum, b, &lrecord_bignum);
1678 bignum_init (bignum_data (b));
1679 bignum_set_ullong (bignum_data (b), bignum_value);
1641 return wrap_bignum (b); 1680 return wrap_bignum (b);
1642 } 1681 }
1643 1682
1644 /* WARNING: This function returns a bignum even if its argument fits into a 1683 /* WARNING: This function returns a bignum even if its argument fits into a
1645 fixnum. See Fcanonicalize_number(). */ 1684 fixnum. See Fcanonicalize_number(). */