Skip to content

Commit

Permalink
Add smileys to make sure that rational calculation only uses instance…
Browse files Browse the repository at this point in the history
…s not type objects

Fixes RT#127051: https://rt.perl.org/Public/Bug/Display.html?id=127051

This fix keeps both DIVIDE_NUMBERS and DON'T_DIVIDE_NUMBERS from accepting type object and makes the exception handling more proper.
For example, multi sub infix:</>(Int:D \a, Int:D \b) can detect the denominator of 1/1.WHAT is a type object and cause an exception before calling DIVIDE_NUMBERS.
  • Loading branch information
titsuki committed Jan 3, 2018
1 parent 333efa0 commit 9910b39
Showing 1 changed file with 17 additions and 17 deletions.
34 changes: 17 additions & 17 deletions src/core/Rat.pm
Expand Up @@ -79,7 +79,7 @@ multi sub prefix:<->(FatRat:D \a) {
FatRat.new(-a.numerator, a.denominator);
}

multi sub infix:<+>(Rational \a, Rational \b) {
multi sub infix:<+>(Rational:D \a, Rational:D \b) {
a.denominator == b.denominator
?? DON'T_DIVIDE_NUMBERS(a.numerator + b.numerator, a.denominator, a, b)
!! DIVIDE_NUMBERS
Expand All @@ -88,15 +88,15 @@ multi sub infix:<+>(Rational \a, Rational \b) {
a,
b
}
multi sub infix:<+>(Rational \a, Int \b) {
multi sub infix:<+>(Rational:D \a, Int:D \b) {
DON'T_DIVIDE_NUMBERS(
(a.numerator + b * a.denominator),
a.denominator,
a,
b,
);
}
multi sub infix:<+>(Int \a, Rational \b) {
multi sub infix:<+>(Int:D \a, Rational:D \b) {
DON'T_DIVIDE_NUMBERS(
(a * b.denominator + b.numerator),
b.denominator,
Expand All @@ -105,7 +105,7 @@ multi sub infix:<+>(Int \a, Rational \b) {
);
}

multi sub infix:<->(Rational \a, Rational \b) {
multi sub infix:<->(Rational:D \a, Rational:D \b) {
a.denominator == b.denominator
?? DON'T_DIVIDE_NUMBERS(a.numerator - b.numerator, a.denominator, a, b)
!! DIVIDE_NUMBERS
Expand All @@ -115,63 +115,63 @@ multi sub infix:<->(Rational \a, Rational \b) {
b
}

multi sub infix:<->(Rational \a, Int \b) {
multi sub infix:<->(Rational:D \a, Int:D \b) {
DON'T_DIVIDE_NUMBERS
a.numerator - b * a.denominator,
a.denominator,
a,
b;
}

multi sub infix:<->(Int \a, Rational \b) {
multi sub infix:<->(Int:D \a, Rational:D \b) {
DON'T_DIVIDE_NUMBERS
a * b.denominator - b.numerator,
b.denominator,
a,
b;
}

multi sub infix:<*>(Rational \a, Rational \b) {
multi sub infix:<*>(Rational:D \a, Rational:D \b) {
DIVIDE_NUMBERS
a.numerator * b.numerator,
a.denominator * b.denominator,
a,
b;
}

multi sub infix:<*>(Rational \a, Int \b) {
multi sub infix:<*>(Rational:D \a, Int:D \b) {
DIVIDE_NUMBERS
a.numerator * b,
a.denominator,
a,
b;
}

multi sub infix:<*>(Int \a, Rational \b) {
multi sub infix:<*>(Int:D \a, Rational:D \b) {
DIVIDE_NUMBERS
a * b.numerator,
b.denominator,
a,
b;
}

multi sub infix:</>(Rational \a, Rational \b) {
multi sub infix:</>(Rational:D \a, Rational:D \b) {
DIVIDE_NUMBERS
a.numerator * b.denominator,
a.denominator * b.numerator,
a,
b;
}

multi sub infix:</>(Rational \a, Int \b) {
multi sub infix:</>(Rational:D \a, Int:D \b) {
DIVIDE_NUMBERS
a.numerator,
a.denominator * b,
a,
b;
}

multi sub infix:</>(Int \a, Rational \b) {
multi sub infix:</>(Int:D \a, Rational:D \b) {
b.REDUCE-ME; # RT #126391: [BUG] Bad "divide by 0" error message
DIVIDE_NUMBERS
b.denominator * a,
Expand All @@ -180,23 +180,23 @@ multi sub infix:</>(Int \a, Rational \b) {
b;
}

multi sub infix:</>(Int \a, Int \b) {
multi sub infix:</>(Int:D \a, Int:D \b) {
DIVIDE_NUMBERS a, b, a, b
}

multi sub infix:<%>(Rational \a, Int \b) {
multi sub infix:<%>(Rational:D \a, Int:D \b) {
a - floor(a / b) * b
}

multi sub infix:<%>(Int \a, Rational \b) {
multi sub infix:<%>(Int:D \a, Rational:D \b) {
a - floor(a / b) * b
}

multi sub infix:<%>(Rational \a, Rational \b) {
multi sub infix:<%>(Rational:D \a, Rational:D \b) {
a - floor(a / b) * b
}

multi sub infix:<**>(Rational \a, Int \b) {
multi sub infix:<**>(Rational:D \a, Int:D \b) {
b >= 0
?? DIVIDE_NUMBERS
(a.numerator ** b // fail (a.numerator.abs > a.denominator ?? X::Numeric::Overflow !! X::Numeric::Underflow).new),
Expand Down

0 comments on commit 9910b39

Please sign in to comment.