summaryrefslogtreecommitdiffstats
path: root/generic/tclCompile.c
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2015-08-03 07:21:29 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2015-08-03 07:21:29 (GMT)
commit7e228aa9619d0a705f3aa8e7d7c4df1b9646b957 (patch)
tree108bcc3c44075bc53eb563f26b7a5461b5a4167d /generic/tclCompile.c
parent33a7feeefdbe3e76e6e2b4757933356f3b0660ca (diff)
parent4e411a89fe3bb8d47bf960e738a5b484b53b2757 (diff)
downloadtcl-7e228aa9619d0a705f3aa8e7d7c4df1b9646b957.zip
tcl-7e228aa9619d0a705f3aa8e7d7c4df1b9646b957.tar.gz
tcl-7e228aa9619d0a705f3aa8e7d7c4df1b9646b957.tar.bz2
Fix problems with break and continue in for-step clauses, triggered by reporting
of Coverity CID 1251203. Some of these were originally bugs in Tcl 8.0.
Diffstat (limited to 'generic/tclCompile.c')
-rw-r--r--generic/tclCompile.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/generic/tclCompile.c b/generic/tclCompile.c
index 824276c..f62ec14 100644
--- a/generic/tclCompile.c
+++ b/generic/tclCompile.c
@@ -4083,16 +4083,6 @@ TclEmitInvoke(
* calls from inside a [for] increment clause).
*/
- rangePtr = TclGetInnermostExceptionRange(envPtr, TCL_BREAK, &auxBreakPtr);
- if (rangePtr == NULL || rangePtr->type != LOOP_EXCEPTION_RANGE) {
- auxBreakPtr = NULL;
- } else if (auxBreakPtr->stackDepth == envPtr->currStackDepth-wordCount
- && auxBreakPtr->expandTarget == envPtr->expandCount-expandCount) {
- auxBreakPtr = NULL;
- } else {
- breakRange = auxBreakPtr - envPtr->exceptAuxArrayPtr;
- }
-
rangePtr = TclGetInnermostExceptionRange(envPtr, TCL_CONTINUE,
&auxContinuePtr);
if (rangePtr == NULL || rangePtr->type != LOOP_EXCEPTION_RANGE) {
@@ -4101,7 +4091,18 @@ TclEmitInvoke(
&& auxContinuePtr->expandTarget == envPtr->expandCount-expandCount) {
auxContinuePtr = NULL;
} else {
- continueRange = auxBreakPtr - envPtr->exceptAuxArrayPtr;
+ continueRange = auxContinuePtr - envPtr->exceptAuxArrayPtr;
+ }
+
+ rangePtr = TclGetInnermostExceptionRange(envPtr, TCL_BREAK, &auxBreakPtr);
+ if (rangePtr == NULL || rangePtr->type != LOOP_EXCEPTION_RANGE) {
+ auxBreakPtr = NULL;
+ } else if (auxContinuePtr == NULL
+ && auxBreakPtr->stackDepth == envPtr->currStackDepth-wordCount
+ && auxBreakPtr->expandTarget == envPtr->expandCount-expandCount) {
+ auxBreakPtr = NULL;
+ } else {
+ breakRange = auxBreakPtr - envPtr->exceptAuxArrayPtr;
}
if (auxBreakPtr != NULL || auxContinuePtr != NULL) {