diff options
author | dgp <dgp@users.sourceforge.net> | 2008-08-04 04:48:13 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2008-08-04 04:48:13 (GMT) |
commit | 48cc4927f6e3bc52ca55b4c366efd3b02987b998 (patch) | |
tree | a66d62225090f27fc546e88101c12e45e9de6e00 | |
parent | 3e033b354b6208eb4e0c1e0acd9fbb3e52bcd579 (diff) | |
download | tcl-48cc4927f6e3bc52ca55b4c366efd3b02987b998.zip tcl-48cc4927f6e3bc52ca55b4c366efd3b02987b998.tar.gz tcl-48cc4927f6e3bc52ca55b4c366efd3b02987b998.tar.bz2 |
* generic/tclExecute.c: Stopped faulty double-logging of errors to
* tests/execute.test: stack trace when a compile epoch bump triggers
fallback to direct evaluation of commands in a compiled script.
[Bug 2037338]
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | generic/tclExecute.c | 12 | ||||
-rw-r--r-- | tests/execute.test | 23 |
3 files changed, 40 insertions, 2 deletions
@@ -1,3 +1,10 @@ +2008-08-04 Don Porter <dgp@users.sourceforge.net>S + + * generic/tclExecute.c: Stopped faulty double-logging of errors to + * tests/execute.test: stack trace when a compile epoch bump triggers + fallback to direct evaluation of commands in a compiled script. + [Bug 2037338] + 2008-07-30 Don Porter <dgp@users.sourceforge.net> * generic/tclBasic.c: Corrected the timing of when the flag diff --git a/generic/tclExecute.c b/generic/tclExecute.c index 833197a..985a867 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -13,7 +13,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclExecute.c,v 1.369.2.3 2008/07/29 13:51:11 msofer Exp $ + * RCS: @(#) $Id: tclExecute.c,v 1.369.2.4 2008/08/04 04:48:14 dgp Exp $ */ #include "tclInt.h" @@ -2051,6 +2051,16 @@ TclExecuteByteCode( CACHE_STACK_INFO(); if (result != TCL_OK) { cleanup = 0; + if (result == TCL_ERROR) { + /* + * Tcl_EvalEx already did the task of logging + * the error to the stack trace for us, so set + * a flag to prevent the TEBC exception handling + * machinery from trying to do it again. + * Tcl Bug 2037338. See test execute-8.4. + */ + iPtr->flags |= ERR_ALREADY_LOGGED; + } goto processExceptionReturn; } opnd = TclGetUInt4AtPtr(pc+1); diff --git a/tests/execute.test b/tests/execute.test index a43e8e6..51d375e 100644 --- a/tests/execute.test +++ b/tests/execute.test @@ -14,7 +14,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: execute.test,v 1.27 2008/03/07 19:04:10 dgp Exp $ +# RCS: @(#) $Id: execute.test,v 1.27.2.1 2008/08/04 04:48:16 dgp Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest 2 @@ -937,6 +937,27 @@ test execute-8.3 {Stack restoration} -body { interp recursionlimit {} $limit } -result {too many nested evaluations (infinite loop?)} +test execute-8.4 {Compile epoch bump effect on stack trace} -setup { + proc foo {} { + error bar + } + proc FOO {} { + catch {error bar} m o + rename ::set ::dummy + rename ::dummy ::set + return -options $o $m + } +} -body { + catch foo m o + set stack1 [dict get $o -errorinfo] + catch FOO m o + set stack2 [string map {FOO foo} [dict get $o -errorinfo]] + expr {$stack1 eq $stack2 ? {} : "These differ:\n$stack1\n$stack2"} +} -cleanup { + rename foo {} + rename FOO {} +} -result {} + test execute-9.1 {Interp result resetting [Bug 1522803]} { set c 0 catch { |