diff options
author | aspect <aspect+tclcore@abstracted-spleen.org> | 2015-02-19 02:34:43 (GMT) |
---|---|---|
committer | aspect <aspect+tclcore@abstracted-spleen.org> | 2015-02-19 02:34:43 (GMT) |
commit | a3fe56e967acaf42e8fb2180de39428b24fb3ed4 (patch) | |
tree | 437c7f1136cd39ced0be486e6e9ada7d6ee63f26 | |
parent | b45286725aeaf89d746d3f7edc0f125a4c0950a3 (diff) | |
download | tcl-a3fe56e967acaf42e8fb2180de39428b24fb3ed4.zip tcl-a3fe56e967acaf42e8fb2180de39428b24fb3ed4.tar.gz tcl-a3fe56e967acaf42e8fb2180de39428b24fb3ed4.tar.bz2 |
(core ticket [32b6159246]) Fix for [lreplace l x y] where y<x-1
-rw-r--r-- | generic/tclCompCmdsGR.c | 5 | ||||
-rw-r--r-- | tests/lreplace.test | 6 |
2 files changed, 10 insertions, 1 deletions
diff --git a/generic/tclCompCmdsGR.c b/generic/tclCompCmdsGR.c index e2fb43d..5220576 100644 --- a/generic/tclCompCmdsGR.c +++ b/generic/tclCompCmdsGR.c @@ -1524,6 +1524,9 @@ TclCompileLreplaceCmd( tmpObj = Tcl_NewIntObj(idx1); Tcl_IncrRefCount(tmpObj); } + if(idx2 < idx1) { + idx2 = idx1-1; + } goto dropRange; } } @@ -1547,7 +1550,7 @@ TclCompileLreplaceCmd( idx1 = 0; goto replaceTail; } else { - if (idx1 > 0 && idx2 > 0 && idx2 < idx1) { + if (idx1 >= 0 && idx2 > 0 && idx2 < idx1) { idx2 = idx1 - 1; } else if (idx1 < 0 && idx2 < 0 && idx2 < idx1) { idx2 = idx1 - 1; diff --git a/tests/lreplace.test b/tests/lreplace.test index b976788..44f3ac2 100644 --- a/tests/lreplace.test +++ b/tests/lreplace.test @@ -137,6 +137,12 @@ test lreplace-4.1 {Bug ccc2c2cc98: lreplace edge case} { test lreplace-4.2 {Bug ccc2c2cc98: lreplace edge case} { lreplace { } 1 1 } {} +test lreplace-4.3 {lreplace edge case} { + lreplace {1 2 3} 2 0 +} {1 2 3} +test lreplace-4.4 {lreplace edge case} { + lreplace {1 2 3 4 5} 3 1 +} {1 2 3 4 5} # cleanup catch {unset foo} |