summaryrefslogtreecommitdiffstats
path: root/generic/tclCompCmds.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclCompCmds.c')
-rw-r--r--generic/tclCompCmds.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/generic/tclCompCmds.c b/generic/tclCompCmds.c
index 3b234b0..5f2dc43 100644
--- a/generic/tclCompCmds.c
+++ b/generic/tclCompCmds.c
@@ -2285,10 +2285,19 @@ TclCompileIncrCmd(
Tcl_Obj *intObj = Tcl_NewStringObj(word, numBytes);
Tcl_IncrRefCount(intObj);
code = TclGetIntFromObj(NULL, intObj, &immValue);
- TclDecrRefCount(intObj);
- if ((code == TCL_OK) && (-127 <= immValue) && (immValue <= 127)) {
+ if ( (code == TCL_OK)
+ && (-127 <= immValue) && (immValue <= 127)
+#ifndef NO_WIDE_TYPE
+ /* avoid overflow during string to int conversion (wide 0xFFFFFFFF to signed int -1): */
+ && ( (immValue >= 0)
+ || (intObj->typePtr != &tclWideIntType)
+ || ((-127 <= intObj->internalRep.wideValue) && (intObj->internalRep.wideValue <= 127))
+ )
+#endif
+ ) {
haveImmValue = 1;
}
+ TclDecrRefCount(intObj);
if (!haveImmValue) {
PushLiteral(envPtr, word, numBytes);
}