diff options
| -rwxr-xr-x | generic/tclArithSeries.c | 2 | ||||
| -rw-r--r-- | generic/tclCmdAH.c | 2 | ||||
| -rw-r--r-- | generic/tclCmdIL.c | 5 | ||||
| -rw-r--r-- | generic/tclDate.c | 3 | ||||
| -rw-r--r-- | generic/tclGetDate.y | 3 | ||||
| -rw-r--r-- | generic/tclInt.h | 23 | ||||
| -rw-r--r-- | generic/tclInterp.c | 2 | ||||
| -rw-r--r-- | generic/tclNamesp.c | 8 | ||||
| -rw-r--r-- | generic/tclOOCall.c | 4 | ||||
| -rw-r--r-- | generic/tclOODefineCmds.c | 8 | ||||
| -rw-r--r-- | generic/tclOOInfo.c | 4 | ||||
| -rw-r--r-- | generic/tclObj.c | 25 | ||||
| -rw-r--r-- | generic/tclPathObj.c | 2 | ||||
| -rw-r--r-- | generic/tclProcess.c | 5 | ||||
| -rw-r--r-- | generic/tclScan.c | 4 | ||||
| -rw-r--r-- | generic/tclStringObj.c | 12 | ||||
| -rw-r--r-- | generic/tclZipfs.c | 2 | ||||
| -rw-r--r-- | unix/tclUnixChan.c | 2 | ||||
| -rw-r--r-- | unix/tclUnixFile.c | 27 | ||||
| -rw-r--r-- | win/tclWinChan.c | 2 |
20 files changed, 94 insertions, 51 deletions
diff --git a/generic/tclArithSeries.c b/generic/tclArithSeries.c index 632943a..d0084af 100755 --- a/generic/tclArithSeries.c +++ b/generic/tclArithSeries.c @@ -306,7 +306,7 @@ TclNewArithSeriesObj( dstep = step; } if (dstep == 0) { - *arithSeriesObj = Tcl_NewObj(); + TclNewObj(*arithSeriesObj); return TCL_OK; } } diff --git a/generic/tclCmdAH.c b/generic/tclCmdAH.c index 59b5ee0..fbc6183 100644 --- a/generic/tclCmdAH.c +++ b/generic/tclCmdAH.c @@ -2463,7 +2463,7 @@ StoreStatData( unsigned short mode; if (varName == NULL) { - result = Tcl_NewObj(); + TclNewObj(result); Tcl_IncrRefCount(result); #define DOBJPUT(key, objValue) \ Tcl_DictObjPut(NULL, result, \ diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c index 5379871..b89051c 100644 --- a/generic/tclCmdIL.c +++ b/generic/tclCmdIL.c @@ -3989,7 +3989,7 @@ Tcl_LsearchObjCmd( * default... */ - Tcl_SetObjResult(interp, Tcl_NewObj()); + Tcl_ResetResult(interp); } else { if (returnSubindices) { Tcl_SetObjResult(interp, SelectObjFromSublist(listv[i+groupOffset], @@ -4767,7 +4767,8 @@ Tcl_LsortObjCmd( sortInfo.resultCode = TCL_ERROR; goto done; } - Tcl_ListObjAppendElement(interp, newCommandPtr, Tcl_NewObj()); + TclNewObj(newObjPtr); + Tcl_ListObjAppendElement(interp, newCommandPtr, newObjPtr); sortInfo.compareCmdPtr = newCommandPtr; } diff --git a/generic/tclDate.c b/generic/tclDate.c index 3bdbdb2..674f4a0 100644 --- a/generic/tclDate.c +++ b/generic/tclDate.c @@ -2859,7 +2859,8 @@ TclClockOldscanObjCmd( Tcl_ListObjAppendElement(interp, result, Tcl_NewIntObj((int) ToSeconds(yyHour, yyMinutes, yySeconds, (MERIDIAN)yyMeridian))); } else { - Tcl_ListObjAppendElement(interp, result, Tcl_NewObj()); + TclNewObj(resultElement); + Tcl_ListObjAppendElement(interp, result, resultElement); } TclNewObj(resultElement); diff --git a/generic/tclGetDate.y b/generic/tclGetDate.y index 08c0193..13daef2 100644 --- a/generic/tclGetDate.y +++ b/generic/tclGetDate.y @@ -1075,7 +1075,8 @@ TclClockOldscanObjCmd( Tcl_ListObjAppendElement(interp, result, Tcl_NewIntObj((int) ToSeconds(yyHour, yyMinutes, yySeconds, (MERIDIAN)yyMeridian))); } else { - Tcl_ListObjAppendElement(interp, result, Tcl_NewObj()); + TclNewObj(resultElement); + Tcl_ListObjAppendElement(interp, result, resultElement); } TclNewObj(resultElement); diff --git a/generic/tclInt.h b/generic/tclInt.h index e2c0bde..d40bbe5 100644 --- a/generic/tclInt.h +++ b/generic/tclInt.h @@ -4475,7 +4475,7 @@ MODULE_SCOPE void TclDbInitNewObj(Tcl_Obj *objPtr, const char *file, /* *---------------------------------------------------------------- - * Macro used by the Tcl core to set a Tcl_Obj's string representation to a + * Macros used by the Tcl core to set a Tcl_Obj's string representation to a * copy of the "len" bytes starting at "bytePtr". The value of "len" must * not be negative. When "len" is 0, then it is acceptable to pass * "bytePtr" = NULL. When "len" > 0, "bytePtr" must not be NULL, and it @@ -4488,17 +4488,22 @@ MODULE_SCOPE void TclDbInitNewObj(Tcl_Obj *objPtr, const char *file, * Because "len" is referenced multiple times, take care that it is an * expression with the same value each use. * - * The ANSI C "prototype" for this macro is: + * The ANSI C "prototypes" for these macros are: * + * MODULE_SCOPE void TclInitEmptyStringRep(Tcl_Obj *objPtr); * MODULE_SCOPE void TclInitStringRep(Tcl_Obj *objPtr, char *bytePtr, size_t len); + * MODULE_SCOPE void TclAttemptInitStringRep(Tcl_Obj *objPtr, char *bytePtr, size_t len); * *---------------------------------------------------------------- */ +#define TclInitEmptyStringRep(objPtr) \ + ((objPtr)->length = (((objPtr)->bytes = &tclEmptyString), 0)) + + #define TclInitStringRep(objPtr, bytePtr, len) \ if ((len) == 0) { \ - (objPtr)->bytes = &tclEmptyString; \ - (objPtr)->length = 0; \ + TclInitEmptyStringRep(objPtr); \ } else { \ (objPtr)->bytes = (char *)ckalloc((len) + 1U); \ memcpy((objPtr)->bytes, (bytePtr) ? (bytePtr) : &tclEmptyString, (len)); \ @@ -4506,6 +4511,16 @@ MODULE_SCOPE void TclDbInitNewObj(Tcl_Obj *objPtr, const char *file, (objPtr)->length = (len); \ } +#define TclAttemptInitStringRep(objPtr, bytePtr, len) \ + ((((len) == 0) ? ( \ + TclInitEmptyStringRep(objPtr) \ + ) : ( \ + (objPtr)->bytes = (char *)attemptckalloc((len) + 1U), \ + memcpy((objPtr)->bytes, (bytePtr) ? (bytePtr) : &tclEmptyString, (len)), \ + (objPtr)->bytes[len] = '\0', \ + (objPtr)->length = (len) \ + )), (objPtr)->bytes) + /* *---------------------------------------------------------------- * Macro used by the Tcl core to get the string representation's byte array diff --git a/generic/tclInterp.c b/generic/tclInterp.c index cacf87a..a75ac05 100644 --- a/generic/tclInterp.c +++ b/generic/tclInterp.c @@ -2275,7 +2275,7 @@ Tcl_GetInterpPath( InterpInfo *iiPtr; if (targetInterp == interp) { - Tcl_SetObjResult(interp, Tcl_NewObj()); + Tcl_ResetResult(interp); return TCL_OK; } if (targetInterp == NULL) { diff --git a/generic/tclNamesp.c b/generic/tclNamesp.c index 2531421..b97d16f 100644 --- a/generic/tclNamesp.c +++ b/generic/tclNamesp.c @@ -544,8 +544,10 @@ ErrorCodeRead( return NULL; } if (NULL == Tcl_ObjGetVar2(interp, iPtr->ecVar, NULL, TCL_GLOBAL_ONLY)) { + Tcl_Obj *objPtr; + TclNewObj(objPtr); Tcl_ObjSetVar2(interp, iPtr->ecVar, NULL, - Tcl_NewObj(), TCL_GLOBAL_ONLY); + objPtr, TCL_GLOBAL_ONLY); } return NULL; } @@ -618,8 +620,10 @@ ErrorInfoRead( return NULL; } if (NULL == Tcl_ObjGetVar2(interp, iPtr->eiVar, NULL, TCL_GLOBAL_ONLY)) { + Tcl_Obj *objPtr; + TclNewObj(objPtr); Tcl_ObjSetVar2(interp, iPtr->eiVar, NULL, - Tcl_NewObj(), TCL_GLOBAL_ONLY); + objPtr, TCL_GLOBAL_ONLY); } return NULL; } diff --git a/generic/tclOOCall.c b/generic/tclOOCall.c index 57f8860..52de1b8 100644 --- a/generic/tclOOCall.c +++ b/generic/tclOOCall.c @@ -2251,7 +2251,7 @@ TclOOGetAllClassProperties( *allocated = 1; Tcl_InitObjHashTable(&hashTable); FindClassProps(clsPtr, writable, &hashTable); - result = Tcl_NewObj(); + TclNewObj(result); FOREACH_HASH(propName, dummy, &hashTable) { Tcl_ListObjAppendElement(NULL, result, propName); } @@ -2333,7 +2333,7 @@ TclOOGetAllObjectProperties( *allocated = 1; Tcl_InitObjHashTable(&hashTable); FindObjectProps(oPtr, writable, &hashTable); - result = Tcl_NewObj(); + TclNewObj(result); FOREACH_HASH(propName, dummy, &hashTable) { Tcl_ListObjAppendElement(NULL, result, propName); } diff --git a/generic/tclOODefineCmds.c b/generic/tclOODefineCmds.c index 77d6163..490fc0e 100644 --- a/generic/tclOODefineCmds.c +++ b/generic/tclOODefineCmds.c @@ -3189,7 +3189,7 @@ ClassRPropsGet( return TCL_ERROR; } - resultObj = Tcl_NewObj(); + TclNewObj(resultObj); FOREACH(propNameObj, oPtr->classPtr->properties.readable) { Tcl_ListObjAppendElement(NULL, resultObj, propNameObj); } @@ -3254,7 +3254,7 @@ ObjRPropsGet( return TCL_ERROR; } - resultObj = Tcl_NewObj(); + TclNewObj(resultObj); FOREACH(propNameObj, oPtr->properties.readable) { Tcl_ListObjAppendElement(NULL, resultObj, propNameObj); } @@ -3386,7 +3386,7 @@ ClassWPropsGet( return TCL_ERROR; } - resultObj = Tcl_NewObj(); + TclNewObj(resultObj); FOREACH(propNameObj, oPtr->classPtr->properties.writable) { Tcl_ListObjAppendElement(NULL, resultObj, propNameObj); } @@ -3451,7 +3451,7 @@ ObjWPropsGet( return TCL_ERROR; } - resultObj = Tcl_NewObj(); + TclNewObj(resultObj); FOREACH(propNameObj, oPtr->properties.writable) { Tcl_ListObjAppendElement(NULL, resultObj, propNameObj); } diff --git a/generic/tclOOInfo.c b/generic/tclOOInfo.c index b87877f..e0594e5 100644 --- a/generic/tclOOInfo.c +++ b/generic/tclOOInfo.c @@ -1784,7 +1784,7 @@ InfoClassPropCmd( SortPropList(result); } } else { - result = Tcl_NewObj(); + TclNewObj(result); if (writable) { FOREACH(propObj, clsPtr->properties.writable) { Tcl_ListObjAppendElement(NULL, result, propObj); @@ -1847,7 +1847,7 @@ InfoObjectPropCmd( SortPropList(result); } } else { - result = Tcl_NewObj(); + TclNewObj(result); if (writable) { FOREACH(propObj, oPtr->properties.writable) { Tcl_ListObjAppendElement(NULL, result, propObj); diff --git a/generic/tclObj.c b/generic/tclObj.c index 8cef4f4..b02279e 100644 --- a/generic/tclObj.c +++ b/generic/tclObj.c @@ -1070,7 +1070,7 @@ TclDbInitNewObj( { objPtr->refCount = 0; objPtr->typePtr = NULL; - TclInitStringRep(objPtr, NULL, 0); + TclInitEmptyStringRep(objPtr); #if TCL_THREADS /* @@ -1212,7 +1212,9 @@ Tcl_DbNewObj( TCL_UNUSED(const char *) /*file*/, TCL_UNUSED(int) /*line*/) { - return Tcl_NewObj(); + Tcl_Obj *objPtr; + TclNewObj(objPtr); + return objPtr; } #endif /* TCL_MEM_DEBUG */ @@ -1577,7 +1579,7 @@ TclObjBeingDeleted( const Tcl_ObjType *typePtr = (objPtr)->typePtr; \ const char *bytes = (objPtr)->bytes; \ if (bytes) { \ - TclInitStringRep((dupPtr), bytes, (objPtr)->length); \ + (void)TclAttemptInitStringRep((dupPtr), bytes, (objPtr)->length); \ } else { \ (dupPtr)->bytes = NULL; \ } \ @@ -1606,7 +1608,7 @@ Tcl_DuplicateObj( /* *---------------------------------------------------------------------- * - * Tcl_DuplicatePureObj -- + * TclDuplicatePureObj -- * * Duplicates a Tcl_Obj and converts the internal representation of the * duplicate to the given type, changing neither the 'bytes' field @@ -1673,7 +1675,14 @@ int SetDuplicatePureObj( || typePtr == &tclUniCharStringType ) ) { - TclInitStringRep(dupPtr, bytes, objPtr->length); + if (!TclAttemptInitStringRep(dupPtr, bytes, objPtr->length)) { + if (interp) { + Tcl_SetObjResult(interp, Tcl_NewStringObj( + "insufficient memory to initialize string", -1)); + Tcl_SetErrorCode(interp, "TCL", "MEMORY", NULL); + } + status = TCL_ERROR; + } } return status; } @@ -1931,7 +1940,7 @@ Tcl_InitStringRep( if (objPtr->bytes == NULL) { /* Start with no string rep */ if (numBytes == 0) { - TclInitStringRep(objPtr, NULL, 0); + TclInitEmptyStringRep(objPtr); return objPtr->bytes; } else { objPtr->bytes = (char *)attemptckalloc(numBytes + 1); @@ -1958,7 +1967,7 @@ Tcl_InitStringRep( /* Start with non-empty string rep (allocated) */ if (numBytes == 0) { ckfree(objPtr->bytes); - TclInitStringRep(objPtr, NULL, 0); + TclInitEmptyStringRep(objPtr); return objPtr->bytes; } else { objPtr->bytes = (char *)attemptckrealloc(objPtr->bytes, @@ -3904,7 +3913,7 @@ GetBignumFromObj( * bignum values are converted to empty string. */ if (objPtr->bytes == NULL) { - TclInitStringRep(objPtr, NULL, 0); + TclInitEmptyStringRep(objPtr); } } return TCL_OK; diff --git a/generic/tclPathObj.c b/generic/tclPathObj.c index ce9db2a..e1702f8 100644 --- a/generic/tclPathObj.c +++ b/generic/tclPathObj.c @@ -2485,7 +2485,7 @@ UpdateStringOfFsPath( /* Steal copy's string rep */ pathPtr->bytes = TclGetStringFromObj(copy, &cwdLen); pathPtr->length = cwdLen; - TclInitStringRep(copy, NULL, 0); + TclInitEmptyStringRep(copy); TclDecrRefCount(copy); } diff --git a/generic/tclProcess.c b/generic/tclProcess.c index 543d066..d55a1fd 100644 --- a/generic/tclProcess.c +++ b/generic/tclProcess.c @@ -355,8 +355,9 @@ BuildProcessStatusObj( /* * Process still running, return empty obj. */ - - return Tcl_NewObj(); + Tcl_Obj *obj; + TclNewObj(obj); + return obj; } if (info->status == TCL_PROCESS_EXITED && info->code == 0) { /* diff --git a/generic/tclScan.c b/generic/tclScan.c index f332d24..3749c12 100644 --- a/generic/tclScan.c +++ b/generic/tclScan.c @@ -1078,12 +1078,14 @@ Tcl_ScanObjCmd( Tcl_ListObjAppendElement(NULL, objPtr, objs[i]); Tcl_DecrRefCount(objs[i]); } else { + Tcl_Obj *obj; /* * More %-specifiers than matching chars, so we just spit out * empty strings for these. */ - Tcl_ListObjAppendElement(NULL, objPtr, Tcl_NewObj()); + TclNewObj(obj); + Tcl_ListObjAppendElement(NULL, objPtr, obj); } } } diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c index 0e47487..6450317 100644 --- a/generic/tclStringObj.c +++ b/generic/tclStringObj.c @@ -3517,8 +3517,14 @@ TclStringCat( /* assert ( objc >= 0 ) */ if (objc <= 1) { - /* Negative (shouldn't be), one or no objects; return first or empty */ - return objc == 1 ? objv[0] : Tcl_NewObj(); + if (objc != 1) { + /* Negative (shouldn't be) no objects; return empty */ + Tcl_Obj *obj; + TclNewObj(obj); + return obj; + } + /* One object; return first */ + return objv[0]; } /* assert ( objc >= 2 ) */ @@ -4816,7 +4822,7 @@ UpdateStringOfString( stringPtr->allocated = 0; if (stringPtr->numChars == 0) { - TclInitStringRep(objPtr, NULL, 0); + TclInitEmptyStringRep(objPtr); } else { (void) ExtendStringRepWithUnicode(objPtr, stringPtr->unicode, stringPtr->numChars); diff --git a/generic/tclZipfs.c b/generic/tclZipfs.c index 9f6d8aa..3a63b18 100644 --- a/generic/tclZipfs.c +++ b/generic/tclZipfs.c @@ -1917,7 +1917,7 @@ ListMountPoints( return (ZipFS.zipHash.numEntries ? TCL_OK : TCL_BREAK); } - resultList = Tcl_NewObj(); + TclNewObj(resultList); for (hPtr = Tcl_FirstHashEntry(&ZipFS.zipHash, &search); hPtr; hPtr = Tcl_NextHashEntry(&search)) { zf = (ZipFile *) Tcl_GetHashValue(hPtr); diff --git a/unix/tclUnixChan.c b/unix/tclUnixChan.c index f66e3c4..8785ff7 100644 --- a/unix/tclUnixChan.c +++ b/unix/tclUnixChan.c @@ -687,7 +687,7 @@ StatOpenFile( * duplicate!) */ - dictObj = Tcl_NewObj(); + TclNewObj(dictObj); #define STORE_ELEM(name, value) StoreElementInDict(dictObj, name, value) STORE_ELEM("dev", Tcl_NewWideIntObj((long) statBuf.st_dev)); diff --git a/unix/tclUnixFile.c b/unix/tclUnixFile.c index aecdb3b..b96c1dd 100644 --- a/unix/tclUnixFile.c +++ b/unix/tclUnixFile.c @@ -138,7 +138,9 @@ TclpFindExecutable( p++; } } - TclSetObjNameOfExecutable(Tcl_NewObj(), NULL); + Tcl_Obj *obj; + TclNewObj(obj); + TclSetObjNameOfExecutable(obj, NULL); goto done; /* @@ -161,7 +163,9 @@ TclpFindExecutable( } if (TclpGetCwd(NULL, &cwd) == NULL) { - TclSetObjNameOfExecutable(Tcl_NewObj(), NULL); + Tcl_Obj *obj; + TclNewObj(obj); + TclSetObjNameOfExecutable(obj, NULL); goto done; } @@ -604,8 +608,7 @@ TclpGetUserHome( if (pwPtr == NULL) { return NULL; } - Tcl_ExternalToUtfDString(NULL, pwPtr->pw_dir, TCL_INDEX_NONE, bufferPtr); - return Tcl_DStringValue(bufferPtr); + return Tcl_ExternalToUtfDString(NULL, pwPtr->pw_dir, TCL_INDEX_NONE, bufferPtr); } /* @@ -727,7 +730,7 @@ TclpGetNativeCwd( #endif /* USEGETWD */ if ((clientData == NULL) || strcmp(buffer, (const char *) clientData)) { - char *newCd = (char*)ckalloc(strlen(buffer) + 1); + char *newCd = (char *)ckalloc(strlen(buffer) + 1); strcpy(newCd, buffer); return newCd; @@ -814,7 +817,7 @@ TclpReadlink( { #ifndef DJGPP char link[MAXPATHLEN]; - int length; + Tcl_Size length; const char *native; Tcl_DString ds; @@ -947,6 +950,7 @@ TclpObjLink( if (linkAction & TCL_CREATE_SYMBOLIC_LINK) { Tcl_DString ds; Tcl_Obj *transPtr; + Tcl_Size length; /* * Now we don't want to link to the absolute, normalized path. @@ -958,8 +962,8 @@ TclpObjLink( if (transPtr == NULL) { return NULL; } - target = TclGetString(transPtr); - target = Tcl_UtfToExternalDString(NULL, target, transPtr->length, &ds); + target = TclGetStringFromObj(transPtr, &length); + target = Tcl_UtfToExternalDString(NULL, target, length, &ds); Tcl_DecrRefCount(transPtr); if (symlink(target, src) != 0) { @@ -979,7 +983,7 @@ TclpObjLink( Tcl_Obj *linkPtr = NULL; char link[MAXPATHLEN]; - int length; + Tcl_Size length; Tcl_DString ds; Tcl_Obj *transPtr; @@ -1087,7 +1091,7 @@ TclNativeCreateNativeRep( const char *str; Tcl_DString ds; Tcl_Obj *validPathPtr; - size_t len; + Tcl_Size len; if (TclFSCwdIsNative()) { /* @@ -1112,8 +1116,7 @@ TclNativeCreateNativeRep( Tcl_IncrRefCount(validPathPtr); } - str = TclGetString(validPathPtr); - len = validPathPtr->length; + str = TclGetStringFromObj(validPathPtr, &len); Tcl_UtfToExternalDString(NULL, str, len, &ds); len = Tcl_DStringLength(&ds) + sizeof(char); if (strlen(Tcl_DStringValue(&ds)) < len - sizeof(char)) { diff --git a/win/tclWinChan.c b/win/tclWinChan.c index 0fc7455..6558718 100644 --- a/win/tclWinChan.c +++ b/win/tclWinChan.c @@ -951,7 +951,7 @@ StatOpenFile( * We don't construct a Tcl_StatBuf; we're using the info immediately. */ - dictObj = Tcl_NewObj(); + TclNewObj(dictObj); #define STORE_ELEM(name, value) StoreElementInDict(dictObj, name, value) STORE_ELEM("dev", Tcl_NewWideIntObj((long) dev)); |
