summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2012-02-06 17:34:46 (GMT)
committerdgp <dgp@users.sourceforge.net>2012-02-06 17:34:46 (GMT)
commitd96696676a3d3487daa023f4f916533b06d4c25e (patch)
treeb31b139861ec809d5c687061eca9f1761767271d
parent95563b40a7e7c0078ccc04dd78b4058ad655f9fa (diff)
parent5894df49560c27bd2e8a613912674b7f6392ae84 (diff)
downloadtcl-d96696676a3d3487daa023f4f916533b06d4c25e.zip
tcl-d96696676a3d3487daa023f4f916533b06d4c25e.tar.gz
tcl-d96696676a3d3487daa023f4f916533b06d4c25e.tar.bz2
3485022 TclCompileEnsemble() avoid compile when exec traces set.
-rw-r--r--ChangeLog5
-rw-r--r--generic/tclCompCmds.c3
-rw-r--r--tests/trace.test28
3 files changed, 35 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index ecd7b7c..a14821a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2012-02-06 Don Porter <dgp@users.sourceforge.net>
+
+ * generic/tclCompCmds.c: [Bug 3485022] TclCompileEnsemble() avoid
+ * tests/trace.test: compile when exec traces set.
+
2012-02-06 Miguel Sofer <msofer@users.sf.net>
* generic/tclTrace.c: Fix for [Bug 3484621]: insure that
diff --git a/generic/tclCompCmds.c b/generic/tclCompCmds.c
index f2d1bfb..76181ee 100644
--- a/generic/tclCompCmds.c
+++ b/generic/tclCompCmds.c
@@ -6325,7 +6325,8 @@ TclCompileEnsemble(
Tcl_IncrRefCount(targetCmdObj);
cmdPtr = (Command *) Tcl_GetCommandFromObj(interp, targetCmdObj);
TclDecrRefCount(targetCmdObj);
- if (cmdPtr == NULL || cmdPtr->compileProc == NULL) {
+ if (cmdPtr == NULL || cmdPtr->compileProc == NULL
+ || cmdPtr->flags & CMD_HAS_EXEC_TRACES) {
/*
* Maps to an undefined command or a command without a compiler.
* Cannot compile.
diff --git a/tests/trace.test b/tests/trace.test
index 3297258..b1202b8 100644
--- a/tests/trace.test
+++ b/tests/trace.test
@@ -2591,8 +2591,36 @@ test trace-39 {bug #3484621: tracing Bc'ed commands} -setup {
rename foo {}
} -result {3 | 0 1 1}
+test trace-39.1 {bug #3485022: tracing Bc'ed commands} -setup {
+ set ::traceLog 0
+ set ::traceCalls 0
+ set res {}
+ proc dotrace args {
+ incr ::traceLog
+ }
+ proc foo {} {
+ incr ::traceCalls
+ string equal zip zap
+ }
+} -body {
+ foo
+ lappend res $::traceLog
+ trace add execution ::tcl::string::equal enter dotrace
+ foo
+ lappend res $::traceLog
+
+ trace remove execution tcl::string::equal enter dotrace
+ foo
+ lappend res $::traceLog
+ list $::traceCalls | {*}$res
+} -cleanup {
+ unset ::traceLog ::traceCalls res
+ rename dotrace {}
+ rename foo {}
+} -result {3 | 0 1 1}
+
# Delete procedures when done, so we don't clash with other tests
# (e.g. foobar will clash with 'unknown' tests).
catch {rename foobar {}}