summaryrefslogtreecommitdiffstats
path: root/generic/tclDictObj.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2025-05-26 12:59:04 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2025-05-26 12:59:04 (GMT)
commit05271f5f1347de19b568daa4ac49eccca923ca96 (patch)
tree57b76e599dd2d588c440328588d069ecb33889f2 /generic/tclDictObj.c
parent31df7569748f126a4cc0e88854b1019531b5073e (diff)
parentc21ec96ab359f5f26f51e1103bb3671e240be592 (diff)
downloadtcl-core-attemptgetstring.zip
tcl-core-attemptgetstring.tar.gz
tcl-core-attemptgetstring.tar.bz2
Add some more Tcl_Attempt* functionscore-attemptgetstring
Diffstat (limited to 'generic/tclDictObj.c')
-rw-r--r--generic/tclDictObj.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/generic/tclDictObj.c b/generic/tclDictObj.c
index ae214d2..0217343 100644
--- a/generic/tclDictObj.c
+++ b/generic/tclDictObj.c
@@ -520,7 +520,17 @@ UpdateStringOfDict(
if (numElems <= LOCAL_SIZE) {
flagPtr = localFlags;
} else {
- flagPtr = (char *)Tcl_Alloc(numElems);
+ flagPtr = (char *)Tcl_AttemptAlloc(numElems);
+ if (!flagPtr) {
+ dictPtr->length = numElems;
+ allocError:
+ /* Allocation error. Just give up. */
+ if (dictPtr->bytes) {
+ Tcl_Free(dictPtr->bytes);
+ dictPtr->bytes = NULL;
+ }
+ return;
+ }
}
for (i=0,cPtr=dict->entryChainHead; i<numElems; i+=2,cPtr=cPtr->nextPtr) {
/*
@@ -530,11 +540,19 @@ UpdateStringOfDict(
flagPtr[i] = ( i ? TCL_DONT_QUOTE_HASH : 0 );
keyPtr = (Tcl_Obj *)Tcl_GetHashKey(&dict->table, &cPtr->entry);
- elem = TclGetStringFromObj(keyPtr, &length);
+ elem = TclAttemptGetStringFromObj(keyPtr, &length);
+ if (!elem) {
+ dictPtr->length = keyPtr->length;
+ goto allocError;
+ }
bytesNeeded += TclScanElement(elem, length, flagPtr+i);
flagPtr[i+1] = TCL_DONT_QUOTE_HASH;
valuePtr = (Tcl_Obj *)Tcl_GetHashValue(&cPtr->entry);
- elem = TclGetStringFromObj(valuePtr, &length);
+ elem = TclAttemptGetStringFromObj(valuePtr, &length);
+ if (!elem) {
+ dictPtr->length = valuePtr->length;
+ goto allocError;
+ }
bytesNeeded += TclScanElement(elem, length, flagPtr+i+1);
}
bytesNeeded += numElems;
@@ -544,7 +562,10 @@ UpdateStringOfDict(
*/
dst = Tcl_InitStringRep(dictPtr, NULL, bytesNeeded - 1);
- TclOOM(dst, bytesNeeded);
+ if (!dst) {
+ dictPtr->length = bytesNeeded;
+ goto allocError;
+ }
for (i=0,cPtr=dict->entryChainHead; i<numElems; i+=2,cPtr=cPtr->nextPtr) {
if (i) {
flagPtr[i] |= TCL_DONT_QUOTE_HASH;