Mercurial > hg > xemacs-beta
comparison src/bytecode.c @ 4717:fcc7e89d5e68
Properly handle continuable divide-by-zero errors. Fix truncation of a
zero-valued ratio. See xemacs-patches message
<870180fe0910080956h5d674f03q185d11aa6fc57bd2@mail.gmail.com>.
| author | Jerry James <james@xemacs.org> |
|---|---|
| date | Mon, 12 Oct 2009 12:10:04 -0600 |
| parents | b5e1d4f6b66f |
| children | 1d61580e0cf7 |
comparison
equal
deleted
inserted
replaced
| 4716:dca5bb2adff1 | 4717:fcc7e89d5e68 |
|---|---|
| 430 return Fcanonicalize_number (make_bignum_bg (scratch_bignum)); | 430 return Fcanonicalize_number (make_bignum_bg (scratch_bignum)); |
| 431 #else | 431 #else |
| 432 ival1 *= ival2; break; | 432 ival1 *= ival2; break; |
| 433 #endif | 433 #endif |
| 434 case Bquo: | 434 case Bquo: |
| 435 if (ival2 == 0) Fsignal (Qarith_error, Qnil); | 435 if (ival2 == 0) |
| 436 signal_error_2 (Qarith_error, "division by zero", obj1, obj2); | |
| 436 ival1 /= ival2; | 437 ival1 /= ival2; |
| 437 break; | 438 break; |
| 438 case Bmax: if (ival1 < ival2) ival1 = ival2; break; | 439 case Bmax: if (ival1 < ival2) ival1 = ival2; break; |
| 439 case Bmin: if (ival1 > ival2) ival1 = ival2; break; | 440 case Bmin: if (ival1 > ival2) ival1 = ival2; break; |
| 440 } | 441 } |
| 456 bignum_mul (scratch_bignum, XBIGNUM_DATA (obj1), | 457 bignum_mul (scratch_bignum, XBIGNUM_DATA (obj1), |
| 457 XBIGNUM_DATA (obj2)); | 458 XBIGNUM_DATA (obj2)); |
| 458 break; | 459 break; |
| 459 case Bquo: | 460 case Bquo: |
| 460 if (bignum_sign (XBIGNUM_DATA (obj2)) == 0) | 461 if (bignum_sign (XBIGNUM_DATA (obj2)) == 0) |
| 461 Fsignal (Qarith_error, Qnil); | 462 signal_error_2 (Qarith_error, "division by zero", obj1, obj2); |
| 462 bignum_div (scratch_bignum, XBIGNUM_DATA (obj1), | 463 bignum_div (scratch_bignum, XBIGNUM_DATA (obj1), |
| 463 XBIGNUM_DATA (obj2)); | 464 XBIGNUM_DATA (obj2)); |
| 464 break; | 465 break; |
| 465 case Bmax: | 466 case Bmax: |
| 466 return bignum_gt (XBIGNUM_DATA (obj1), XBIGNUM_DATA (obj2)) | 467 return bignum_gt (XBIGNUM_DATA (obj1), XBIGNUM_DATA (obj2)) |
| 484 case Bmult: | 485 case Bmult: |
| 485 ratio_mul (scratch_ratio, XRATIO_DATA (obj1), XRATIO_DATA (obj2)); | 486 ratio_mul (scratch_ratio, XRATIO_DATA (obj1), XRATIO_DATA (obj2)); |
| 486 break; | 487 break; |
| 487 case Bquo: | 488 case Bquo: |
| 488 if (ratio_sign (XRATIO_DATA (obj2)) == 0) | 489 if (ratio_sign (XRATIO_DATA (obj2)) == 0) |
| 489 Fsignal (Qarith_error, Qnil); | 490 signal_error_2 (Qarith_error, "division by zero", obj1, obj2); |
| 490 ratio_div (scratch_ratio, XRATIO_DATA (obj1), XRATIO_DATA (obj2)); | 491 ratio_div (scratch_ratio, XRATIO_DATA (obj1), XRATIO_DATA (obj2)); |
| 491 break; | 492 break; |
| 492 case Bmax: | 493 case Bmax: |
| 493 return ratio_gt (XRATIO_DATA (obj1), XRATIO_DATA (obj2)) | 494 return ratio_gt (XRATIO_DATA (obj1), XRATIO_DATA (obj2)) |
| 494 ? obj1 : obj2; | 495 ? obj1 : obj2; |
| 516 bigfloat_mul (scratch_bigfloat, XBIGFLOAT_DATA (obj1), | 517 bigfloat_mul (scratch_bigfloat, XBIGFLOAT_DATA (obj1), |
| 517 XBIGFLOAT_DATA (obj2)); | 518 XBIGFLOAT_DATA (obj2)); |
| 518 break; | 519 break; |
| 519 case Bquo: | 520 case Bquo: |
| 520 if (bigfloat_sign (XBIGFLOAT_DATA (obj2)) == 0) | 521 if (bigfloat_sign (XBIGFLOAT_DATA (obj2)) == 0) |
| 521 Fsignal (Qarith_error, Qnil); | 522 signal_error_2 (Qarith_error, "division by zero", obj1, obj2); |
| 522 bigfloat_div (scratch_bigfloat, XBIGFLOAT_DATA (obj1), | 523 bigfloat_div (scratch_bigfloat, XBIGFLOAT_DATA (obj1), |
| 523 XBIGFLOAT_DATA (obj2)); | 524 XBIGFLOAT_DATA (obj2)); |
| 524 break; | 525 break; |
| 525 case Bmax: | 526 case Bmax: |
| 526 return bigfloat_gt (XBIGFLOAT_DATA (obj1), XBIGFLOAT_DATA (obj2)) | 527 return bigfloat_gt (XBIGFLOAT_DATA (obj1), XBIGFLOAT_DATA (obj2)) |
| 538 { | 539 { |
| 539 case Bplus: dval1 += dval2; break; | 540 case Bplus: dval1 += dval2; break; |
| 540 case Bdiff: dval1 -= dval2; break; | 541 case Bdiff: dval1 -= dval2; break; |
| 541 case Bmult: dval1 *= dval2; break; | 542 case Bmult: dval1 *= dval2; break; |
| 542 case Bquo: | 543 case Bquo: |
| 543 if (dval2 == 0.0) Fsignal (Qarith_error, Qnil); | 544 if (dval2 == 0.0) |
| 545 signal_error_2 (Qarith_error, "division by zero", obj1, obj2); | |
| 544 dval1 /= dval2; | 546 dval1 /= dval2; |
| 545 break; | 547 break; |
| 546 case Bmax: if (dval1 < dval2) dval1 = dval2; break; | 548 case Bmax: if (dval1 < dval2) dval1 = dval2; break; |
| 547 case Bmin: if (dval1 > dval2) dval1 = dval2; break; | 549 case Bmin: if (dval1 > dval2) dval1 = dval2; break; |
| 548 } | 550 } |
| 583 { | 585 { |
| 584 case Bplus: ival1 += ival2; break; | 586 case Bplus: ival1 += ival2; break; |
| 585 case Bdiff: ival1 -= ival2; break; | 587 case Bdiff: ival1 -= ival2; break; |
| 586 case Bmult: ival1 *= ival2; break; | 588 case Bmult: ival1 *= ival2; break; |
| 587 case Bquo: | 589 case Bquo: |
| 588 if (ival2 == 0) Fsignal (Qarith_error, Qnil); | 590 if (ival2 == 0) |
| 591 signal_error_2 (Qarith_error, "division by zero", obj1, obj2); | |
| 589 ival1 /= ival2; | 592 ival1 /= ival2; |
| 590 break; | 593 break; |
| 591 case Bmax: if (ival1 < ival2) ival1 = ival2; break; | 594 case Bmax: if (ival1 < ival2) ival1 = ival2; break; |
| 592 case Bmin: if (ival1 > ival2) ival1 = ival2; break; | 595 case Bmin: if (ival1 > ival2) ival1 = ival2; break; |
| 593 } | 596 } |
| 601 { | 604 { |
| 602 case Bplus: dval1 += dval2; break; | 605 case Bplus: dval1 += dval2; break; |
| 603 case Bdiff: dval1 -= dval2; break; | 606 case Bdiff: dval1 -= dval2; break; |
| 604 case Bmult: dval1 *= dval2; break; | 607 case Bmult: dval1 *= dval2; break; |
| 605 case Bquo: | 608 case Bquo: |
| 606 if (dval2 == 0) Fsignal (Qarith_error, Qnil); | 609 if (dval2 == 0) |
| 610 signal_error_2 (Qarith_error, "division by zero", obj1, obj2); | |
| 607 dval1 /= dval2; | 611 dval1 /= dval2; |
| 608 break; | 612 break; |
| 609 case Bmax: if (dval1 < dval2) dval1 = dval2; break; | 613 case Bmax: if (dval1 < dval2) dval1 = dval2; break; |
| 610 case Bmin: if (dval1 > dval2) dval1 = dval2; break; | 614 case Bmin: if (dval1 > dval2) dval1 = dval2; break; |
| 611 } | 615 } |
