summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2013-09-19 12:20:13 (GMT)
committerdgp <dgp@users.sourceforge.net>2013-09-19 12:20:13 (GMT)
commit9c7cec89a95143fb90c190c5c0f6d01424ea1431 (patch)
tree99e3b9a0a6a5a8038009b04e891bdd51ec13462c
parent6ad8909af3c178fac395992cd972c98270bf2e3c (diff)
downloadtcl-9c7cec89a95143fb90c190c5c0f6d01424ea1431.zip
tcl-9c7cec89a95143fb90c190c5c0f6d01424ea1431.tar.gz
tcl-9c7cec89a95143fb90c190c5c0f6d01424ea1431.tar.bz2
Line numbers wrong in compiled foreach body.
-rw-r--r--generic/tclCompCmds.c6
-rw-r--r--tests/foreach.test11
2 files changed, 13 insertions, 4 deletions
diff --git a/generic/tclCompCmds.c b/generic/tclCompCmds.c
index fa4762d..2013568 100644
--- a/generic/tclCompCmds.c
+++ b/generic/tclCompCmds.c
@@ -1628,7 +1628,7 @@ TclCompileForeachCmd(
Tcl_Token *tokenPtr, *bodyTokenPtr;
unsigned char *jumpPc;
JumpFixup jumpFalseFixup;
- int jumpBackDist, jumpBackOffset, infoIndex, range, bodyIndex;
+ int jumpBackDist, jumpBackOffset, infoIndex, range;
int numWords, numLists, numVars, loopIndex, tempVar, i, j, code;
int savedStackDepth = envPtr->currStackDepth;
DefineLineInformation; /* TIP #280 */
@@ -1669,8 +1669,6 @@ TclCompileForeachCmd(
return TCL_ERROR;
}
- bodyIndex = i-1;
-
/*
* Allocate storage for the varcList and varvList arrays if necessary.
*/
@@ -1837,7 +1835,7 @@ TclCompileForeachCmd(
* Inline compile the loop body.
*/
- SetLineInformation (bodyIndex);
+ SetLineInformation (numWords - 1);
ExceptionRangeStarts(envPtr, range);
CompileBody(envPtr, bodyTokenPtr, interp);
ExceptionRangeEnds(envPtr, range);
diff --git a/tests/foreach.test b/tests/foreach.test
index 7df7481..ac7a279 100644
--- a/tests/foreach.test
+++ b/tests/foreach.test
@@ -254,6 +254,17 @@ test foreach-9.1 {compiled empty var list} {
list [catch { foo } msg] $msg
} {1 {foreach varlist is empty}}
+test foreach-9.2 {line numbers} -setup {
+ proc linenumber {} {dict get [info frame -1] line}
+} -body {
+ apply {n {
+ foreach x y {*}{
+ } {return [incr n -[linenumber]]}
+ }} [linenumber]
+} -cleanup {
+ rename linenumber {}
+} -result 1
+
test foreach-10.1 {foreach: [Bug 1671087]} -setup {
proc demo {} {
set vals {1 2 3 4}