summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2012-11-30 07:55:59 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2012-11-30 07:55:59 (GMT)
commit5b235b69d517aa8db6f124990b7eb3bd0e37f4be (patch)
tree5e3e130227dccd336d8b0e13be496bed237b5cb5
parent304025f703a1e983fd85930968efe258c5c26c6f (diff)
downloadtcl-5b235b69d517aa8db6f124990b7eb3bd0e37f4be.zip
tcl-5b235b69d517aa8db6f124990b7eb3bd0e37f4be.tar.gz
tcl-5b235b69d517aa8db6f124990b7eb3bd0e37f4be.tar.bz2
Improve behavior when exception ranges need retraction.
-rw-r--r--generic/tclAssembly.c4
-rw-r--r--generic/tclCompile.c9
2 files changed, 11 insertions, 2 deletions
diff --git a/generic/tclAssembly.c b/generic/tclAssembly.c
index 5f5207c..31690e0 100644
--- a/generic/tclAssembly.c
+++ b/generic/tclAssembly.c
@@ -839,7 +839,7 @@ CompileAssembleObj(
for (i = 0; i < compEnv.auxDataArrayNext; i++) {
auxDataPtr = compEnv.auxDataArrayPtr + i;
if (auxDataPtr->type->freeProc != NULL) {
- (auxDataPtr->type->freeProc)(auxDataPtr->clientData);
+ auxDataPtr->type->freeProc(auxDataPtr->clientData);
}
}
@@ -3101,7 +3101,7 @@ CheckNonThrowingBlock(
* Determine whether an instruction is nonthrowing.
*/
- opcode = (envPtr->codeStart)[offset];
+ opcode = envPtr->codeStart[offset];
if (BytecodeMightThrow(opcode)) {
/*
* Report an error for a throw in the wrong context.
diff --git a/generic/tclCompile.c b/generic/tclCompile.c
index 7dddaa3..fc05ec6 100644
--- a/generic/tclCompile.c
+++ b/generic/tclCompile.c
@@ -1740,6 +1740,7 @@ TclCompileScript(
int code, savedNumCmds = envPtr->numCommands;
unsigned savedCodeNext =
envPtr->codeNext - envPtr->codeStart;
+ int savedExceptArrayNext = envPtr->exceptArrayNext;
int update = 0;
#ifdef TCL_COMPILE_DEBUG
int startStackDepth = envPtr->currStackDepth;
@@ -1844,6 +1845,14 @@ TclCompileScript(
envPtr->numCommands = savedNumCmds;
envPtr->codeNext = envPtr->codeStart + savedCodeNext;
+
+ /*
+ * Must also restore the number of exception ranges;
+ * cannot guarantee that none were issued before the
+ * failure.
+ */
+
+ envPtr->exceptArrayNext = savedExceptArrayNext;
}
/*