summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xgeneric/tclArithSeries.c2
-rw-r--r--generic/tclCmdAH.c2
-rw-r--r--generic/tclCmdIL.c5
-rw-r--r--generic/tclDate.c3
-rw-r--r--generic/tclGetDate.y3
-rw-r--r--generic/tclInt.h23
-rw-r--r--generic/tclInterp.c2
-rw-r--r--generic/tclNamesp.c8
-rw-r--r--generic/tclOOCall.c4
-rw-r--r--generic/tclOODefineCmds.c8
-rw-r--r--generic/tclOOInfo.c4
-rw-r--r--generic/tclObj.c25
-rw-r--r--generic/tclPathObj.c2
-rw-r--r--generic/tclProcess.c5
-rw-r--r--generic/tclScan.c4
-rw-r--r--generic/tclStringObj.c12
-rw-r--r--generic/tclZipfs.c2
-rw-r--r--unix/tclUnixChan.c2
-rw-r--r--unix/tclUnixFile.c27
-rw-r--r--win/tclWinChan.c2
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));