summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsebres <sebres@users.sourceforge.net>2024-08-12 13:34:35 (GMT)
committersebres <sebres@users.sourceforge.net>2024-08-12 13:34:35 (GMT)
commit35792bb01d4e3d7eaf4f1b15feffe3c1708033ae (patch)
tree67a591e6bf3c4d4aa298ad258f23f7802fccd408
parent608561d8ac5dc726282c62e6db20fc6fcb896217 (diff)
parent921bc8775c2ff2a042206ad75654f621371858bb (diff)
downloadtcl-35792bb01d4e3d7eaf4f1b15feffe3c1708033ae.zip
tcl-35792bb01d4e3d7eaf4f1b15feffe3c1708033ae.tar.gz
tcl-35792bb01d4e3d7eaf4f1b15feffe3c1708033ae.tar.bz2
merge 8.7
-rw-r--r--generic/tclCompCmdsGR.c7
-rw-r--r--tests/incr.test56
2 files changed, 60 insertions, 3 deletions
diff --git a/generic/tclCompCmdsGR.c b/generic/tclCompCmdsGR.c
index 8e44f96..45befc7 100644
--- a/generic/tclCompCmdsGR.c
+++ b/generic/tclCompCmdsGR.c
@@ -476,7 +476,8 @@ TclCompileIncrCmd(
{
DefineLineInformation; /* TIP #280 */
Tcl_Token *varTokenPtr, *incrTokenPtr;
- int isScalar, localIndex, haveImmValue, immValue;
+ int isScalar, localIndex, haveImmValue;
+ Tcl_WideInt immValue;
if ((parsePtr->numWords != 2) && (parsePtr->numWords != 3)) {
return TCL_ERROR;
@@ -503,11 +504,11 @@ TclCompileIncrCmd(
Tcl_Obj *intObj = Tcl_NewStringObj(word, numBytes);
Tcl_IncrRefCount(intObj);
- code = TclGetIntFromObj(NULL, intObj, &immValue);
- TclDecrRefCount(intObj);
+ code = TclGetWideIntFromObj(NULL, intObj, &immValue);
if ((code == TCL_OK) && (-127 <= immValue) && (immValue <= 127)) {
haveImmValue = 1;
}
+ TclDecrRefCount(intObj);
if (!haveImmValue) {
PushLiteral(envPtr, word, numBytes);
}
diff --git a/tests/incr.test b/tests/incr.test
index 04c3652..f68d171 100644
--- a/tests/incr.test
+++ b/tests/incr.test
@@ -236,6 +236,62 @@ test incr-1.30 {TclCompileIncrCmd: array var, braced (no subs)} -setup {
incr {array($foo)}
} -result 5
+test incr-1.31 {no overflow in TclCompileIncrCmd and Tcl_IncrObjCmd, bug [7179c6724cd38271]} {
+ # TclCompileIncrCmd: compiled incr TEBC with immutable constant offs (INST_INCR_*_IMM instructions):
+ lappend res [set i 0; incr i 0x7FFFFFFF]
+ lappend res [set i 0; incr i 0xFFFFFF80]
+ lappend res [set i 0; incr i 0xFFFFFF81]
+ lappend res [set i 0; incr i 0xFFFFFFFF]
+ lappend res [set i 0; incr i 0x10000007F]
+ lappend res [set i 0; incr i 0x100000080]
+ lappend res [set i 0; incr i 0x7FFFFFFFFFFFFFFF]
+ lappend res [set i 0; incr i 0xFFFFFFFFFFFFFF80]
+ lappend res [set i 0; incr i 0xFFFFFFFFFFFFFF81]
+ lappend res [set i 0; incr i 0xFFFFFFFFFFFFFFFF]
+ lappend res [set i 0; incr i 0x1000000000000007F]
+ lappend res [set i 0; incr i 0x10000000000000080]
+ # TclCompileIncrCmd: compiled incr TEBC with dynamic offs (INST_INCR_* instructions without _IMM):
+ lappend res [set i 0; incr i [set x 0x7FFFFFFF]]
+ lappend res [set i 0; incr i [set x 0xFFFFFF80]]
+ lappend res [set i 0; incr i [set x 0xFFFFFF81]]
+ lappend res [set i 0; incr i [set x 0xFFFFFFFF]]
+ lappend res [set i 0; incr i [set x 0x10000007F]]
+ lappend res [set i 0; incr i [set x 0x100000080]]
+ lappend res [set i 0; incr i [set x 0x7FFFFFFFFFFFFFFF]]
+ lappend res [set i 0; incr i [set x 0xFFFFFFFFFFFFFF80]]
+ lappend res [set i 0; incr i [set x 0xFFFFFFFFFFFFFF81]]
+ lappend res [set i 0; incr i [set x 0xFFFFFFFFFFFFFFFF]]
+ lappend res [set i 0; incr i [set x 0x1000000000000007F]]
+ lappend res [set i 0; incr i [set x 0x10000000000000080]]
+ # Tcl_IncrObjCmd: non-compiled incr command (or NRE):
+ set cmd incr
+ lappend res [set i 0; $cmd i 0x7FFFFFFF]
+ lappend res [set i 0; $cmd i 0xFFFFFF80]
+ lappend res [set i 0; $cmd i 0xFFFFFF81]
+ lappend res [set i 0; $cmd i 0xFFFFFFFF]
+ lappend res [set i 0; $cmd i 0x10000007F]
+ lappend res [set i 0; $cmd i 0x100000080]
+ lappend res [set i 0; $cmd i 0x7FFFFFFFFFFFFFFF]
+ lappend res [set i 0; $cmd i 0xFFFFFFFFFFFFFF80]
+ lappend res [set i 0; $cmd i 0xFFFFFFFFFFFFFF81]
+ lappend res [set i 0; $cmd i 0xFFFFFFFFFFFFFFFF]
+ lappend res [set i 0; $cmd i 0x1000000000000007F]
+ lappend res [set i 0; $cmd i 0x10000000000000080]
+} [lrepeat 3 \
+ [expr 0x7FFFFFFF] \
+ [expr 0xFFFFFF80] \
+ [expr 0xFFFFFF81] \
+ [expr 0xFFFFFFFF] \
+ [expr 0x10000007F] \
+ [expr 0x100000080] \
+ [expr 0x7FFFFFFFFFFFFFFF] \
+ [expr 0xFFFFFFFFFFFFFF80] \
+ [expr 0xFFFFFFFFFFFFFF81] \
+ [expr 0xFFFFFFFFFFFFFFFF] \
+ [expr 0x1000000000000007F] \
+ [expr 0x10000000000000080] \
+]
+
# Check "incr" and computed command names.
unset -nocomplain x i