diff options
author | dgp <dgp@users.sourceforge.net> | 2016-10-13 16:43:05 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2016-10-13 16:43:05 (GMT) |
commit | dca9bb39489c9c228b3c1ccc6019e3cee3699c7a (patch) | |
tree | a65bf5c82a8f52d06cb1f4738862562c01a71f3c | |
parent | 61df5f46580699c45d9263e3e98a0cf3f2006672 (diff) | |
download | tcl-dca9bb39489c9c228b3c1ccc6019e3cee3699c7a.zip tcl-dca9bb39489c9c228b3c1ccc6019e3cee3699c7a.tar.gz tcl-dca9bb39489c9c228b3c1ccc6019e3cee3699c7a.tar.bz2 |
Stop invading the String internals to work around a bug. Fix it instead.
-rw-r--r-- | generic/tclExecute.c | 13 | ||||
-rw-r--r-- | generic/tclStringObj.c | 10 |
2 files changed, 10 insertions, 13 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c index cd27f6b..56e3f72 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -19,7 +19,6 @@ #include "tclCompile.h" #include "tclOOInt.h" #include "tommath.h" -#include "tclStringRep.h" #include <math.h> #include <assert.h> @@ -5744,16 +5743,6 @@ TEBCresume( if (length3 - 1 == toIdx - fromIdx) { unsigned char *bytes1, *bytes2; - /* - * Flush the info in the string internal rep that refers to the - * about-to-be-invalidated UTF-8 rep. This indicates that a new - * buffer needs to be allocated, and assumes that the value is - * already of tclStringTypePtr type, which should be true provided - * we call it after Tcl_GetUnicodeFromObj. - */ -#define MarkStringInternalRepForFlush(objPtr) \ - (GET_STRING(objPtr)->allocated = 0) - if (Tcl_IsShared(valuePtr)) { objResultPtr = Tcl_DuplicateObj(valuePtr); if (TclIsPureByteArray(objResultPtr) @@ -5766,7 +5755,6 @@ TEBCresume( ustring2 = Tcl_GetUnicodeFromObj(value3Ptr, NULL); memcpy(ustring1 + fromIdx, ustring2, length3 * sizeof(Tcl_UniChar)); - MarkStringInternalRepForFlush(objResultPtr); } Tcl_InvalidateStringRep(objResultPtr); TclDecrRefCount(value3Ptr); @@ -5783,7 +5771,6 @@ TEBCresume( ustring2 = Tcl_GetUnicodeFromObj(value3Ptr, NULL); memcpy(ustring1 + fromIdx, ustring2, length3 * sizeof(Tcl_UniChar)); - MarkStringInternalRepForFlush(valuePtr); } Tcl_InvalidateStringRep(valuePtr); TclDecrRefCount(value3Ptr); diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c index 11a57e9..60b08ae 100644 --- a/generic/tclStringObj.c +++ b/generic/tclStringObj.c @@ -3025,6 +3025,16 @@ UpdateStringOfString( { String *stringPtr = GET_STRING(objPtr); + /* + * This routine is only called when we need to generate the + * string rep objPtr->bytes because it does not exist -- it is NULL. + * In that circumstance, any lingering claim about the size of + * memory pointed to by that NULL pointer is clearly bogus, and + * needs a reset. + */ + + stringPtr->allocated = 0; + if (stringPtr->numChars == 0) { TclInitStringRep(objPtr, tclEmptyStringRep, 0); } else { |