Mercurial > hg > xemacs-beta
comparison src/data.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 | 873d7425c1ad |
children | 70a3f4ff8da8 |
comparison
equal
deleted
inserted
replaced
5735:ff13c44ce0d9 | 5736:3192994c49ca |
---|---|
1445 case FIXNUM_T: | 1445 case FIXNUM_T: |
1446 accum = make_integer (XREALFIXNUM (accum) + XREALFIXNUM (addend)); | 1446 accum = make_integer (XREALFIXNUM (accum) + XREALFIXNUM (addend)); |
1447 break; | 1447 break; |
1448 #ifdef HAVE_BIGNUM | 1448 #ifdef HAVE_BIGNUM |
1449 case BIGNUM_T: | 1449 case BIGNUM_T: |
1450 bignum_add (scratch_bignum, XBIGNUM_DATA (accum), | 1450 bignum_add (XBIGNUM_DATA (accum), XBIGNUM_DATA (accum), |
1451 XBIGNUM_DATA (addend)); | 1451 XBIGNUM_DATA (addend)); |
1452 accum = make_bignum_bg (scratch_bignum); | |
1453 break; | 1452 break; |
1454 #endif | 1453 #endif |
1455 #ifdef HAVE_RATIO | 1454 #ifdef HAVE_RATIO |
1456 case RATIO_T: | 1455 case RATIO_T: |
1457 ratio_add (scratch_ratio, XRATIO_DATA (accum), | 1456 ratio_add (XRATIO_DATA (accum), XRATIO_DATA (accum), |
1458 XRATIO_DATA (addend)); | 1457 XRATIO_DATA (addend)); |
1459 accum = make_ratio_rt (scratch_ratio); | |
1460 break; | 1458 break; |
1461 #endif | 1459 #endif |
1462 case FLOAT_T: | 1460 case FLOAT_T: |
1463 accum = make_float (XFLOAT_DATA (accum) + XFLOAT_DATA (addend)); | 1461 accum = make_float (XFLOAT_DATA (accum) + XFLOAT_DATA (addend)); |
1464 break; | 1462 break; |
1465 #ifdef HAVE_BIGFLOAT | 1463 #ifdef HAVE_BIGFLOAT |
1466 case BIGFLOAT_T: | 1464 case BIGFLOAT_T: |
1467 bigfloat_set_prec (scratch_bigfloat, | 1465 bigfloat_set_prec (XBIGFLOAT_DATA (accum), |
1468 max (XBIGFLOAT_GET_PREC (addend), | 1466 max (XBIGFLOAT_GET_PREC (addend), |
1469 XBIGFLOAT_GET_PREC (accum))); | 1467 XBIGFLOAT_GET_PREC (accum))); |
1470 bigfloat_add (scratch_bigfloat, XBIGFLOAT_DATA (accum), | 1468 bigfloat_add (XBIGFLOAT_DATA (accum), XBIGFLOAT_DATA (accum), |
1471 XBIGFLOAT_DATA (addend)); | 1469 XBIGFLOAT_DATA (addend)); |
1472 accum = make_bigfloat_bf (scratch_bigfloat); | |
1473 break; | 1470 break; |
1474 #endif | 1471 #endif |
1475 } | 1472 } |
1476 } | 1473 } |
1477 return Fcanonicalize_number (accum); | 1474 return Fcanonicalize_number (accum); |
1641 multiplier = args[i]; | 1638 multiplier = args[i]; |
1642 switch (promote_args (&accum, &multiplier)) | 1639 switch (promote_args (&accum, &multiplier)) |
1643 { | 1640 { |
1644 #ifdef HAVE_BIGNUM | 1641 #ifdef HAVE_BIGNUM |
1645 case BIGNUM_T: | 1642 case BIGNUM_T: |
1646 bignum_mul (scratch_bignum, XBIGNUM_DATA (accum), | 1643 bignum_mul (XBIGNUM_DATA (accum), XBIGNUM_DATA (accum), |
1647 XBIGNUM_DATA (multiplier)); | 1644 XBIGNUM_DATA (multiplier)); |
1648 accum = make_bignum_bg (scratch_bignum); | |
1649 break; | 1645 break; |
1650 #endif | 1646 #endif |
1651 #ifdef HAVE_RATIO | 1647 #ifdef HAVE_RATIO |
1652 case RATIO_T: | 1648 case RATIO_T: |
1653 ratio_mul (scratch_ratio, XRATIO_DATA (accum), | 1649 ratio_mul (XRATIO_DATA (accum), XRATIO_DATA (accum), |
1654 XRATIO_DATA (multiplier)); | 1650 XRATIO_DATA (multiplier)); |
1655 accum = make_ratio_rt (scratch_ratio); | |
1656 break; | 1651 break; |
1657 #endif | 1652 #endif |
1658 case FLOAT_T: | 1653 case FLOAT_T: |
1659 accum = make_float (XFLOAT_DATA (accum) * XFLOAT_DATA (multiplier)); | 1654 accum = make_float (XFLOAT_DATA (accum) * XFLOAT_DATA (multiplier)); |
1660 break; | 1655 break; |
1661 #ifdef HAVE_BIGFLOAT | 1656 #ifdef HAVE_BIGFLOAT |
1662 case BIGFLOAT_T: | 1657 case BIGFLOAT_T: |
1663 bigfloat_set_prec (scratch_bigfloat, | 1658 bigfloat_set_prec (XBIGFLOAT_DATA (accum), |
1664 max (XBIGFLOAT_GET_PREC (multiplier), | 1659 max (XBIGFLOAT_GET_PREC (multiplier), |
1665 XBIGFLOAT_GET_PREC (accum))); | 1660 XBIGFLOAT_GET_PREC (accum))); |
1666 bigfloat_mul (scratch_bigfloat, XBIGFLOAT_DATA (accum), | 1661 bigfloat_mul (XBIGFLOAT_DATA (accum), XBIGFLOAT_DATA (accum), |
1667 XBIGFLOAT_DATA (multiplier)); | 1662 XBIGFLOAT_DATA (multiplier)); |
1668 accum = make_bigfloat_bf (scratch_bigfloat); | |
1669 break; | 1663 break; |
1670 #endif | 1664 #endif |
1671 } | 1665 } |
1672 } | 1666 } |
1673 return Fcanonicalize_number (accum); | 1667 return Fcanonicalize_number (accum); |