summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2022-11-28 12:06:41 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2022-11-28 12:06:41 (GMT)
commit18f90309e43e13dde5891a7548dad46e248e2c9a (patch)
treeb2e217691102055a0bd2f5d761a00c640ee0d5aa
parentbc23abb929451954a6d17be2d8e22c9fdefbc1bf (diff)
downloadtcl-18f90309e43e13dde5891a7548dad46e248e2c9a.zip
tcl-18f90309e43e13dde5891a7548dad46e248e2c9a.tar.gz
tcl-18f90309e43e13dde5891a7548dad46e248e2c9a.tar.bz2
Use Tcl_Size for ArithSeries.len
-rwxr-xr-xgeneric/tclArithSeries.c46
-rw-r--r--generic/tclArithSeries.h14
-rw-r--r--generic/tclInt.decls2
-rw-r--r--generic/tclIntDecls.h6
-rw-r--r--generic/tclListObj.c9
-rw-r--r--generic/tclTest.c65
-rw-r--r--tests/link.test2
7 files changed, 93 insertions, 51 deletions
diff --git a/generic/tclArithSeries.c b/generic/tclArithSeries.c
index 40f34b5..c32c443 100755
--- a/generic/tclArithSeries.c
+++ b/generic/tclArithSeries.c
@@ -149,7 +149,7 @@ TclNewArithSeriesInt(Tcl_WideInt start, Tcl_WideInt end, Tcl_WideInt step, Tcl_W
arithSeriesRepPtr->start = start;
arithSeriesRepPtr->end = end;
arithSeriesRepPtr->step = step;
- arithSeriesRepPtr->len = length;
+ arithSeriesRepPtr->len1 = length;
arithSeriesRepPtr->elements = NULL;
arithSeriesPtr->internalRep.twoPtrValue.ptr1 = arithSeriesRepPtr;
arithSeriesPtr->internalRep.twoPtrValue.ptr2 = NULL;
@@ -196,7 +196,7 @@ TclNewArithSeriesDbl(double start, double end, double step, Tcl_WideInt len)
arithSeriesRepPtr->start = start;
arithSeriesRepPtr->end = end;
arithSeriesRepPtr->step = step;
- arithSeriesRepPtr->len = length;
+ arithSeriesRepPtr->len1 = length;
arithSeriesRepPtr->elements = NULL;
arithSeriesPtr->internalRep.twoPtrValue.ptr1 = arithSeriesRepPtr;
arithSeriesPtr->internalRep.twoPtrValue.ptr2 = NULL;
@@ -429,7 +429,7 @@ TclArithSeriesObjIndex(Tcl_Obj *arithSeriesPtr, Tcl_WideInt index, Tcl_Obj **ele
Tcl_Panic("TclArithSeriesObjIndex called with a not ArithSeries Obj.");
}
arithSeriesRepPtr = ArithSeriesRepPtr(arithSeriesPtr);
- if (index < 0 || index >= arithSeriesRepPtr->len) {
+ if (index < 0 || index >= arithSeriesRepPtr->len1) {
return TCL_ERROR;
}
/* List[i] = Start + (Step * index) */
@@ -458,11 +458,11 @@ TclArithSeriesObjIndex(Tcl_Obj *arithSeriesPtr, Tcl_WideInt index, Tcl_Obj **ele
*
*----------------------------------------------------------------------
*/
-Tcl_WideInt TclArithSeriesObjLength(Tcl_Obj *arithSeriesPtr)
+Tcl_Size TclArithSeriesObjLength(Tcl_Obj *arithSeriesPtr)
{
ArithSeries *arithSeriesRepPtr = (ArithSeries*)
arithSeriesPtr->internalRep.twoPtrValue.ptr1;
- return arithSeriesRepPtr->len;
+ return arithSeriesRepPtr->len1;
}
/*
@@ -491,7 +491,7 @@ FreeArithSeriesInternalRep(Tcl_Obj *arithSeriesPtr)
if (arithSeriesRepPtr->elements) {
Tcl_WideInt i;
Tcl_Obj**elmts = arithSeriesRepPtr->elements;
- for(i=0; i<arithSeriesRepPtr->len; i++) {
+ for(i=0; i<arithSeriesRepPtr->len1; i++) {
if (elmts[i]) {
Tcl_DecrRefCount(elmts[i]);
}
@@ -581,7 +581,7 @@ UpdateStringOfArithSeries(Tcl_Obj *arithSeriesPtr)
/*
* Pass 1: estimate space.
*/
- for (i = 0; i < arithSeriesRepPtr->len; i++) {
+ for (i = 0; i < arithSeriesRepPtr->len1; i++) {
TclArithSeriesObjIndex(arithSeriesPtr, i, &elemObj);
elem = TclGetStringFromObj(elemObj, &slen);
Tcl_DecrRefCount(elemObj);
@@ -594,7 +594,7 @@ UpdateStringOfArithSeries(Tcl_Obj *arithSeriesPtr)
*/
p = Tcl_InitStringRep(arithSeriesPtr, NULL, length);
- for (i = 0; i < arithSeriesRepPtr->len; i++) {
+ for (i = 0; i < arithSeriesRepPtr->len1; i++) {
TclArithSeriesObjIndex(arithSeriesPtr, i, &elemObj);
elem = TclGetStringFromObj(elemObj, &slen);
strcpy(p, elem);
@@ -725,10 +725,9 @@ TclArithSeriesObjRange(
if (TclArithSeriesObjIndex(arithSeriesPtr, fromIdx, &startObj) != TCL_OK) {
if (interp) {
- Tcl_SetObjResult(
- interp,
- Tcl_ObjPrintf("index %d is out of bounds 0 to %"
- TCL_LL_MODIFIER "d", fromIdx, (arithSeriesRepPtr->len-1)));
+ Tcl_SetObjResult(interp,
+ Tcl_ObjPrintf("index %d is out of bounds 0 to %"
+ "d", fromIdx, (arithSeriesRepPtr->len1-1)));
Tcl_SetErrorCode(interp, "TCL", "MEMORY", NULL);
}
return NULL;
@@ -736,10 +735,9 @@ TclArithSeriesObjRange(
Tcl_IncrRefCount(startObj);
if (TclArithSeriesObjIndex(arithSeriesPtr, toIdx, &endObj) != TCL_OK) {
if (interp) {
- Tcl_SetObjResult(
- interp,
- Tcl_ObjPrintf("index %d is out of bounds 0 to %"
- TCL_LL_MODIFIER "d", fromIdx, (arithSeriesRepPtr->len-1)));
+ Tcl_SetObjResult(interp,
+ Tcl_ObjPrintf("index %d is out of bounds 0 to %"
+ "d", fromIdx, (arithSeriesRepPtr->len1-1)));
Tcl_SetErrorCode(interp, "TCL", "MEMORY", NULL);
}
return NULL;
@@ -782,7 +780,7 @@ TclArithSeriesObjRange(
arithSeriesDblRepPtr->start = start;
arithSeriesDblRepPtr->end = end;
arithSeriesDblRepPtr->step = step;
- arithSeriesDblRepPtr->len = (end-start+step)/step;
+ arithSeriesDblRepPtr->len1 = (end-start+step)/step;
arithSeriesDblRepPtr->elements = NULL;
} else {
@@ -793,7 +791,7 @@ TclArithSeriesObjRange(
arithSeriesRepPtr->start = start;
arithSeriesRepPtr->end = end;
arithSeriesRepPtr->step = step;
- arithSeriesRepPtr->len = (end-start+step)/step;
+ arithSeriesRepPtr->len1 = (end-start+step)/step;
arithSeriesRepPtr->elements = NULL;
}
@@ -849,7 +847,7 @@ TclArithSeriesGetElements(
int i, objc;
ArithSeriesGetInternalRep(objPtr, arithSeriesRepPtr);
- objc = arithSeriesRepPtr->len;
+ objc = arithSeriesRepPtr->len1;
if (objc > 0) {
if (arithSeriesRepPtr->elements) {
/* If this exists, it has already been populated */
@@ -931,7 +929,7 @@ TclArithSeriesObjReverse(
ArithSeriesGetInternalRep(arithSeriesPtr, arithSeriesRepPtr);
isDouble = arithSeriesRepPtr->isDouble;
- len = arithSeriesRepPtr->len;
+ len = arithSeriesRepPtr->len1;
TclArithSeriesObjIndex(arithSeriesPtr, (len-1), &startObj);
Tcl_IncrRefCount(startObj);
@@ -1000,3 +998,11 @@ TclArithSeriesObjReverse(
return resultObj;
}
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */
diff --git a/generic/tclArithSeries.h b/generic/tclArithSeries.h
index f7f2fa8..f855f6f 100644
--- a/generic/tclArithSeries.h
+++ b/generic/tclArithSeries.h
@@ -16,7 +16,7 @@
* but it's faster to cache it inside the internal representation.
*/
typedef struct ArithSeries {
- Tcl_WideInt len;
+ Tcl_Size len1;
Tcl_Obj **elements;
int isDouble;
Tcl_WideInt start;
@@ -24,7 +24,7 @@ typedef struct ArithSeries {
Tcl_WideInt step;
} ArithSeries;
typedef struct ArithSeriesDbl {
- Tcl_WideInt len;
+ Tcl_Size len1;
Tcl_Obj **elements;
int isDouble;
double start;
@@ -39,7 +39,7 @@ MODULE_SCOPE int TclArithSeriesObjStep(Tcl_Obj *arithSeriesPtr,
Tcl_Obj **stepObj);
MODULE_SCOPE int TclArithSeriesObjIndex(Tcl_Obj *arithSeriesPtr,
Tcl_WideInt index, Tcl_Obj **elementObj);
-MODULE_SCOPE Tcl_WideInt TclArithSeriesObjLength(Tcl_Obj *arithSeriesPtr);
+MODULE_SCOPE Tcl_Size TclArithSeriesObjLength(Tcl_Obj *arithSeriesPtr);
MODULE_SCOPE Tcl_Obj * TclArithSeriesObjRange(Tcl_Interp *interp,
Tcl_Obj *arithSeriesPtr, Tcl_Size fromIdx, Tcl_Size toIdx);
MODULE_SCOPE Tcl_Obj * TclArithSeriesObjReverse(Tcl_Interp *interp,
@@ -55,3 +55,11 @@ MODULE_SCOPE int TclNewArithSeriesObj(Tcl_Interp *interp,
Tcl_Obj **arithSeriesObj, int useDoubles,
Tcl_Obj *startObj, Tcl_Obj *endObj,
Tcl_Obj *stepObj, Tcl_Obj *lenObj);
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */
diff --git a/generic/tclInt.decls b/generic/tclInt.decls
index b3e352a..4db3919 100644
--- a/generic/tclInt.decls
+++ b/generic/tclInt.decls
@@ -701,7 +701,7 @@ declare 258 {
# TIP 625: for unit testing - create list objects with span
declare 260 {
- Tcl_Obj *TclListTestObj(Tcl_Size length, Tcl_Size leadingSpace, Tcl_Size endSpace)
+ Tcl_Obj *TclListTestObj(size_t length, size_t leadingSpace, size_t endSpace)
}
# TIP 625: for unit testing - check list invariants
diff --git a/generic/tclIntDecls.h b/generic/tclIntDecls.h
index 4c8d897..ffd559d 100644
--- a/generic/tclIntDecls.h
+++ b/generic/tclIntDecls.h
@@ -660,8 +660,8 @@ EXTERN Tcl_Obj * TclpCreateTemporaryDirectory(Tcl_Obj *dirObj,
Tcl_Obj *basenameObj);
/* Slot 259 is reserved */
/* 260 */
-EXTERN Tcl_Obj * TclListTestObj(Tcl_Size length,
- Tcl_Size leadingSpace, Tcl_Size endSpace);
+EXTERN Tcl_Obj * TclListTestObj(size_t length, size_t leadingSpace,
+ size_t endSpace);
/* 261 */
EXTERN void TclListObjValidate(Tcl_Interp *interp,
Tcl_Obj *listObj);
@@ -930,7 +930,7 @@ typedef struct TclIntStubs {
void (*tclStaticLibrary) (Tcl_Interp *interp, const char *prefix, Tcl_LibraryInitProc *initProc, Tcl_LibraryInitProc *safeInitProc); /* 257 */
Tcl_Obj * (*tclpCreateTemporaryDirectory) (Tcl_Obj *dirObj, Tcl_Obj *basenameObj); /* 258 */
void (*reserved259)(void);
- Tcl_Obj * (*tclListTestObj) (Tcl_Size length, Tcl_Size leadingSpace, Tcl_Size endSpace); /* 260 */
+ Tcl_Obj * (*tclListTestObj) (size_t length, size_t leadingSpace, size_t endSpace); /* 260 */
void (*tclListObjValidate) (Tcl_Interp *interp, Tcl_Obj *listObj); /* 261 */
} TclIntStubs;
diff --git a/generic/tclListObj.c b/generic/tclListObj.c
index 486baa2..776ff0e 100644
--- a/generic/tclListObj.c
+++ b/generic/tclListObj.c
@@ -3515,10 +3515,10 @@ UpdateStringOfList(
*------------------------------------------------------------------------
*/
Tcl_Obj *
-TclListTestObj(Tcl_Size length, Tcl_Size leadingSpace, Tcl_Size endSpace)
+TclListTestObj(size_t length, size_t leadingSpace, size_t endSpace)
{
ListRep listRep;
- Tcl_Size capacity;
+ size_t capacity;
Tcl_Obj *listObj;
TclNewObj(listObj);
@@ -3528,11 +3528,14 @@ TclListTestObj(Tcl_Size length, Tcl_Size leadingSpace, Tcl_Size endSpace)
if (capacity == 0) {
return listObj;
}
+ if (capacity > LIST_MAX) {
+ return NULL;
+ }
ListRepInit(capacity, NULL, 0, &listRep);
ListStore *storePtr = listRep.storePtr;
- Tcl_Size i;
+ size_t i;
for (i = 0; i < length; ++i) {
TclNewUIntObj(storePtr->slots[i + leadingSpace], i);
Tcl_IncrRefCount(storePtr->slots[i + leadingSpace]);
diff --git a/generic/tclTest.c b/generic/tclTest.c
index bc3b553..c5eb6eb 100644
--- a/generic/tclTest.c
+++ b/generic/tclTest.c
@@ -300,7 +300,7 @@ static Tcl_ObjCmdProc TestprintObjCmd;
static Tcl_ObjCmdProc TestregexpObjCmd;
static Tcl_ObjCmdProc TestreturnObjCmd;
static void TestregexpXflags(const char *string,
- int length, int *cflagsPtr, int *eflagsPtr);
+ size_t length, int *cflagsPtr, int *eflagsPtr);
#ifndef TCL_NO_DEPRECATED
static Tcl_ObjCmdProc TestsaveresultCmd;
static void TestsaveresultFree(char *blockPtr);
@@ -999,7 +999,8 @@ AsyncHandlerProc(
{
TestAsyncHandler *asyncPtr;
int id = PTR2INT(clientData);
- const char *listArgv[4], *cmd;
+ const char *listArgv[4];
+ char *cmd;
char string[TCL_INTEGER_SPACE];
Tcl_MutexLock(&asyncTestMutex);
@@ -3121,12 +3122,28 @@ TestlinkCmd(
tmp = Tcl_NewWideIntObj(longVar);
Tcl_AppendElement(interp, Tcl_GetString(tmp));
Tcl_DecrRefCount(tmp);
- tmp = Tcl_NewWideIntObj((long)ulongVar);
+ if (ulongVar > WIDE_MAX) {
+ mp_int bignumValue;
+ if (mp_init_u64(&bignumValue, ulongVar) != MP_OKAY) {
+ Tcl_Panic("%s: memory overflow", "Tcl_SetWideUIntObj");
+ }
+ tmp = Tcl_NewBignumObj(&bignumValue);
+ } else {
+ tmp = Tcl_NewWideIntObj((Tcl_WideInt)ulongVar);
+ }
Tcl_AppendElement(interp, Tcl_GetString(tmp));
Tcl_DecrRefCount(tmp);
Tcl_PrintDouble(NULL, (double)floatVar, buffer);
Tcl_AppendElement(interp, buffer);
- tmp = Tcl_NewWideIntObj((Tcl_WideInt)uwideVar);
+ if (uwideVar > WIDE_MAX) {
+ mp_int bignumValue;
+ if (mp_init_u64(&bignumValue, uwideVar) != MP_OKAY) {
+ Tcl_Panic("%s: memory overflow", "Tcl_SetWideUIntObj");
+ }
+ tmp = Tcl_NewBignumObj(&bignumValue);
+ } else {
+ tmp = Tcl_NewWideIntObj((Tcl_WideInt)uwideVar);
+ }
Tcl_AppendElement(interp, Tcl_GetString(tmp));
Tcl_DecrRefCount(tmp);
} else if (strcmp(argv[1], "set") == 0) {
@@ -3532,24 +3549,28 @@ TestlistrepCmd(
Tcl_WrongNumArgs(interp, 2, objv, "length ?leadSpace endSpace?");
return TCL_ERROR;
} else {
- int length;
- int leadSpace = 0;
- int endSpace = 0;
- if (Tcl_GetIntFromObj(interp, objv[2], &length) != TCL_OK) {
+ Tcl_WideUInt length;
+ Tcl_WideUInt leadSpace = 0;
+ Tcl_WideUInt endSpace = 0;
+ if (Tcl_GetWideUIntFromObj(interp, objv[2], &length) != TCL_OK) {
return TCL_ERROR;
}
if (objc > 3) {
- if (Tcl_GetIntFromObj(interp, objv[3], &leadSpace) != TCL_OK) {
+ if (Tcl_GetWideUIntFromObj(interp, objv[3], &leadSpace) != TCL_OK) {
return TCL_ERROR;
}
if (objc > 4) {
- if (Tcl_GetIntFromObj(interp, objv[4], &endSpace)
+ if (Tcl_GetWideUIntFromObj(interp, objv[4], &endSpace)
!= TCL_OK) {
return TCL_ERROR;
}
}
}
resultObj = TclListTestObj(length, leadSpace, endSpace);
+ if (resultObj == NULL) {
+ Tcl_AppendResult(interp, "List capacity exceeded", NULL);
+ return TCL_ERROR;
+ }
}
break;
@@ -4347,11 +4368,11 @@ TestregexpObjCmd(
static void
TestregexpXflags(
const char *string, /* The string of flags. */
- int length, /* The length of the string in bytes. */
+ size_t length, /* The length of the string in bytes. */
int *cflagsPtr, /* compile flags word */
int *eflagsPtr) /* exec flags word */
{
- int i;
+ size_t i;
int cflags, eflags;
cflags = *cflagsPtr;
@@ -5369,12 +5390,17 @@ TestsetbytearraylengthObjCmd(
if (TCL_OK != Tcl_GetIntFromObj(interp, objv[2], &n)) {
return TCL_ERROR;
}
- if (Tcl_IsShared(objv[1])) {
- obj = Tcl_DuplicateObj(objv[1]);
- } else {
- obj = objv[1];
+ obj = objv[1];
+ if (Tcl_IsShared(obj)) {
+ obj = Tcl_DuplicateObj(obj);
+ }
+ if (Tcl_SetByteArrayLength(obj, n) == NULL) {
+ if (obj != objv[1]) {
+ Tcl_DecrRefCount(obj);
+ }
+ Tcl_AppendResult(interp, "expected bytes", NULL);
+ return TCL_ERROR;
}
- Tcl_SetByteArrayLength(obj, n);
Tcl_SetObjResult(interp, obj);
return TCL_OK;
}
@@ -6658,15 +6684,14 @@ TestWrongNumArgsObjCmd(
int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
- int i;
- int length;
+ int i, length;
const char *msg;
if (objc < 3) {
goto insufArgs;
}
- if (Tcl_GetIntFromObj(interp, objv[1], &i) != TCL_OK) {
+ if (Tcl_GetIntForIndex(interp, objv[1], TCL_INDEX_NONE, &i) != TCL_OK) {
return TCL_ERROR;
}
diff --git a/tests/link.test b/tests/link.test
index 69ebb02..43a85fb 100644
--- a/tests/link.test
+++ b/tests/link.test
@@ -71,7 +71,7 @@ test link-2.1 {writing C variables from Tcl} -constraints {testlink} -setup {
set float 1.0987654321
set uwide 12345678901234567890
concat [testlink get] | $int $real $bool $string $wide $char $uchar $short $ushort $uint $long $ulong $float $uwide
-} -result {465 -10.5 1 abcdef 135135 79 161 8000 40000 -1073628482 34543 567890 1.0987653732299805 -6101065172474983726 | 0o0721 -10.5 true abcdef 135135 79 161 8000 40000 0xc001babe 34543 567890 1.0987654321 12345678901234567890}
+} -result {465 -10.5 1 abcdef 135135 79 161 8000 40000 -1073628482 34543 567890 1.0987653732299805 12345678901234567890 | 0o0721 -10.5 true abcdef 135135 79 161 8000 40000 0xc001babe 34543 567890 1.0987654321 12345678901234567890}
test link-2.2 {writing bad values into variables} -setup {
testlink delete
} -constraints {testlink} -body {