summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2012-02-09 15:28:26 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2012-02-09 15:28:26 (GMT)
commitcd02dd95be672a172c811469fc845123dc936477 (patch)
tree57aa43bea3e144a6b8f7550a8bd5ee0f8bf549c0 /generic
parent57d8599f1d1287253eaa593819ffda5a2a296c3b (diff)
parent585e9d3a4bed8f40ed559193675115a240552c2d (diff)
downloadtcl-cd02dd95be672a172c811469fc845123dc936477.zip
tcl-cd02dd95be672a172c811469fc845123dc936477.tar.gz
tcl-cd02dd95be672a172c811469fc845123dc936477.tar.bz2
merge trunk
Diffstat (limited to 'generic')
-rw-r--r--generic/tclEnsemble.c5
-rw-r--r--generic/tclStringObj.c4
-rw-r--r--generic/tclTrace.c19
3 files changed, 25 insertions, 3 deletions
diff --git a/generic/tclEnsemble.c b/generic/tclEnsemble.c
index 1c7b41d..1283446 100644
--- a/generic/tclEnsemble.c
+++ b/generic/tclEnsemble.c
@@ -2889,7 +2889,10 @@ 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->nsPtr->flags & NS_SUPPRESS_COMPILATION
+ || cmdPtr->flags * CMD_HAS_EXEC_TRACES
+ || ((Interp *)interp)->flags & DONT_COMPILE_CMDS_INLINE) {
/*
* Maps to an undefined command or a command without a compiler.
* Cannot compile.
diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c
index d721c47..04cf4ee 100644
--- a/generic/tclStringObj.c
+++ b/generic/tclStringObj.c
@@ -1437,7 +1437,7 @@ AppendUnicodeToUnicodeRep(
* trailing null.
*/
- memcpy(stringPtr->unicode + stringPtr->numChars, unicode,
+ memmove(stringPtr->unicode + stringPtr->numChars, unicode,
appendNumChars * sizeof(Tcl_UniChar));
stringPtr->unicode[numChars] = 0;
stringPtr->numChars = numChars;
@@ -1605,7 +1605,7 @@ AppendUtfToUtfRep(
stringPtr->numChars = -1;
stringPtr->hasUnicode = 0;
- memcpy(objPtr->bytes + oldLength, bytes, numBytes);
+ memmove(objPtr->bytes + oldLength, bytes, numBytes);
objPtr->bytes[newLength] = 0;
objPtr->length = newLength;
}
diff --git a/generic/tclTrace.c b/generic/tclTrace.c
index 13359ee..2e38086 100644
--- a/generic/tclTrace.c
+++ b/generic/tclTrace.c
@@ -1124,8 +1124,18 @@ Tcl_TraceCommand(
tracePtr->refCount = 1;
cmdPtr->tracePtr = tracePtr;
if (tracePtr->flags & TCL_TRACE_ANY_EXEC) {
+ /*
+ * Bug 3484621: up the interp's epoch if this is a BC'ed command
+ */
+
+ if ((cmdPtr->compileProc != NULL) && !(cmdPtr->flags & CMD_HAS_EXEC_TRACES)){
+ Interp *iPtr = (Interp *) interp;
+ iPtr->compileEpoch++;
+ }
cmdPtr->flags |= CMD_HAS_EXEC_TRACES;
}
+
+
return TCL_OK;
}
@@ -1228,6 +1238,15 @@ Tcl_UntraceCommand(
*/
cmdPtr->flags &= ~CMD_HAS_EXEC_TRACES;
+
+ /*
+ * Bug 3484621: up the interp's epoch if this is a BC'ed command
+ */
+
+ if (cmdPtr->compileProc != NULL) {
+ Interp *iPtr = (Interp *) interp;
+ iPtr->compileEpoch++;
+ }
}
}