diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2012-02-09 15:28:26 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2012-02-09 15:28:26 (GMT) |
commit | cd02dd95be672a172c811469fc845123dc936477 (patch) | |
tree | 57aa43bea3e144a6b8f7550a8bd5ee0f8bf549c0 /generic | |
parent | 57d8599f1d1287253eaa593819ffda5a2a296c3b (diff) | |
parent | 585e9d3a4bed8f40ed559193675115a240552c2d (diff) | |
download | tcl-cd02dd95be672a172c811469fc845123dc936477.zip tcl-cd02dd95be672a172c811469fc845123dc936477.tar.gz tcl-cd02dd95be672a172c811469fc845123dc936477.tar.bz2 |
merge trunk
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclEnsemble.c | 5 | ||||
-rw-r--r-- | generic/tclStringObj.c | 4 | ||||
-rw-r--r-- | generic/tclTrace.c | 19 |
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++; + } } } |