summaryrefslogtreecommitdiffstats
path: root/generic/tclStubInit.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2022-06-08 10:23:13 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2022-06-08 10:23:13 (GMT)
commit8ef685ede6f3371073dfb6f84eff77b62398787c (patch)
treefd4894d3b57bc034901dff8f04b0b9b465057ce1 /generic/tclStubInit.c
parentaa312430e34a7bd58cddb79b7dd6840e86ced518 (diff)
parentbdccbf1c921b2158d107e97cc64b72ab81a05ee5 (diff)
downloadtcl-8ef685ede6f3371073dfb6f84eff77b62398787c.zip
tcl-8ef685ede6f3371073dfb6f84eff77b62398787c.tar.gz
tcl-8ef685ede6f3371073dfb6f84eff77b62398787c.tar.bz2
TIP #616: Tcl lists > 2^31 elements
Diffstat (limited to 'generic/tclStubInit.c')
-rw-r--r--generic/tclStubInit.c121
1 files changed, 107 insertions, 14 deletions
diff --git a/generic/tclStubInit.c b/generic/tclStubInit.c
index 2114b99..f41321f 100644
--- a/generic/tclStubInit.c
+++ b/generic/tclStubInit.c
@@ -88,6 +88,99 @@ static void uniCodePanic() {
#define TclUtfNext Tcl_UtfNext
#define TclUtfPrev Tcl_UtfPrev
+int TclListObjGetElements(Tcl_Interp *interp, Tcl_Obj *listPtr,
+ int *objcPtr, Tcl_Obj ***objvPtr) {
+ size_t n = TCL_INDEX_NONE;
+ int result = Tcl_ListObjGetElements(interp, listPtr, &n, objvPtr);
+ if (objcPtr) {
+ if ((result == TCL_OK) && (n > INT_MAX)) {
+ if (interp) {
+ Tcl_AppendResult(interp, "List too large to be processed", NULL);
+ }
+ return TCL_ERROR;
+ }
+ *objcPtr = n;
+ }
+ return result;
+}
+int TclListObjLength(Tcl_Interp *interp, Tcl_Obj *listPtr,
+ int *lengthPtr) {
+ size_t n = TCL_INDEX_NONE;
+ int result = Tcl_ListObjLength(interp, listPtr, &n);
+ if (lengthPtr) {
+ if ((result == TCL_OK) && (n > INT_MAX)) {
+ if (interp) {
+ Tcl_AppendResult(interp, "List too large to be processed", NULL);
+ }
+ return TCL_ERROR;
+ }
+ *lengthPtr = n;
+ }
+ return result;
+}
+int TclDictObjSize(Tcl_Interp *interp, Tcl_Obj *dictPtr,
+ int *sizePtr) {
+ size_t n = TCL_INDEX_NONE;
+ int result = Tcl_DictObjSize(interp, dictPtr, &n);
+ if (sizePtr) {
+ if ((result == TCL_OK) && (n > INT_MAX)) {
+ if (interp) {
+ Tcl_AppendResult(interp, "Dict too large to be processed", NULL);
+ }
+ return TCL_ERROR;
+ }
+ *sizePtr = n;
+ }
+ return result;
+}
+int TclSplitList(Tcl_Interp *interp, const char *listStr, int *argcPtr,
+ const char ***argvPtr) {
+ size_t n = TCL_INDEX_NONE;
+ int result = Tcl_SplitList(interp, listStr, &n, argvPtr);
+ if (argcPtr) {
+ if ((result == TCL_OK) && (n > INT_MAX)) {
+ if (interp) {
+ Tcl_AppendResult(interp, "List too large to be processed", NULL);
+ }
+ Tcl_Free((void *)*argvPtr);
+ return TCL_ERROR;
+ }
+ *argcPtr = n;
+ }
+ return result;
+}
+void TclSplitPath(const char *path, int *argcPtr, const char ***argvPtr) {
+ size_t n = TCL_INDEX_NONE;
+ Tcl_SplitPath(path, &n, argvPtr);
+ if (argcPtr) {
+ if (n > INT_MAX) {
+ n = TCL_INDEX_NONE; /* No other way to return an error-situation */
+ Tcl_Free((void *)*argvPtr);
+ *argvPtr = NULL;
+ }
+ *argcPtr = n;
+ }
+}
+Tcl_Obj *TclFSSplitPath(Tcl_Obj *pathPtr, int *lenPtr) {
+ size_t n = TCL_INDEX_NONE;
+ Tcl_Obj *result = Tcl_FSSplitPath(pathPtr, &n);
+ if (lenPtr) {
+ if (result && (n > INT_MAX)) {
+ Tcl_DecrRefCount(result);
+ return NULL;
+ }
+ *lenPtr = n;
+ }
+ return result;
+}
+int TclParseArgsObjv(Tcl_Interp *interp,
+ const Tcl_ArgvInfo *argTable, int *objcPtr, Tcl_Obj *const *objv,
+ Tcl_Obj ***remObjv) {
+ size_t n = (*objcPtr < 0) ? TCL_INDEX_NONE: (size_t)*objcPtr ;
+ int result = Tcl_ParseArgsObjv(interp, argTable, &n, objv, remObjv);
+ *objcPtr = (int)n;
+ return result;
+}
#define TclBN_mp_add mp_add
#define TclBN_mp_add_d mp_add_d
@@ -738,9 +831,9 @@ const TclStubs tclStubs = {
Tcl_InvalidateStringRep, /* 42 */
Tcl_ListObjAppendList, /* 43 */
Tcl_ListObjAppendElement, /* 44 */
- Tcl_ListObjGetElements, /* 45 */
+ TclListObjGetElements, /* 45 */
Tcl_ListObjIndex, /* 46 */
- Tcl_ListObjLength, /* 47 */
+ TclListObjLength, /* 47 */
Tcl_ListObjReplace, /* 48 */
0, /* 49 */
Tcl_NewByteArrayObj, /* 50 */
@@ -935,8 +1028,8 @@ const TclStubs tclStubs = {
Tcl_SignalId, /* 239 */
Tcl_SignalMsg, /* 240 */
Tcl_SourceRCFile, /* 241 */
- Tcl_SplitList, /* 242 */
- Tcl_SplitPath, /* 243 */
+ TclSplitList, /* 242 */
+ TclSplitPath, /* 243 */
0, /* 244 */
0, /* 245 */
0, /* 246 */
@@ -1154,7 +1247,7 @@ const TclStubs tclStubs = {
Tcl_FSChdir, /* 458 */
Tcl_FSConvertToPathType, /* 459 */
Tcl_FSJoinPath, /* 460 */
- Tcl_FSSplitPath, /* 461 */
+ TclFSSplitPath, /* 461 */
Tcl_FSEqualPaths, /* 462 */
Tcl_FSGetNormalizedPath, /* 463 */
Tcl_FSJoinToPath, /* 464 */
@@ -1190,7 +1283,7 @@ const TclStubs tclStubs = {
Tcl_DictObjPut, /* 494 */
Tcl_DictObjGet, /* 495 */
Tcl_DictObjRemove, /* 496 */
- Tcl_DictObjSize, /* 497 */
+ TclDictObjSize, /* 497 */
Tcl_DictObjFirst, /* 498 */
Tcl_DictObjNext, /* 499 */
Tcl_DictObjDone, /* 500 */
@@ -1297,7 +1390,7 @@ const TclStubs tclStubs = {
Tcl_GetBlockSizeFromStat, /* 601 */
Tcl_SetEnsembleParameterList, /* 602 */
Tcl_GetEnsembleParameterList, /* 603 */
- Tcl_ParseArgsObjv, /* 604 */
+ TclParseArgsObjv, /* 604 */
Tcl_GetErrorLine, /* 605 */
Tcl_SetErrorLine, /* 606 */
Tcl_TransferResult, /* 607 */
@@ -1354,13 +1447,13 @@ const TclStubs tclStubs = {
Tcl_ExternalToUtfDStringEx, /* 658 */
Tcl_UtfToExternalDStringEx, /* 659 */
Tcl_AsyncMarkFromSignal, /* 660 */
- 0, /* 661 */
- 0, /* 662 */
- 0, /* 663 */
- 0, /* 664 */
- 0, /* 665 */
- 0, /* 666 */
- 0, /* 667 */
+ Tcl_ListObjGetElements, /* 661 */
+ Tcl_ListObjLength, /* 662 */
+ Tcl_DictObjSize, /* 663 */
+ Tcl_SplitList, /* 664 */
+ Tcl_SplitPath, /* 665 */
+ Tcl_FSSplitPath, /* 666 */
+ Tcl_ParseArgsObjv, /* 667 */
Tcl_UniCharLen, /* 668 */
Tcl_NumUtfChars, /* 669 */
Tcl_GetCharLength, /* 670 */