summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--generic/tclBasic.c13
2 files changed, 20 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 68ebe18..2ead370 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2003-10-08 Don Porter <dgp@users.sourceforge.net>
+
+ * generic/tclBasic.c: Save and restore the iPtr->flag bits that
+ control the state of errorCode and errorInfo management when calling
+ "leave" execution traces, so that all error information of the traced
+ command is still available whether traced or not. [Bug 760947]
+ Thanks to Yahalom Emet.
+
2003-10-08 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* generic/tclTest.c (TestNumUtfCharsCmd): Command to allow finer
diff --git a/generic/tclBasic.c b/generic/tclBasic.c
index 4ef3285..d356ddf 100644
--- a/generic/tclBasic.c
+++ b/generic/tclBasic.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: tclBasic.c,v 1.90 2003/10/03 20:42:06 dgp Exp $
+ * RCS: @(#) $Id: tclBasic.c,v 1.91 2003/10/08 23:18:35 dgp Exp $
*/
#include "tclInt.h"
@@ -3151,6 +3151,10 @@ TclEvalObjvInternal(interp, objc, objv, command, length, flags)
* Call 'leave' command traces
*/
if (!(cmdPtr->flags & CMD_IS_DELETED)) {
+ int saveErrFlags = iPtr->flags
+ & (ERR_IN_PROGRESS | ERR_ALREADY_LOGGED | ERROR_CODE_SET);
+ Tcl_Obj *saveOptions = iPtr->returnOpts;
+ Tcl_IncrRefCount(saveOptions);
if ((cmdPtr->flags & CMD_HAS_EXEC_TRACES) && (traceCode == TCL_OK)) {
traceCode = TclCheckExecutionTraces (interp, command, length,
cmdPtr, code, TCL_TRACE_LEAVE_EXEC, objc, objv);
@@ -3159,6 +3163,13 @@ TclEvalObjvInternal(interp, objc, objv, command, length, flags)
traceCode = TclCheckInterpTraces(interp, command, length,
cmdPtr, code, TCL_TRACE_LEAVE_EXEC, objc, objv);
}
+ if (traceCode == TCL_OK) {
+ Tcl_DecrRefCount(iPtr->returnOpts);
+ iPtr->returnOpts = saveOptions;
+ Tcl_IncrRefCount(iPtr->returnOpts);
+ iPtr->flags |= saveErrFlags;
+ }
+ Tcl_DecrRefCount(saveOptions);
}
TclCleanupCommand(cmdPtr);