summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgriffin <briang42@easystreet.net>2022-08-17 22:32:34 (GMT)
committergriffin <briang42@easystreet.net>2022-08-17 22:32:34 (GMT)
commit9a179b641897fc4e631dfe3dbd737d864f5df96d (patch)
tree0e9ec57e38309fbb4d78bc0736c6ebffa7593797
parent2439b064ea3e521e50f6c7bd43ef0a69d183bff9 (diff)
downloadtcl-9a179b641897fc4e631dfe3dbd737d864f5df96d.zip
tcl-9a179b641897fc4e631dfe3dbd737d864f5df96d.tar.gz
tcl-9a179b641897fc4e631dfe3dbd737d864f5df96d.tar.bz2
Bug fixes
-rw-r--r--doc/lseq.n4
-rw-r--r--generic/tclCmdIL.c33
-rw-r--r--generic/tclListObj.c5
-rw-r--r--tests/lseq.test34
4 files changed, 43 insertions, 33 deletions
diff --git a/doc/lseq.n b/doc/lseq.n
index 0e452d8..4eb0fcf 100644
--- a/doc/lseq.n
+++ b/doc/lseq.n
@@ -34,12 +34,12 @@ and use the numeric result, or error as with any invalid argument value.
.\"
lseq 3
- \(-> 0 1
+ \(-> 0 1 2
lseq 3 0
\(-> 3 2 1 0
- lseq 10 .. 1 by 2
+ lseq 10 .. 1 by -2
\(-> 10 8 6 4 2
set l [lseq 0 -5]
diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c
index 669f34b..332c77b 100644
--- a/generic/tclCmdIL.c
+++ b/generic/tclCmdIL.c
@@ -4222,11 +4222,7 @@ Tcl_LseqObjCmd(
start = values[0];
end = values[1];
step = (start <= end) ? 1 : -1;
- if (start <= end) {
- elementCount = step ? (end-start+step)/step : 0; // 0 step -> empty list
- } else {
- elementCount = step ? (start-end-step)/(-step) : 0; // 0 step -> empty list
- }
+ elementCount = step ? (end-start+step)/step : 0; // 0 step -> empty list
if (elementCount < 0) elementCount = 0;
break;
@@ -4235,11 +4231,7 @@ Tcl_LseqObjCmd(
start = values[0];
end = values[1];
step = values[2];
- if (start <= end) {
- elementCount = step ? (end-start+step)/step : 0; // 0 step -> empty list
- } else {
- elementCount = step ? (start-end-step)/(-step) : 0; // 0 step -> empty list
- }
+ elementCount = step ? (end-start+step)/step : 0; // 0 step -> empty list
if (elementCount < 0) elementCount = 0;
break;
@@ -4261,7 +4253,6 @@ Tcl_LseqObjCmd(
elementCount = values[0];
step = values[2];
end = start + (step * elementCount);
- elementCount = step ? (start-end+step)/step : 0; // 0 step -> empty list
break;
case RANGE_COUNT:
start = values[0];
@@ -4285,6 +4276,7 @@ Tcl_LseqObjCmd(
start = values[0];
end = values[2];
step = values[3];
+ elementCount = step ? (end-start+step)/step : 0; // 0 step -> empty list
break;
case RANGE_COUNT:
start = values[0];
@@ -4321,14 +4313,7 @@ Tcl_LseqObjCmd(
goto done;
break;
}
- if (step == 0) {
- // 0 step -> empty list
- elementCount = 0;
- } else if (start <= end) {
- elementCount = (end-start+step)/step;
- } else {
- elementCount = (start-end-step)/(-step);
- }
+ elementCount = step ? (end-start+step)/step : 0; // 0 step -> empty list
break;
/* range n 'to' n 'by' n */
@@ -4351,17 +4336,11 @@ Tcl_LseqObjCmd(
case RANGE_TO:
start = values[0];
end = values[2];
- if ((step == 0) ||
- (start < end && step < 0) ||
- (start > end && step > 0)) {
- elementCount = 0;
- } else {
- elementCount = (end-start+step)/step;
- }
+ elementCount = step ? (end-start+step)/step : 0; // 0 step -> empty list
break;
case RANGE_COUNT:
start = values[0];
- elementCount = (values[2] >= 0 ? values[2] : 0);
+ elementCount = values[2] >= 0 ? values[2] : 0;
if (step != 0) {
end = start + (step * elementCount);
} else {
diff --git a/generic/tclListObj.c b/generic/tclListObj.c
index 37d941d..6b5ab7e 100644
--- a/generic/tclListObj.c
+++ b/generic/tclListObj.c
@@ -2347,9 +2347,12 @@ TclNewArithSeriesObj(Tcl_WideInt start, Tcl_WideInt end, Tcl_WideInt step, Tcl_W
Tcl_Obj *arithSeriesPtr;
ArithSeries *arithSeriesRepPtr;
- if (length == -1) return NULL; /* Invalid range error */
TclNewObj(arithSeriesPtr);
+ if (length <= 0) {
+ return arithSeriesPtr;
+ }
+
arithSeriesRepPtr = (ArithSeries*) ckalloc(sizeof (ArithSeries));
arithSeriesRepPtr->start = start;
arithSeriesRepPtr->end = end;
diff --git a/tests/lseq.test b/tests/lseq.test
index 082111b..04f9c77 100644
--- a/tests/lseq.test
+++ b/tests/lseq.test
@@ -113,6 +113,18 @@ test lseq-1.19 {too many arguments extra numeric value} -body {
lseq 12 to 24 by 2 7
} -returnCodes 1 -result {wrong # args: should be "lseq n ??op? n ??by? n??"}
+test lseq-1.20 {bug: wrong length computed} {
+ lseq 1 to 10 -1
+} {}
+
+test lseq-1.21 {n n by n} {
+ lseq 66 84 by 3
+} {66 69 72 75 78 81 84}
+
+test lseq-1.22 {n n by -n} {
+ lseq 84 66 by -3
+} {84 81 78 75 72 69 66}
+
#
# Short-hand use cases
#
@@ -182,6 +194,17 @@ test lseq-2.17 {large numbers} arithSeriesDouble {
lseq 1e6 2e6 1e5
} {1000000.0 1100000.0 1200000.0 1300000.0 1400000.0 1500000.0 1600000.0 1700000.0 1800000.0 1900000.0 2000000.0}
+# Covered: {10 1 2 } {1 10 2} {1 10 -2} {1 1 1} {1 1 1} {-5 17 3}
+# Missing: {- - +} {- - -} {- + -} {+ - -} {- - +} {+ + -}
+test lseq-2.18 {signs} {
+ list [lseq -10 -1 2] \
+ [lseq -10 -1 -1] \
+ [lseq -10 1 -3] \
+ [lseq 10 -1 -4] \
+ [lseq -10 -1 3] \
+ [lseq 10 1 -5]
+
+} {{-10 -8 -6 -4 -2} {} {} {10 6 2} {-10 -7 -4 -1} {10 5}}
test lseq-3.1 {experiement} {
set ans {}
@@ -216,8 +239,9 @@ test lseq-3.4 {error case} -body {
} -returnCodes 1 -result {bad operation "or": must be .., to, count, or by}
test lseq-3.5 {simple count and step arguments} {
- lseq 25 by 6
-} {0 6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96 102 108 114 120 126 132 138 144 150}
+ set s [lseq 25 by 6]
+ list $s length=[llength $s]
+} {{0 6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96 102 108 114 120 126 132 138 144} length=25}
test lseq-3.6 {error case} -body {
lseq 1 7 or 3
@@ -335,7 +359,7 @@ test lseq-3.22 {edge case} {
test lseq-3.23 {edge case} {
llength [lseq 1 1 1]
} {1}
-
+
test lseq-3.24 {edge case} {
llength [lseq 1 to 1 1]
} {1}
@@ -366,6 +390,10 @@ test lseq-3.28 {lreverse bug in ArithSeries} {} {
list $r $rr [string equal $r [lreverse $rr]]
} {{-5 -2 1 4 7 10 13 16} {16 13 10 7 4 1 -2 -5} 1}
+test lseq-3.29 {edge case: negative count} {
+ lseq -15
+} {}
+
test lseq-4.1 {end expressions} {
set start 7
lseq $start $start+11