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 } |