Mercurial > hg > xemacs-beta
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(). */ |