diff options
| author | apnadkarni <apnmbx-wits@yahoo.com> | 2023-05-15 20:23:05 (GMT) |
|---|---|---|
| committer | apnadkarni <apnmbx-wits@yahoo.com> | 2023-05-15 20:23:05 (GMT) |
| commit | 02563b1911feda87ad86d89bb18855a930ba178e (patch) | |
| tree | ad41d26f77462ffc31dfa0c7d62cb3aedf60949b | |
| parent | 363a6cc4cdaa5d5e46cfe0efb2d195c2be317435 (diff) | |
| download | tcl-02563b1911feda87ad86d89bb18855a930ba178e.zip tcl-02563b1911feda87ad86d89bb18855a930ba178e.tar.gz tcl-02563b1911feda87ad86d89bb18855a930ba178e.tar.bz2 | |
Refactor allocation in Tcl_DStringAppendElement
| -rw-r--r-- | generic/tclUtil.c | 47 |
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; } |
