Skip to content

Commit aaf9f65

Browse files
committed
Clear BigDecimal comparison specs
1 parent 81c9fab commit aaf9f65

File tree

6 files changed

+42
-8
lines changed

6 files changed

+42
-8
lines changed

spec/tags/library/bigdecimal/gt_tags.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

spec/tags/library/bigdecimal/gte_tags.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

spec/tags/library/bigdecimal/lt_tags.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

spec/tags/library/bigdecimal/lte_tags.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/main/java/org/truffleruby/language/RubyGuards.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ public static boolean isPrimitiveClass(Class<?> clazz) {
7474
return clazz == Boolean.class || clazz == Byte.class || clazz == Short.class || clazz == Integer.class
7575
|| clazz == Long.class || clazz == Float.class || clazz == Double.class;
7676
}
77+
7778
// Ruby types
7879

7980
public static boolean isRubyBasicObject(Object object) {
@@ -313,6 +314,10 @@ public static boolean isInfinity(double value) {
313314
return Double.isInfinite(value);
314315
}
315316

317+
public static boolean isFinite(double value) {
318+
return Double.isFinite(value);
319+
}
320+
316321
public static boolean isPositive(double value) {
317322
return value >= 0;
318323
}

src/main/java/org/truffleruby/stdlib/bigdecimal/BigDecimalNodes.java

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -971,11 +971,27 @@ public int compare(DynamicObject a, long b) {
971971
return compareBigDecimal(a, BigDecimal.valueOf(b));
972972
}
973973

974-
@Specialization(guards = "isNormal(a)")
975-
public int compare(DynamicObject a, double b) {
974+
@Specialization(guards = {
975+
"isNormal(a)",
976+
"isFinite(b)"
977+
})
978+
public int compareFinite(DynamicObject a, double b) {
976979
return compareBigDecimal(a, valueOf(b));
977980
}
978981

982+
@Specialization(guards = {
983+
"isNormal(a)",
984+
"!isFinite(b)"
985+
})
986+
public Object compareNotFinite(DynamicObject a, double b) {
987+
if (Double.isNaN(b)) {
988+
return nil();
989+
} else {
990+
assert Double.isInfinite(b);
991+
return b < 0 ? +1 : -1;
992+
}
993+
}
994+
979995
@Specialization(guards = {
980996
"isNormal(a)",
981997
"isRubyBignum(b)"
@@ -997,11 +1013,28 @@ public Object compareSpecial(DynamicObject a, long b) {
9971013
return compareSpecial(a, createBigDecimal(BigDecimal.valueOf(b)));
9981014
}
9991015

1000-
@Specialization(guards = "!isNormal(a)")
1001-
public Object compareSpecial(DynamicObject a, double b) {
1016+
@Specialization(guards = {
1017+
"!isNormal(a)",
1018+
"isFinite(b)"
1019+
})
1020+
public Object compareSpecialFinite(DynamicObject a, double b) {
10021021
return compareSpecial(a, createBigDecimal(valueOf(b)));
10031022
}
10041023

1024+
@Specialization(guards = {
1025+
"!isNormal(a)",
1026+
"!isFinite(b)"
1027+
})
1028+
public Object compareSpecialInfinite(DynamicObject a, double b) {
1029+
final BigDecimalType type = Layouts.BIG_DECIMAL.getType(a);
1030+
1031+
if (type == BigDecimalType.NAN || Double.isNaN(b)) {
1032+
return nil();
1033+
} else {
1034+
return b < 0 ? +1 : -1;
1035+
}
1036+
}
1037+
10051038
@Specialization(guards = {
10061039
"!isNormal(a)",
10071040
"isRubyBignum(b)"

0 commit comments

Comments
 (0)