summaryrefslogtreecommitdiffstats
path: root/generic/tclInt.h
diff options
context:
space:
mode:
authorsebres <sebres@users.sourceforge.net>2019-01-15 12:34:27 (GMT)
committersebres <sebres@users.sourceforge.net>2019-01-15 12:34:27 (GMT)
commit325b3d3e945fe34fd9d747370d49eebbded9b18e (patch)
tree71cae67869bad828478ed52f6f06b5ebf0340205 /generic/tclInt.h
parentc6ad0b690949840de2e5b9c7ec4a97a1f6059670 (diff)
downloadtcl-325b3d3e945fe34fd9d747370d49eebbded9b18e.zip
tcl-325b3d3e945fe34fd9d747370d49eebbded9b18e.tar.gz
tcl-325b3d3e945fe34fd9d747370d49eebbded9b18e.tar.bz2
next amend to [3e0a2d99f3]: fixes TclGetIntForIndex for border case of end offset (size_t)-1 if empty subject, (e. g. failed with out of range by `lset lst end+1 ...` on empty list) on 32-bit system;
introduces new internal macro TclWideIntFromSize for correct conversion of size_t to wide-int to consider platform-related negative value ((size_t)-1), if wide-int and size_t have different dimensions (e. g. on 32-bit platforms).
Diffstat (limited to 'generic/tclInt.h')
-rw-r--r--generic/tclInt.h10
1 files changed, 9 insertions, 1 deletions
diff --git a/generic/tclInt.h b/generic/tclInt.h
index e9de2c3..003a360 100644
--- a/generic/tclInt.h
+++ b/generic/tclInt.h
@@ -4903,10 +4903,18 @@ MODULE_SCOPE Tcl_PackageInitProc Procbodytest_SafeInit;
} while (0)
#endif /* TCL_MEM_DEBUG */
+/*
+ * Macros to convert size_t to wide-int (and wide-int object) considering
+ * platform-related negative value ((size_t)-1), if wide-int and size_t
+ * have different dimensions (e. g. 32-bit platform).
+ */
+
#if (!defined(TCL_WIDE_INT_IS_LONG) || (LONG_MAX > UINT_MAX)) && (SIZE_MAX <= UINT_MAX)
+# define TclWideIntFromSize(value) (((Tcl_WideInt)(((size_t)(value))+1))-1)
# define TclNewWideIntObjFromSize(value) \
- Tcl_NewWideIntObj(((Tcl_WideInt)(((size_t)(value))+1))-1)
+ Tcl_NewWideIntObj(TclWideIntFromSize(value))
#else
+# define TclWideIntFromSize(value) (value)
# define TclNewWideIntObjFromSize Tcl_NewWideIntObj
#endif