summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorapnadkarni <apnmbx-wits@yahoo.com>2023-05-15 20:23:05 (GMT)
committerapnadkarni <apnmbx-wits@yahoo.com>2023-05-15 20:23:05 (GMT)
commit02563b1911feda87ad86d89bb18855a930ba178e (patch)
treead41d26f77462ffc31dfa0c7d62cb3aedf60949b
parent363a6cc4cdaa5d5e46cfe0efb2d195c2be317435 (diff)
downloadtcl-02563b1911feda87ad86d89bb18855a930ba178e.zip
tcl-02563b1911feda87ad86d89bb18855a930ba178e.tar.gz
tcl-02563b1911feda87ad86d89bb18855a930ba178e.tar.bz2
Refactor allocation in Tcl_DStringAppendElement
-rw-r--r--generic/tclUtil.c47
1 files changed, 33 insertions, 14 deletions
diff --git a/generic/tclUtil.c b/generic/tclUtil.c
index 6ce783f..455b2a9 100644
--- a/generic/tclUtil.c
+++ b/generic/tclUtil.c
@@ -2613,7 +2613,6 @@ Tcl_DStringAppend(
if (newSize > dsPtr->spaceAvl) {
- /* Current allocation not enough */
char *newString;
dsPtr->spaceAvl =
TclUpsizeAlloc(dsPtr->spaceAvl, newSize, TCL_SIZE_MAX);
@@ -2626,18 +2625,18 @@ Tcl_DStringAppend(
}
if (newString == NULL) {
dsPtr->spaceAvl = newSize;
- newString = Tcl_Alloc(dsPtr->spaceAvl);
+ newString = (char *) Tcl_Alloc(dsPtr->spaceAvl);
}
memcpy(newString, dsPtr->string, dsPtr->length);
dsPtr->string = newString;
} else {
- Tcl_Size index = -1;
+ Tcl_Size offset = -1;
/* See [16896d49fd] */
if (bytes >= dsPtr->string
&& bytes <= dsPtr->string + dsPtr->length) {
/* Source string is within this DString. Note offset */
- index = bytes - dsPtr->string;
+ offset = bytes - dsPtr->string;
}
while (dsPtr->spaceAvl > newSize) {
@@ -2648,12 +2647,12 @@ Tcl_DStringAppend(
}
if (newString == NULL) {
dsPtr->spaceAvl = newSize;
- newString = Tcl_Realloc(dsPtr->string, dsPtr->spaceAvl);
+ newString = (char *) Tcl_Realloc(dsPtr->string, dsPtr->spaceAvl);
}
dsPtr->string = newString;
- if (index >= 0) {
- bytes = dsPtr->string + index;
+ if (offset >= 0) {
+ bytes = dsPtr->string + offset;
}
}
}
@@ -2765,12 +2764,22 @@ Tcl_DStringAppendElement(
* memcpy, not strcpy, to copy the string to a larger buffer, since there
* may be embedded NULLs in the string in some cases.
*/
-
- if (newSize >= dsPtr->spaceAvl) {
- dsPtr->spaceAvl = newSize * 2;
+ newSize += 1; /* For terminating nul */
+ if (newSize > dsPtr->spaceAvl) {
+ char *newString;
+ dsPtr->spaceAvl =
+ TclUpsizeAlloc(dsPtr->spaceAvl, newSize, TCL_SIZE_MAX);
if (dsPtr->string == dsPtr->staticSpace) {
- char *newString = (char *)Tcl_Alloc(dsPtr->spaceAvl);
-
+ while (dsPtr->spaceAvl > newSize) {
+ newString = (char *)Tcl_AttemptAlloc(dsPtr->spaceAvl);
+ if (newString)
+ break;
+ dsPtr->spaceAvl = TclUpsizeRetry(newSize, dsPtr->spaceAvl);
+ }
+ if (newString == NULL) {
+ dsPtr->spaceAvl = newSize;
+ newString = (char *) Tcl_Alloc(dsPtr->spaceAvl);
+ }
memcpy(newString, dsPtr->string, dsPtr->length);
dsPtr->string = newString;
} else {
@@ -2779,11 +2788,21 @@ Tcl_DStringAppendElement(
/* See [16896d49fd] */
if (element >= dsPtr->string
&& element <= dsPtr->string + dsPtr->length) {
+ /* Source string is within this DString. Note offset */
offset = element - dsPtr->string;
}
+ while (dsPtr->spaceAvl > newSize) {
+ newString = (char *)Tcl_AttemptRealloc(dsPtr->string, dsPtr->spaceAvl);
+ if (newString)
+ break;
+ dsPtr->spaceAvl = TclUpsizeRetry(newSize, dsPtr->spaceAvl);
+ }
+ if (newString == NULL) {
+ dsPtr->spaceAvl = newSize;
+ newString = (char *) Tcl_Realloc(dsPtr->string, dsPtr->spaceAvl);
+ }
- dsPtr->string = (char *)Tcl_Realloc(dsPtr->string, dsPtr->spaceAvl);
-
+ dsPtr->string = newString;
if (offset >= 0) {
element = dsPtr->string + offset;
}