summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsebres <sebres@users.sourceforge.net>2018-12-12 17:00:59 (GMT)
committersebres <sebres@users.sourceforge.net>2018-12-12 17:00:59 (GMT)
commit1ce78346fbd0daa8d65e02d2d1f59c74fc02f95d (patch)
tree664d6c4757c86f9b33466ab6b6719237f6972f5c
parentc60e1a679dc096b076279e0ef80a82fe41223a51 (diff)
downloadtcl-1ce78346fbd0daa8d65e02d2d1f59c74fc02f95d.zip
tcl-1ce78346fbd0daa8d65e02d2d1f59c74fc02f95d.tar.gz
tcl-1ce78346fbd0daa8d65e02d2d1f59c74fc02f95d.tar.bz2
better fix for [3e0a2d99f3], considering [string first] could return a value larger that INT_MAX for x64
-rw-r--r--generic/tclCmdMZ.c2
-rw-r--r--generic/tclDecls.h7
2 files changed, 8 insertions, 1 deletions
diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c
index 1654e5a..216fa0e 100644
--- a/generic/tclCmdMZ.c
+++ b/generic/tclCmdMZ.c
@@ -1338,7 +1338,7 @@ StringFirstCmd(
return TCL_ERROR;
}
}
- Tcl_SetObjResult(interp, Tcl_NewIntObj(TclStringFirst(objv[1],
+ Tcl_SetObjResult(interp, Tcl_NewWideIntObjFromSize(TclStringFirst(objv[1],
objv[2], start)));
return TCL_OK;
}
diff --git a/generic/tclDecls.h b/generic/tclDecls.h
index 57e467b..17da622 100644
--- a/generic/tclDecls.h
+++ b/generic/tclDecls.h
@@ -3841,6 +3841,13 @@ extern const TclStubs *tclStubsPtr;
#define Tcl_NewLongObj(value) Tcl_NewWideIntObj((long)(value))
#define Tcl_NewIntObj(value) Tcl_NewWideIntObj((int)(value))
+#if (!defined(TCL_WIDE_INT_IS_LONG) || (LONG_MAX > UINT_MAX)) && (SIZE_MAX <= UINT_MAX)
+ static inline Tcl_Obj * Tcl_NewWideIntObjFromSize(size_t value) {
+ return Tcl_NewWideIntObj(value != ((size_t)-1) ? (Tcl_WideInt)value : -1);
+ }
+#else
+# define Tcl_NewWideIntObjFromSize Tcl_NewWideIntObj
+#endif
#define Tcl_DbNewLongObj(value, file, line) Tcl_DbNewWideIntObj((long)(value), file, line)
#define Tcl_SetIntObj(objPtr, value) Tcl_SetWideIntObj((objPtr), (int)(value))
#define Tcl_SetLongObj(objPtr, value) Tcl_SetWideIntObj((objPtr), (long)(value))