summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2003-10-08 23:18:16 (GMT)
committerdgp <dgp@users.sourceforge.net>2003-10-08 23:18:16 (GMT)
commiteca4664d01909a7882167002ee5f451dc982076e (patch)
tree0715cd69d91759baf02ed0b19e4c90f2503898c2
parenta17766024b1d018e9dd4bc4831eca9fa6b56500d (diff)
downloadtcl-eca4664d01909a7882167002ee5f451dc982076e.zip
tcl-eca4664d01909a7882167002ee5f451dc982076e.tar.gz
tcl-eca4664d01909a7882167002ee5f451dc982076e.tar.bz2
* 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.
-rw-r--r--ChangeLog8
-rw-r--r--generic/tclBasic.c7
2 files changed, 14 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 3d8855f..180b267 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 dc4fe90..0a32cbf 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.75.2.7 2003/10/03 20:31:23 dgp Exp $
+ * RCS: @(#) $Id: tclBasic.c,v 1.75.2.8 2003/10/08 23:18:17 dgp Exp $
*/
#include "tclInt.h"
@@ -3095,6 +3095,8 @@ 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);
if ((cmdPtr->flags & CMD_HAS_EXEC_TRACES) && (traceCode == TCL_OK)) {
traceCode = TclCheckExecutionTraces (interp, command, length,
cmdPtr, code, TCL_TRACE_LEAVE_EXEC, objc, objv);
@@ -3103,6 +3105,9 @@ TclEvalObjvInternal(interp, objc, objv, command, length, flags)
traceCode = TclCheckInterpTraces(interp, command, length,
cmdPtr, code, TCL_TRACE_LEAVE_EXEC, objc, objv);
}
+ if (traceCode == TCL_OK) {
+ iPtr->flags |= saveErrFlags;
+ }
}
TclCleanupCommand(cmdPtr);