Skip to content

Commit f3a92c6

Browse files
committed
Fix min/2 and max/2 returning the cast version of its arguments
It now behaves the same way as SWI-Prolog.
1 parent e2d1a2b commit f3a92c6

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

src/machine/arithmetic_ops.rs

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -455,13 +455,8 @@ pub(crate) fn max(n1: Number, n2: Number) -> Result<Number, MachineStubGen> {
455455
Ok(Number::Fixnum(n2))
456456
}
457457
}
458-
(Number::Integer(n1), Number::Integer(n2)) => {
459-
if n1 > n2 {
460-
Ok(Number::Integer(n1))
461-
} else {
462-
Ok(Number::Integer(n2))
463-
}
464-
}
458+
(Number::Integer(n1), Number::Integer(n2)) => Ok(Number::Integer(cmp::max(n1, n2))),
459+
(Number::Rational(r1), Number::Rational(r2)) => Ok(Number::Rational(cmp::max(r1, r2))),
465460
(n1, n2) => {
466461
let stub_gen = || {
467462
let max_atom = atom!("max");
@@ -471,7 +466,15 @@ pub(crate) fn max(n1: Number, n2: Number) -> Result<Number, MachineStubGen> {
471466
let f1 = try_numeric_result!(result_f(&n1), stub_gen)?;
472467
let f2 = try_numeric_result!(result_f(&n2), stub_gen)?;
473468

474-
Ok(Number::Float(cmp::max(OrderedFloat(f1), OrderedFloat(f2))))
469+
match OrderedFloat(f1).cmp(&OrderedFloat(f2)) {
470+
cmp::Ordering::Less => Ok(n2),
471+
cmp::Ordering::Equal => {
472+
// Note: n1 and n2 were compared as floats,
473+
// so we return the second argument as a floating point value.
474+
Ok(Number::Float(OrderedFloat(f2)))
475+
}
476+
cmp::Ordering::Greater => Ok(n1),
477+
}
475478
}
476479
}
477480
}
@@ -499,13 +502,8 @@ pub(crate) fn min(n1: Number, n2: Number) -> Result<Number, MachineStubGen> {
499502
Ok(Number::Fixnum(n2))
500503
}
501504
}
502-
(Number::Integer(n1), Number::Integer(n2)) => {
503-
if n1 < n2 {
504-
Ok(Number::Integer(n1))
505-
} else {
506-
Ok(Number::Integer(n2))
507-
}
508-
}
505+
(Number::Integer(n1), Number::Integer(n2)) => Ok(Number::Integer(cmp::min(n1, n2))),
506+
(Number::Rational(r1), Number::Rational(r2)) => Ok(Number::Rational(cmp::min(r1, r2))),
509507
(n1, n2) => {
510508
let stub_gen = || {
511509
let min_atom = atom!("min");
@@ -515,7 +513,15 @@ pub(crate) fn min(n1: Number, n2: Number) -> Result<Number, MachineStubGen> {
515513
let f1 = try_numeric_result!(result_f(&n1), stub_gen)?;
516514
let f2 = try_numeric_result!(result_f(&n2), stub_gen)?;
517515

518-
Ok(Number::Float(cmp::min(OrderedFloat(f1), OrderedFloat(f2))))
516+
match OrderedFloat(f1).cmp(&OrderedFloat(f2)) {
517+
cmp::Ordering::Less => Ok(n1),
518+
cmp::Ordering::Equal => {
519+
// Note: n1 and n2 were compared as floats,
520+
// so we return the first argument as a floating point value.
521+
Ok(Number::Float(OrderedFloat(f1)))
522+
}
523+
cmp::Ordering::Greater => Ok(n2),
524+
}
519525
}
520526
}
521527
}

0 commit comments

Comments
 (0)