summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib.c72
-rw-r--r--tests/012/iter.tl23
2 files changed, 71 insertions, 24 deletions
diff --git a/lib.c b/lib.c
index 26304231..7bc1a837 100644
--- a/lib.c
+++ b/lib.c
@@ -529,7 +529,7 @@ static int seq_iter_peek_range_chr(seq_iter_t *it, val *pval)
return 0;
}
-static int seq_iter_get_range_bignum(seq_iter_t *it, val *pval)
+static int seq_iter_get_range_number(seq_iter_t *it, val *pval)
{
if (lt(it->ui.vn, it->ul.vbound)) {
*pval = it->ui.iter;
@@ -539,7 +539,7 @@ static int seq_iter_get_range_bignum(seq_iter_t *it, val *pval)
return 0;
}
-static int seq_iter_peek_range_bignum(seq_iter_t *it, val *pval)
+static int seq_iter_peek_range_number(seq_iter_t *it, val *pval)
{
if (lt(it->ui.vn, it->ul.vbound)) {
*pval = it->ui.iter;
@@ -620,7 +620,7 @@ static int seq_iter_peek_rev_range_chr(seq_iter_t *it, val *pval)
return 0;
}
-static int seq_iter_get_rev_range_bignum(seq_iter_t *it, val *pval)
+static int seq_iter_get_rev_range_number(seq_iter_t *it, val *pval)
{
if (gt(it->ui.vn, it->ul.vbound)) {
*pval = it->ui.iter = pred(it->ui.iter);
@@ -629,7 +629,7 @@ static int seq_iter_get_rev_range_bignum(seq_iter_t *it, val *pval)
return 0;
}
-static int seq_iter_peek_rev_range_bignum(seq_iter_t *it, val *pval)
+static int seq_iter_peek_rev_range_number(seq_iter_t *it, val *pval)
{
if (gt(it->ui.vn, it->ul.vbound)) {
*pval = pred(it->ui.iter);
@@ -892,9 +892,9 @@ struct seq_iter_ops si_range_chr_ops =
seq_iter_ops_init_nomark(seq_iter_get_range_chr,
seq_iter_peek_range_chr);
-struct seq_iter_ops si_range_bignum_ops =
- seq_iter_ops_init(seq_iter_get_range_bignum,
- seq_iter_peek_range_bignum);
+struct seq_iter_ops si_range_number_ops =
+ seq_iter_ops_init(seq_iter_get_range_number,
+ seq_iter_peek_range_number);
struct seq_iter_ops si_range_str_ops =
seq_iter_ops_init(seq_iter_get_range_str,
@@ -908,9 +908,9 @@ struct seq_iter_ops si_rev_range_chr_ops =
seq_iter_ops_init_nomark(seq_iter_get_rev_range_chr,
seq_iter_peek_rev_range_chr);
-struct seq_iter_ops si_rev_range_bignum_ops =
- seq_iter_ops_init(seq_iter_get_rev_range_bignum,
- seq_iter_peek_rev_range_bignum);
+struct seq_iter_ops si_rev_range_number_ops =
+ seq_iter_ops_init(seq_iter_get_rev_range_number,
+ seq_iter_peek_rev_range_number);
struct seq_iter_ops si_rev_range_str_ops =
seq_iter_ops_init(seq_iter_get_rev_range_str,
@@ -946,14 +946,22 @@ void seq_iter_init_with_info(val self, seq_iter_t *it,
if (less(rf, rt)) switch (type(rf)) {
case NUM:
- if (bignump(rt) && !mp_in_intptr_range(mp(rt))) {
+ num_range_fwd:
+ switch (type(rt)) {
+ case BGNUM:
+ if (mp_in_intptr_range(mp(rt))) {
+ case NUM:
+ it->ui.cn = c_num(rf, self);
+ it->ul.cbound = c_num(rt, self);
+ it->ops = &si_range_cnum_ops;
+ break;
+ }
+ /* fallthrough */
+ default:
it->ui.vn = rf;
it->ul.vbound = rt;
- it->ops = &si_range_bignum_ops;
- } else {
- it->ui.cn = c_num(rf, self);
- it->ul.cbound = c_num(rt, self);
- it->ops = &si_range_cnum_ops;
+ it->ops = &si_range_number_ops;
+ break;
}
break;
case CHR:
@@ -962,9 +970,13 @@ void seq_iter_init_with_info(val self, seq_iter_t *it,
it->ops = &si_range_chr_ops;
break;
case BGNUM:
+ if (mp_in_intptr_range(mp(rf)))
+ goto num_range_fwd;
+ /* fallthrough */
+ case FLNUM:
it->ui.vn = rf;
it->ul.vbound = rt;
- it->ops = &si_range_bignum_ops;
+ it->ops = &si_range_number_ops;
break;
case LIT:
case STR:
@@ -979,14 +991,22 @@ void seq_iter_init_with_info(val self, seq_iter_t *it,
unsup_obj(self, it->inf.obj);
} else if (!equal(rf, rt)) switch (type(rf)) {
case NUM:
- if (bignump(rt) && !mp_in_intptr_range(mp(rt))) {
+ num_range_rev:
+ switch (type(rt)) {
+ case BGNUM:
+ if (mp_in_intptr_range(mp(rt))) {
+ case NUM:
+ it->ui.cn = c_num(rf, self);
+ it->ul.cbound = c_num(rt, self);
+ it->ops = &si_rev_range_cnum_ops;
+ break;
+ }
+ /* fallthrough */
+ default:
it->ui.vn = rf;
it->ul.vbound = rt;
- it->ops = &si_rev_range_bignum_ops;
- } else {
- it->ui.cn = c_num(rf, self);
- it->ul.cbound = c_num(rt, self);
- it->ops = &si_rev_range_cnum_ops;
+ it->ops = &si_rev_range_number_ops;
+ break;
}
break;
case CHR:
@@ -995,9 +1015,13 @@ void seq_iter_init_with_info(val self, seq_iter_t *it,
it->ops = &si_rev_range_chr_ops;
break;
case BGNUM:
+ if (mp_in_intptr_range(mp(rf)))
+ goto num_range_rev;
+ /* fallthrough */
+ case FLNUM:
it->ui.vn = rf;
it->ul.vbound = rt;
- it->ops = &si_rev_range_bignum_ops;
+ it->ops = &si_rev_range_number_ops;
break;
case LIT:
case STR:
diff --git a/tests/012/iter.tl b/tests/012/iter.tl
index 051368b3..9b1db6f5 100644
--- a/tests/012/iter.tl
+++ b/tests/012/iter.tl
@@ -67,3 +67,26 @@
(let ((big (* fixnum-max 8)))
(test (progn (each ((x big..(+ 10 big))) (sys:gc)) 42) 42))
+
+(mtest
+ (list-seq 0..5) (0 1 2 3 4)
+ (list-seq 5..0) (4 3 2 1 0)
+ (list-seq 0..5.0) (0 1 2 3 4)
+ (list-seq 5..0.0) (4 3 2 1 0)
+ (list-seq 0.0..5.0) (0.0 1.0 2.0 3.0 4.0)
+ (list-seq 5.0..0.0) (4.0 3.0 2.0 1.0 0.0)
+ (list-seq 0.0..5) (0.0 1.0 2.0 3.0 4.0)
+ (list-seq 5.0..0) (4.0 3.0 2.0 1.0 0.0)
+ (list-seq 0.0..5.1) (0.0 1.0 2.0 3.0 4.0 5.0)
+ (list-seq 0.5..5) (0.5 1.5 2.5 3.5 4.5)
+ (list-seq (expt 2 256)..(ssucc (expt 2 256)))
+ (115792089237316195423570985008687907853269984665640564039457584007913129639936
+ 115792089237316195423570985008687907853269984665640564039457584007913129639937)
+ (list-seq (expt 2 256)..(ppred (expt 2 256)))
+ (115792089237316195423570985008687907853269984665640564039457584007913129639935
+ 115792089237316195423570985008687907853269984665640564039457584007913129639934)
+ (take 3 (list-seq (expt 2 256)..0))
+ (115792089237316195423570985008687907853269984665640564039457584007913129639935
+ 115792089237316195423570985008687907853269984665640564039457584007913129639934
+ 115792089237316195423570985008687907853269984665640564039457584007913129639933))
+