diff options
| author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2025-05-26 12:59:04 (GMT) |
|---|---|---|
| committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2025-05-26 12:59:04 (GMT) |
| commit | 05271f5f1347de19b568daa4ac49eccca923ca96 (patch) | |
| tree | 57b76e599dd2d588c440328588d069ecb33889f2 /generic/tclDictObj.c | |
| parent | 31df7569748f126a4cc0e88854b1019531b5073e (diff) | |
| parent | c21ec96ab359f5f26f51e1103bb3671e240be592 (diff) | |
| download | tcl-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.c | 29 |
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; |
