diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2012-11-30 07:55:59 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2012-11-30 07:55:59 (GMT) |
commit | 5b235b69d517aa8db6f124990b7eb3bd0e37f4be (patch) | |
tree | 5e3e130227dccd336d8b0e13be496bed237b5cb5 | |
parent | 304025f703a1e983fd85930968efe258c5c26c6f (diff) | |
download | tcl-5b235b69d517aa8db6f124990b7eb3bd0e37f4be.zip tcl-5b235b69d517aa8db6f124990b7eb3bd0e37f4be.tar.gz tcl-5b235b69d517aa8db6f124990b7eb3bd0e37f4be.tar.bz2 |
Improve behavior when exception ranges need retraction.
-rw-r--r-- | generic/tclAssembly.c | 4 | ||||
-rw-r--r-- | generic/tclCompile.c | 9 |
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; } /* |