Skip to content

Commit 4634b94

Browse files
committed
Better handling exceptions.
1 parent d07d066 commit 4634b94

File tree

2 files changed

+38
-7
lines changed
  • graalpython

2 files changed

+38
-7
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_float.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -646,3 +646,20 @@ def subclassTest(number):
646646
subclassTest(9.1)
647647
subclassTest(6227020800.2)
648648
subclassTest(9999992432902008176640000999999.33)
649+
650+
def test_trunc(self):
651+
self.assertEqual(float(1).__trunc__(), 1)
652+
self.assertEqual(float(1.99).__trunc__(), 1)
653+
self.assertEqual(float(-1.99).__trunc__(), -1)
654+
655+
self.assertRaises(ValueError, float('nan').__trunc__)
656+
self.assertRaises(OverflowError, float('inf').__trunc__)
657+
self.assertRaises(OverflowError, float('-inf').__trunc__)
658+
659+
self.assertEqual(MyFloat(1).__trunc__(), 1)
660+
self.assertEqual(MyFloat(1.99).__trunc__(), 1)
661+
self.assertEqual(MyFloat(-1.99).__trunc__(), -1)
662+
663+
self.assertRaises(ValueError, MyFloat('nan').__trunc__)
664+
self.assertRaises(OverflowError, MyFloat('inf').__trunc__)
665+
self.assertRaises(OverflowError, MyFloat('-inf').__trunc__)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/FloatBuiltins.java

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
import com.oracle.truffle.api.dsl.NodeFactory;
8585
import com.oracle.truffle.api.dsl.Specialization;
8686
import com.oracle.truffle.api.dsl.TypeSystemReference;
87+
import com.oracle.truffle.api.profiles.ConditionProfile;
8788

8889
@CoreFunctions(extendClasses = PFloat.class)
8990
public final class FloatBuiltins extends PythonBuiltins {
@@ -929,25 +930,38 @@ static abstract class ConjugateNode extends RealNode {
929930
@GenerateNodeFactory
930931
abstract static class TruncNode extends PythonUnaryBuiltinNode {
931932

932-
private int truncate(double value) {
933+
@TruffleBoundary
934+
protected static int truncate(double value) {
933935
return (int) (value < 0 ? Math.ceil(value) : Math.floor(value));
934936
}
935937

936938
@Specialization
937-
int trunc(double value) {
939+
int trunc(double value,
940+
@Cached("createBinaryProfile()") ConditionProfile nanProfile,
941+
@Cached("createBinaryProfile()") ConditionProfile infProfile) {
942+
if (nanProfile.profile(Double.isNaN(value))) {
943+
throw raise(PythonErrorType.ValueError, "cannot convert float NaN to integer");
944+
}
945+
if (infProfile.profile(Double.isInfinite(value))) {
946+
throw raise(PythonErrorType.OverflowError, "cannot convert float infinity to integer");
947+
}
938948
return truncate(value);
939949
}
940950

941951
@Specialization
942-
int trunc(PFloat pValue) {
952+
int trunc(PFloat pValue,
953+
@Cached("createBinaryProfile()") ConditionProfile nanProfile,
954+
@Cached("createBinaryProfile()") ConditionProfile infProfile) {
943955
double value = pValue.getValue();
944-
if (value == Double.NaN) {
945-
raise(PythonErrorType.ValueError, "cannot convert float NaN to integer");
946-
} else if (value == Double.NEGATIVE_INFINITY || value == Double.POSITIVE_INFINITY) {
947-
raise(PythonErrorType.OverflowError, "cannot convert float infinity to integer");
956+
if (nanProfile.profile(Double.isNaN(value))) {
957+
throw raise(PythonErrorType.ValueError, "cannot convert float NaN to integer");
958+
}
959+
if (infProfile.profile(Double.isInfinite(value))) {
960+
throw raise(PythonErrorType.OverflowError, "cannot convert float infinity to integer");
948961
}
949962
return truncate(value);
950963
}
964+
951965
}
952966

953967
@Builtin(name = __GETFORMAT__, fixedNumOfArguments = 2)

0 commit comments

Comments
 (0)