Skip to content

Commit 31edaed

Browse files
committed
#5305: reject numbers outside long range in number.as-i64 instead of saturating
1 parent c5d218e commit 31edaed

2 files changed

Lines changed: 12 additions & 1 deletion

File tree

eo-runtime/src/main/eo/number.eo

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1455,5 +1455,10 @@
14551455
# Tests that NaN is not a finite value.
14561456
nan.is-finite.not > [] +> nan-is-not-finite
14571457

1458+
# Tests that converting a number far outside i64 range to i64 throws an error,
1459+
# instead of silently saturating to Long.MAX_VALUE.
1460+
[] +> throws-on-converting-huge-number-to-i64
1461+
1.0e30.as-i64 > @
1462+
14581463
# Tests that NaN is not an integer.
14591464
nan.is-integer.not > [] +> nan-is-not-integer

eo-runtime/src/main/java/org/eolang/EOnumber$EOas_i64.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,13 @@ public Phi lambda() {
2525
0,
2626
new Data.ToPhi(
2727
new BytesOf(
28-
new Expect.Number(Expect.at(this, Phi.RHO)).it().longValue()
28+
Expect.at(this, Phi.RHO)
29+
.that(phi -> new Dataized(phi).asNumber())
30+
.otherwise("must be a number")
31+
.must(number -> number >= Long.MIN_VALUE && number <= Long.MAX_VALUE)
32+
.otherwise("must fit into long range")
33+
.that(Double::longValue)
34+
.it()
2935
).take()
3036
)
3137
);

0 commit comments

Comments
 (0)