Handle degnerate range case gracefully.

This commit is contained in:
Calvin Rose
2026-08-23 13:25:54 -05:00
parent 021a17cda1
commit cea6dd2261
2 changed files with 9 additions and 5 deletions
+7 -5
View File
@@ -456,16 +456,18 @@ JANET_CORE_FN(janet_core_range,
}
count = (count > 0.0) ? count : 0.0;
int32_t int_count;
janet_assert(count >= 0.0, "bad range code");
janet_assert(count >= 0.0, "bad range code (count)");
if (count > (double) INT32_MAX) {
janet_panicf("range is too large, %f elements", count);
} else {
int_count = (int32_t) ceil(count);
}
if (step > 0.0) {
janet_assert(start + int_count * step >= stop, "bad range code");
} else {
janet_assert(start + int_count * step <= stop, "bad range code");
if (int_count) { /* e.g. (range 10 0 0) */
if (step > 0.0) {
janet_assert(start + int_count * step >= stop, "bad range code (+step)");
} else {
janet_assert(start + int_count * step <= stop, "bad range code (-step)");
}
}
JanetArray *array = janet_array(int_count);
for (int32_t i = 0; i < int_count; i++) {
+2
View File
@@ -75,6 +75,8 @@
(assert (deep= @[0 1 2 3] (range 3.999)) "range 3")
(assert (deep= @[0.8 1.8 2.8 3.8] (range 0.8 3.999)) "range 4")
(assert (deep= @[0.8 1.8 2.8 3.8] (range 0.8 3.999)) "range 5")
(assert (deep= @[] (range 10 0 0)) "range 6")
(assert (deep= @[] (range 0 10 0)) "range 7")
(assert (< 1.0 nil false true
(fiber/new (fn [] 1))