summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2016-10-13 16:43:05 (GMT)
committerdgp <dgp@users.sourceforge.net>2016-10-13 16:43:05 (GMT)
commitdca9bb39489c9c228b3c1ccc6019e3cee3699c7a (patch)
treea65bf5c82a8f52d06cb1f4738862562c01a71f3c
parent61df5f46580699c45d9263e3e98a0cf3f2006672 (diff)
downloadtcl-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.c13
-rw-r--r--generic/tclStringObj.c10
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 {