summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2020-09-18 08:33:51 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2020-09-18 08:33:51 (GMT)
commitf0ab6a724c11e0e8083b6152c3968a147507c8b5 (patch)
tree3d17171141c344a068d70df2f3c63bbbca4ca9d8 /generic
parentbe275081a1ef4cf0490a07d2e253ca901d932fe8 (diff)
downloadtcl-f0ab6a724c11e0e8083b6152c3968a147507c8b5.zip
tcl-f0ab6a724c11e0e8083b6152c3968a147507c8b5.tar.gz
tcl-f0ab6a724c11e0e8083b6152c3968a147507c8b5.tar.bz2
New macro TclNewIndexObj() which does the same as TclNewWideIntObjFromSize() but optimized the same way as TclNewIntObj().
Diffstat (limited to 'generic')
-rw-r--r--generic/tclCmdIL.c29
-rw-r--r--generic/tclCmdMZ.c28
-rw-r--r--generic/tclExecute.c4
-rw-r--r--generic/tclInt.h29
-rw-r--r--generic/tclRegexp.c2
-rw-r--r--generic/tclScan.c2
-rw-r--r--generic/tclStringObj.c8
-rw-r--r--generic/tclTest.c8
8 files changed, 63 insertions, 47 deletions
diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c
index 7bad8b5..24e8f39 100644
--- a/generic/tclCmdIL.c
+++ b/generic/tclCmdIL.c
@@ -3518,7 +3518,8 @@ Tcl_LsearchObjCmd(
if (allMatches || inlineReturn) {
Tcl_ResetResult(interp);
} else {
- Tcl_SetObjResult(interp, Tcl_NewWideIntObj(-1));
+ TclNewIndexObj(itemPtr, -1);
+ Tcl_SetObjResult(interp, itemPtr);
}
goto done;
}
@@ -3648,7 +3649,7 @@ Tcl_LsearchObjCmd(
* our first match might not be the first occurrence.
* Consider: 0 0 0 1 1 1 2 2 2
*
- * To maintain consistancy with standard lsearch semantics, we
+ * To maintain consistency with standard lsearch semantics, we
* must find the leftmost occurrence of the pattern in the
* list. Thus we don't just stop searching here. This
* variation means that a search always makes log n
@@ -3806,10 +3807,12 @@ Tcl_LsearchObjCmd(
} else if (returnSubindices) {
int j;
- itemPtr = TclNewWideIntObjFromSize(i+groupOffset);
+ TclNewIndexObj(itemPtr, i+groupOffset);
for (j=0 ; j<sortInfo.indexc ; j++) {
- Tcl_ListObjAppendElement(interp, itemPtr, TclNewWideIntObjFromSize(
- TclIndexDecode(sortInfo.indexv[j], listc)));
+ Tcl_Obj *elObj;
+ size_t elValue = TclIndexDecode(sortInfo.indexv[j], listc);
+ TclNewIndexObj(elObj, elValue);
+ Tcl_ListObjAppendElement(interp, itemPtr, elObj);
}
Tcl_ListObjAppendElement(interp, listPtr, itemPtr);
} else {
@@ -3828,14 +3831,18 @@ Tcl_LsearchObjCmd(
if (returnSubindices) {
int j;
- itemPtr = TclNewWideIntObjFromSize(index+groupOffset);
+ TclNewIndexObj(itemPtr, index+groupOffset);
for (j=0 ; j<sortInfo.indexc ; j++) {
- Tcl_ListObjAppendElement(interp, itemPtr, TclNewWideIntObjFromSize(
- TclIndexDecode(sortInfo.indexv[j], listc)));
+ Tcl_Obj *elObj;
+ size_t elValue = TclIndexDecode(sortInfo.indexv[j], listc);
+ TclNewIndexObj(elObj, elValue);
+ Tcl_ListObjAppendElement(interp, itemPtr, elObj);
}
Tcl_SetObjResult(interp, itemPtr);
} else {
- Tcl_SetObjResult(interp, TclNewWideIntObjFromSize((size_t)index));
+ Tcl_Obj *elObj;
+ TclNewIndexObj(elObj, index);
+ Tcl_SetObjResult(interp, elObj);
}
} else if (index < 0) {
/*
@@ -4421,7 +4428,7 @@ Tcl_LsortObjCmd(
idx = elementPtr->payload.index;
for (j = 0; j < groupSize; j++) {
if (indices) {
- objPtr = TclNewWideIntObjFromSize(idx + j - groupOffset);
+ TclNewIndexObj(objPtr, idx + j - groupOffset);
newArray[i++] = objPtr;
Tcl_IncrRefCount(objPtr);
} else {
@@ -4433,7 +4440,7 @@ Tcl_LsortObjCmd(
}
} else if (indices) {
for (i=0; elementPtr != NULL ; elementPtr = elementPtr->nextPtr) {
- objPtr = TclNewWideIntObjFromSize(elementPtr->payload.index);
+ TclNewIndexObj(objPtr, elementPtr->payload.index);
newArray[i++] = objPtr;
Tcl_IncrRefCount(objPtr);
}
diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c
index 738c6e5..43d8a8e 100644
--- a/generic/tclCmdMZ.c
+++ b/generic/tclCmdMZ.c
@@ -389,8 +389,8 @@ Tcl_RegexpObjCmd(
end = TCL_INDEX_NONE;
}
- objs[0] = TclNewWideIntObjFromSize(start);
- objs[1] = TclNewWideIntObjFromSize(end);
+ TclNewIndexObj(objs[0], start);
+ TclNewIndexObj(objs[1], end);
newPtr = Tcl_NewListObj(2, objs);
} else {
@@ -1909,10 +1909,11 @@ StringIsCmd(
*/
str_is_done:
- if ((result == 0) && (failVarObj != NULL) &&
- Tcl_ObjSetVar2(interp, failVarObj, NULL, TclNewWideIntObjFromSize(failat),
- TCL_LEAVE_ERR_MSG) == NULL) {
- return TCL_ERROR;
+ if ((result == 0) && (failVarObj != NULL)) {
+ TclNewIndexObj(objPtr, failat);
+ if (Tcl_ObjSetVar2(interp, failVarObj, NULL, objPtr, TCL_LEAVE_ERR_MSG) == NULL) {
+ return TCL_ERROR;
+ }
}
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(result));
return TCL_OK;
@@ -2506,6 +2507,7 @@ StringStartCmd(
int ch;
const char *p, *string;
size_t numChars, length, cur, index;
+ Tcl_Obj *obj;
if (objc != 3) {
Tcl_WrongNumArgs(interp, 1, objv, "string index");
@@ -2545,7 +2547,8 @@ StringStartCmd(
cur += 1;
}
}
- Tcl_SetObjResult(interp, TclNewWideIntObjFromSize(cur));
+ TclNewIndexObj(obj, cur);
+ Tcl_SetObjResult(interp, obj);
return TCL_OK;
}
@@ -2576,6 +2579,7 @@ StringEndCmd(
int ch;
const char *p, *end, *string;
size_t length, numChars, cur, index;
+ Tcl_Obj *obj;
if (objc != 3) {
Tcl_WrongNumArgs(interp, 1, objv, "string index");
@@ -2606,7 +2610,8 @@ StringEndCmd(
} else {
cur = numChars + 1;
}
- Tcl_SetObjResult(interp, TclNewWideIntObjFromSize(cur));
+ TclNewIndexObj(obj, cur);
+ Tcl_SetObjResult(interp, obj);
return TCL_OK;
}
@@ -3781,10 +3786,11 @@ TclNRSwitchObjCmd(
Tcl_Obj *rangeObjAry[2];
if (info.matches[j].end + 1 > 1) {
- rangeObjAry[0] = TclNewWideIntObjFromSize(info.matches[j].start);
- rangeObjAry[1] = TclNewWideIntObjFromSize(info.matches[j].end-1);
+ TclNewIndexObj(rangeObjAry[0], info.matches[j].start);
+ TclNewIndexObj(rangeObjAry[1], info.matches[j].end-1);
} else {
- rangeObjAry[0] = rangeObjAry[1] = Tcl_NewWideIntObj(-1);
+ TclNewIndexObj(rangeObjAry[1], -1);
+ rangeObjAry[0] = rangeObjAry[1];
}
/*
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index 40bb351..19bcc22 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -5034,7 +5034,7 @@ TEBCresume(
case INST_STR_LEN:
valuePtr = OBJ_AT_TOS;
slength = Tcl_GetCharLength(valuePtr);
- objResultPtr = TclNewWideIntObjFromSize(slength);
+ TclNewIntObj(objResultPtr, slength);
TRACE(("\"%.20s\" => %" TCL_Z_MODIFIER "u\n", O2S(valuePtr), slength));
NEXT_INST_F(1, 1, 1);
@@ -5178,7 +5178,7 @@ TEBCresume(
fromIdx = TclGetInt4AtPtr(pc+1);
toIdx = TclGetInt4AtPtr(pc+5);
slength = Tcl_GetCharLength(valuePtr);
- TRACE(("\"%.20s\" %" TCL_LL_MODIFIER "d %" TCL_LL_MODIFIER "d => ", O2S(valuePtr), TclWideIntFromSize(fromIdx), TclWideIntFromSize(toIdx)));
+ TRACE(("\"%.20s\" %d %d => ", O2S(valuePtr), (int)(fromIdx), (int)(toIdx)));
/* Every range of an empty value is an empty value */
if (slength == 0) {
diff --git a/generic/tclInt.h b/generic/tclInt.h
index 839c4a5..04a1866 100644
--- a/generic/tclInt.h
+++ b/generic/tclInt.h
@@ -4810,6 +4810,17 @@ MODULE_SCOPE Tcl_PackageInitProc Procbodytest_SafeInit;
TCL_DTRACE_OBJ_CREATE(objPtr); \
} while (0)
+#define TclNewIndexObj(objPtr, w) \
+ do { \
+ TclIncrObjsAllocated(); \
+ TclAllocObjStorage(objPtr); \
+ (objPtr)->refCount = 0; \
+ (objPtr)->bytes = NULL; \
+ (objPtr)->internalRep.wideValue = (Tcl_WideInt)((w) + 1) - 1; \
+ (objPtr)->typePtr = &tclIntType; \
+ TCL_DTRACE_OBJ_CREATE(objPtr); \
+ } while (0)
+
#define TclNewDoubleObj(objPtr, d) \
do { \
TclIncrObjsAllocated(); \
@@ -4835,6 +4846,9 @@ MODULE_SCOPE Tcl_PackageInitProc Procbodytest_SafeInit;
#define TclNewIntObj(objPtr, w) \
(objPtr) = Tcl_NewWideIntObj(w)
+#define TclNewIndexObj(objPtr, w) \
+ (objPtr) = Tcl_NewWideIntObj((Tcl_WideInt)((w) + 1) - 1)
+
#define TclNewDoubleObj(objPtr, d) \
(objPtr) = Tcl_NewDoubleObj(d)
@@ -5022,21 +5036,6 @@ MODULE_SCOPE Tcl_PackageInitProc Procbodytest_SafeInit;
#endif /* TCL_MEM_DEBUG */
/*
- * Macros to convert size_t to wide-int (and wide-int object) considering
- * platform-related negative value ((size_t)-1), if wide-int and size_t
- * have different dimensions (e. g. 32-bit platform).
- */
-
-#if (!defined(TCL_WIDE_INT_IS_LONG) || (LONG_MAX > UINT_MAX)) && (SIZE_MAX <= UINT_MAX)
-# define TclWideIntFromSize(value) (((Tcl_WideInt)(((size_t)(value))+1))-1)
-# define TclNewWideIntObjFromSize(value) \
- Tcl_NewWideIntObj(TclWideIntFromSize(value))
-#else
-# define TclWideIntFromSize(value) ((Tcl_WideInt)(value))
-# define TclNewWideIntObjFromSize Tcl_NewWideIntObj
-#endif
-
-/*
* Support for Clang Static Analyzer <http://clang-analyzer.llvm.org>
*/
diff --git a/generic/tclRegexp.c b/generic/tclRegexp.c
index 068b701..f67fcee 100644
--- a/generic/tclRegexp.c
+++ b/generic/tclRegexp.c
@@ -676,7 +676,7 @@ TclRegAbout(
*/
TclNewObj(resultObj);
- TclNewIntObj(infoObj, regexpPtr->re.re_nsub);
+ TclNewIndexObj(infoObj, regexpPtr->re.re_nsub);
Tcl_ListObjAppendElement(NULL, resultObj, infoObj);
/*
diff --git a/generic/tclScan.c b/generic/tclScan.c
index 6ca76c4..f018b14 100644
--- a/generic/tclScan.c
+++ b/generic/tclScan.c
@@ -1089,7 +1089,7 @@ Tcl_ScanObjCmd(
if (code == TCL_OK) {
if (underflow && (nconversions == 0)) {
if (numVars) {
- TclNewIntObj(objPtr, -1);
+ TclNewIndexObj(objPtr, -1);
} else {
if (objPtr) {
Tcl_SetListObj(objPtr, 0, NULL);
diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c
index 5a16b85..1471ce1 100644
--- a/generic/tclStringObj.c
+++ b/generic/tclStringObj.c
@@ -3456,6 +3456,7 @@ TclStringFirst(
size_t lh = 0, ln = Tcl_GetCharLength(needle);
size_t value = TCL_INDEX_NONE;
Tcl_UniChar *check, *end, *uh, *un;
+ Tcl_Obj *obj;
if (start == TCL_INDEX_NONE) {
start = 0;
@@ -3531,7 +3532,8 @@ TclStringFirst(
}
}
firstEnd:
- return TclNewWideIntObjFromSize(value);
+ TclNewIndexObj(obj, value);
+ return obj;
}
/*
@@ -3561,6 +3563,7 @@ TclStringLast(
size_t lh = 0, ln = Tcl_GetCharLength(needle);
size_t value = TCL_INDEX_NONE;
Tcl_UniChar *check, *uh, *un;
+ Tcl_Obj *obj;
if (ln == 0) {
/*
@@ -3616,7 +3619,8 @@ TclStringLast(
check--;
}
lastEnd:
- return TclNewWideIntObjFromSize(value);
+ TclNewIndexObj(obj, value);
+ return obj;
}
/*
diff --git a/generic/tclTest.c b/generic/tclTest.c
index 3a5f0ef..fcd14b5 100644
--- a/generic/tclTest.c
+++ b/generic/tclTest.c
@@ -3905,7 +3905,7 @@ TestregexpObjCmd(
varName = Tcl_GetString(objv[2]);
TclRegExpRangeUniChar(regExpr, -1, &start, &end);
- sprintf(resinfo, "%" TCL_LL_MODIFIER "d %" TCL_LL_MODIFIER "d", TclWideIntFromSize(start), TclWideIntFromSize(end-1));
+ sprintf(resinfo, "%d %d", (int)start, (int)(end-1));
value = Tcl_SetVar2(interp, varName, NULL, resinfo, 0);
if (value == NULL) {
Tcl_AppendResult(interp, "couldn't set variable \"",
@@ -3919,7 +3919,7 @@ TestregexpObjCmd(
Tcl_RegExpGetInfo(regExpr, &info);
varName = Tcl_GetString(objv[2]);
- sprintf(resinfo, "%" TCL_LL_MODIFIER "d", TclWideIntFromSize(info.extendStart));
+ sprintf(resinfo, "%d", (int)info.extendStart);
value = Tcl_SetVar2(interp, varName, NULL, resinfo, 0);
if (value == NULL) {
Tcl_AppendResult(interp, "couldn't set variable \"",
@@ -3967,8 +3967,8 @@ TestregexpObjCmd(
end--;
}
- objs[0] = TclNewWideIntObjFromSize(start);
- objs[1] = TclNewWideIntObjFromSize(end);
+ objs[0] = Tcl_NewIntObj(start);
+ objs[1] = Tcl_NewIntObj(end);
newPtr = Tcl_NewListObj(2, objs);
} else {