diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2022-11-28 12:06:41 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2022-11-28 12:06:41 (GMT) |
commit | 18f90309e43e13dde5891a7548dad46e248e2c9a (patch) | |
tree | b2e217691102055a0bd2f5d761a00c640ee0d5aa | |
parent | bc23abb929451954a6d17be2d8e22c9fdefbc1bf (diff) | |
download | tcl-18f90309e43e13dde5891a7548dad46e248e2c9a.zip tcl-18f90309e43e13dde5891a7548dad46e248e2c9a.tar.gz tcl-18f90309e43e13dde5891a7548dad46e248e2c9a.tar.bz2 |
Use Tcl_Size for ArithSeries.len
-rwxr-xr-x | generic/tclArithSeries.c | 46 | ||||
-rw-r--r-- | generic/tclArithSeries.h | 14 | ||||
-rw-r--r-- | generic/tclInt.decls | 2 | ||||
-rw-r--r-- | generic/tclIntDecls.h | 6 | ||||
-rw-r--r-- | generic/tclListObj.c | 9 | ||||
-rw-r--r-- | generic/tclTest.c | 65 | ||||
-rw-r--r-- | tests/link.test | 2 |
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 { |