summaryrefslogtreecommitdiffstats
path: root/generic/tclTrace.c
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2008-10-08 14:50:56 (GMT)
committerdgp <dgp@users.sourceforge.net>2008-10-08 14:50:56 (GMT)
commit7d5aead5703d324d80a98cf890f90b9a452cb9a2 (patch)
tree1e54193a5e8b7423f7fa37f5f18a862109ea7eb2 /generic/tclTrace.c
parentea51624d959bfd0e5e3da93cc4c454e57ee21a72 (diff)
downloadtcl-7d5aead5703d324d80a98cf890f90b9a452cb9a2.zip
tcl-7d5aead5703d324d80a98cf890f90b9a452cb9a2.tar.gz
tcl-7d5aead5703d324d80a98cf890f90b9a452cb9a2.tar.bz2
* generic/tclTrace.c: Corrected handling of errors returned by
variable traces so that the errorInfo value contains the original error message. [Bug 2151707] * generic/tclVar.c: Revised implementation of TclObjVarErrMsg so that error message construction does not disturb an existing iPtr->errorInfo that may be in progress.
Diffstat (limited to 'generic/tclTrace.c')
-rw-r--r--generic/tclTrace.c60
1 files changed, 24 insertions, 36 deletions
diff --git a/generic/tclTrace.c b/generic/tclTrace.c
index 8f095b5..6386f29 100644
--- a/generic/tclTrace.c
+++ b/generic/tclTrace.c
@@ -11,7 +11,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclTrace.c,v 1.51 2008/09/05 01:20:00 msofer Exp $
+ * RCS: @(#) $Id: tclTrace.c,v 1.52 2008/10/08 14:50:57 dgp Exp $
*/
#include "tclInt.h"
@@ -2672,53 +2672,41 @@ TclCallVarTraces(
done:
if (code == TCL_ERROR) {
if (leaveErrMsg) {
+ const char *verb = "";
const char *type = "";
- Tcl_Obj *options = Tcl_GetReturnOptions((Tcl_Interp *)iPtr, code);
- Tcl_Obj *errorInfoKey, *errorInfo;
-
- TclNewLiteralStringObj(errorInfoKey, "-errorinfo");
- Tcl_IncrRefCount(errorInfoKey);
- Tcl_DictObjGet(NULL, options, errorInfoKey, &errorInfo);
- Tcl_IncrRefCount(errorInfo);
- Tcl_DictObjRemove(NULL, options, errorInfoKey);
- if (Tcl_IsShared(errorInfo)) {
- Tcl_DecrRefCount(errorInfo);
- errorInfo = Tcl_DuplicateObj(errorInfo);
- Tcl_IncrRefCount(errorInfo);
- }
- Tcl_AppendToObj(errorInfo, "\n (", -1);
+
switch (flags&(TCL_TRACE_READS|TCL_TRACE_WRITES|TCL_TRACE_ARRAY)) {
case TCL_TRACE_READS:
- type = "read";
- Tcl_AppendToObj(errorInfo, type, -1);
+ verb = "read";
+ type = verb;
break;
case TCL_TRACE_WRITES:
- type = "set";
- Tcl_AppendToObj(errorInfo, "write", -1);
+ verb = "set";
+ type = "write";
break;
case TCL_TRACE_ARRAY:
- type = "trace array";
- Tcl_AppendToObj(errorInfo, "array", -1);
+ verb = "trace array";
+ type = "array";
break;
}
+
if (disposeFlags & TCL_TRACE_RESULT_OBJECT) {
- TclVarErrMsg((Tcl_Interp *) iPtr, part1, part2, type,
+ Tcl_SetObjResult((Tcl_Interp *)iPtr, (Tcl_Obj *) result);
+ } else {
+ Tcl_SetResult((Tcl_Interp *)iPtr, result, TCL_STATIC);
+ }
+ Tcl_AddErrorInfo((Tcl_Interp *)iPtr, "");
+
+ Tcl_AppendObjToErrorInfo((Tcl_Interp *)iPtr, Tcl_ObjPrintf(
+ "\n (%s trace on \"%s%s%s%s\")", type, part1,
+ (part2 ? "(" : ""), (part2 ? part2 : ""),
+ (part2 ? ")" : "") ));
+ if (disposeFlags & TCL_TRACE_RESULT_OBJECT) {
+ TclVarErrMsg((Tcl_Interp *) iPtr, part1, part2, verb,
Tcl_GetString((Tcl_Obj *) result));
} else {
- TclVarErrMsg((Tcl_Interp *) iPtr, part1, part2, type, result);
- }
- Tcl_AppendToObj(errorInfo, " trace on \"", -1);
- Tcl_AppendToObj(errorInfo, part1, -1);
- if (part2 != NULL) {
- Tcl_AppendToObj(errorInfo, "(", -1);
- Tcl_AppendToObj(errorInfo, part1, -1);
- Tcl_AppendToObj(errorInfo, ")", -1);
- }
- Tcl_AppendToObj(errorInfo, "\")", -1);
- Tcl_DictObjPut(NULL, options, errorInfoKey, errorInfo);
- Tcl_DecrRefCount(errorInfoKey);
- Tcl_DecrRefCount(errorInfo);
- code = Tcl_SetReturnOptions((Tcl_Interp *) iPtr, options);
+ TclVarErrMsg((Tcl_Interp *) iPtr, part1, part2, verb, result);
+ }
iPtr->flags &= ~(ERR_ALREADY_LOGGED);
Tcl_DiscardInterpState(state);
} else {