diff options
author | apnadkarni <apnmbx-wits@yahoo.com> | 2023-04-20 16:44:49 (GMT) |
---|---|---|
committer | apnadkarni <apnmbx-wits@yahoo.com> | 2023-04-20 16:44:49 (GMT) |
commit | c091b78af60d2f2f46c162bed19465380cf8d4bf (patch) | |
tree | 3ab02f5cab50084747b4510be3b04817076d5b37 | |
parent | e359627a3620dd5d90bb533fd3aef15586b1d8af (diff) | |
download | tcl-c091b78af60d2f2f46c162bed19465380cf8d4bf.zip tcl-c091b78af60d2f2f46c162bed19465380cf8d4bf.tar.gz tcl-c091b78af60d2f2f46c162bed19465380cf8d4bf.tar.bz2 |
Bugs [4ce858a049] (lrepeat), [f4d15772f1] (foreach), [6926a21840] (lmap).
-rw-r--r-- | generic/tclCmdAH.c | 17 | ||||
-rw-r--r-- | generic/tclCmdIL.c | 6 | ||||
-rw-r--r-- | tests/bigdata.test | 36 |
3 files changed, 35 insertions, 24 deletions
diff --git a/generic/tclCmdAH.c b/generic/tclCmdAH.c index b2b1a61..e2186ed 100644 --- a/generic/tclCmdAH.c +++ b/generic/tclCmdAH.c @@ -27,9 +27,9 @@ struct ForeachState { Tcl_Obj *bodyPtr; /* The script body of the command. */ - int bodyIdx; /* The argument index of the body. */ - int j, maxj; /* Number of loop iterations. */ - int numLists; /* Count of value lists. */ + Tcl_Size bodyIdx; /* The argument index of the body. */ + Tcl_Size j, maxj; /* Number of loop iterations. */ + Tcl_Size numLists; /* Count of value lists. */ Tcl_Size *index; /* Array of value list indices. */ Tcl_Size *varcList; /* # loop variables per list. */ Tcl_Obj ***varvList; /* Array of var name lists. */ @@ -2733,7 +2733,8 @@ EachloopCmd( { int numLists = (objc-2) / 2; struct ForeachState *statePtr; - int i, j, result; + int i, result; + Tcl_Size j; if (objc < 4 || (objc%2 != 0)) { Tcl_WrongNumArgs(interp, 1, objv, @@ -2887,8 +2888,12 @@ ForeachLoopStep( break; case TCL_OK: if (statePtr->resultList != NULL) { - Tcl_ListObjAppendElement(interp, statePtr->resultList, - Tcl_GetObjResult(interp)); + result = Tcl_ListObjAppendElement( + interp, statePtr->resultList, Tcl_GetObjResult(interp)); + if (result != TCL_OK) { + /* e.g. memory alloc failure on big data tests */ + goto done; + } } break; case TCL_BREAK: diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c index f7ec027..c5a6616 100644 --- a/generic/tclCmdIL.c +++ b/generic/tclCmdIL.c @@ -2923,7 +2923,7 @@ Tcl_LrepeatObjCmd( Tcl_Obj *const objv[]) /* The argument objects. */ { - int elementCount, i, totalElems; + Tcl_Size elementCount, i, totalElems; Tcl_Obj *listPtr, **dataArray = NULL; /* @@ -2935,7 +2935,7 @@ Tcl_LrepeatObjCmd( Tcl_WrongNumArgs(interp, 1, objv, "count ?value ...?"); return TCL_ERROR; } - if (TCL_OK != TclGetIntFromObj(interp, objv[1], &elementCount)) { + if (TCL_OK != TclGetSizeIntFromObj(interp, objv[1], &elementCount)) { return TCL_ERROR; } if (elementCount < 0) { @@ -2997,7 +2997,7 @@ Tcl_LrepeatObjCmd( dataArray[i] = tmpPtr; } } else { - int j, k = 0; + Tcl_Size j, k = 0; for (i=0 ; i<elementCount ; i++) { for (j=0 ; j<objc ; j++) { diff --git a/tests/bigdata.test b/tests/bigdata.test index 34b51dc..ced2510 100644 --- a/tests/bigdata.test +++ b/tests/bigdata.test @@ -726,8 +726,7 @@ bigtestRO binary-encode/decode-uuencode-bigdata-1 "binary encode/decode uuencode # # foreach bigtestRO foreach-bigdata-1 "foreach" 1 -body { - # Unset explicitly before setting to save memory as bigtestRO runs the - # script below twice. + # Unset explicitly before setting as bigtestRO runs the script twice. unset -nocomplain l2 foreach x $l { lappend l2 $x @@ -737,7 +736,7 @@ bigtestRO foreach-bigdata-1 "foreach" 1 -body { set l [bigList 0x100000000] } -cleanup { bigClean -} -constraints lengthtruncation +} # # lappend @@ -854,13 +853,21 @@ bigtestRO llength-bigdata-1 {llength} 4294967296 -body { # # lmap -bigtestRO lmap-bigdata-1 "lmap" 1 -body { - testlutil equal $l [lmap e $l {set e}] +bigtestRO lmap-bigdata-1 "lmap" 4294967296 -body { + set n 0 + if {0} { + # TODO - This is the right test but runs out of memory + testlutil equal $l [lmap e $l {set e}] + } else { + lmap e $l {incr n; continue} + } + set n } -setup { set l [bigList 0x100000000] } -cleanup { bigClean -} -constraints bug-6926a21840 + puts "" +} # # lrange @@ -887,18 +894,15 @@ bigtestRO lrange-bigdata-1 "lrange" {6 7 5 {} 5 4 {} 9 {}} -body { bigtest lrepeat-bigdata-1 "lrepeat single element length > UINT_MAX" 4294967296 -body { # Just to test long lengths are accepted as arguments llength [lrepeat 0x100000000 x] -} -constraints bug-4ce858a049 +} -bigtest lrepeat-bigdata-2 "string repeat multiple char" {4294967296 1} -body { - # Make length multiple of 4 AND 10 since the bigString pattern length is 10 - set len [expr 4294967320/4] - set l [lrepeat $len 0 1 2 3 4 5 6 7 8 9] - list \ - [llength $l] \ - [testlutil equal $l [bigList 4294967320]] +bigtest lrepeat-bigdata-2 "string repeat multiple char" {4294967400 {0 1 2 3 4 5 6 7}} -body { + set len [expr 4294967400/8] + set l [lrepeat $len 0 1 2 3 4 5 6 7] + list [llength $l] [lrange $l end-7 end] } -cleanup { bigClean -} -constraints bug-4ce858a049 +} # # lreplace @@ -1019,6 +1023,8 @@ bigtestRO concat-bigdata-1 "concat" {4294967296 {0 1 2 3 4} {6 7 0 1 2} {3 4 5 6 # # TODO +# lremove +# lreverse # encoding convertfrom # encoding convertto # dict * |