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 }