diff options
| author | dkf <donal.k.fellows@manchester.ac.uk> | 2015-08-03 07:21:29 (GMT) |
|---|---|---|
| committer | dkf <donal.k.fellows@manchester.ac.uk> | 2015-08-03 07:21:29 (GMT) |
| commit | 7e228aa9619d0a705f3aa8e7d7c4df1b9646b957 (patch) | |
| tree | 108bcc3c44075bc53eb563f26b7a5461b5a4167d /generic/tclCompile.c | |
| parent | 33a7feeefdbe3e76e6e2b4757933356f3b0660ca (diff) | |
| parent | 4e411a89fe3bb8d47bf960e738a5b484b53b2757 (diff) | |
| download | tcl-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.c | 23 |
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) { |
