summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2020-09-15 15:07:44 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2020-09-15 15:07:44 (GMT)
commit5758c119f8180b9f3f902d157e567a1c2a7f85e0 (patch)
tree3fb58de64c9cbd8d1b798a9ac37d604dacbde8c3
parent39aec08fb0bcd5aa7d51f44c3b79e21d8de33744 (diff)
parent245a63f4919420ca6a36f14ba0866a91b51494b8 (diff)
downloadtcl-5758c119f8180b9f3f902d157e567a1c2a7f85e0.zip
tcl-5758c119f8180b9f3f902d157e567a1c2a7f85e0.tar.gz
tcl-5758c119f8180b9f3f902d157e567a1c2a7f85e0.tar.bz2
Merge 8.7
-rw-r--r--generic/tclExecute.c38
-rw-r--r--generic/tclUtil.c17
-rw-r--r--tests/lindex.test8
-rw-r--r--tests/string.test14
-rw-r--r--tests/util.test3
5 files changed, 62 insertions, 18 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index 875601e..e3512ef 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -4653,13 +4653,19 @@ TEBCresume(
*/
if ((TclListObjGetElements(interp, valuePtr, &objc, &objv) == TCL_OK)
- && !TclHasIntRep(value2Ptr, &tclListType)
- && (TclGetIntForIndexM(NULL, value2Ptr, objc-1,
- &index) == TCL_OK)) {
- TclDecrRefCount(value2Ptr);
- tosPtr--;
- pcAdjustment = 1;
- goto lindexFastPath;
+ && !TclHasIntRep(value2Ptr, &tclListType)) {
+ int code;
+
+ DECACHE_STACK_INFO();
+ code = TclGetIntForIndexM(interp, value2Ptr, objc-1, &index);
+ CACHE_STACK_INFO();
+ if (code == TCL_OK) {
+ TclDecrRefCount(value2Ptr);
+ tosPtr--;
+ pcAdjustment = 1;
+ goto lindexFastPath;
+ }
+ Tcl_ResetResult(interp);
}
objResultPtr = TclLindexList(interp, valuePtr, value2Ptr);
@@ -5094,10 +5100,13 @@ TEBCresume(
*/
slength = Tcl_GetCharLength(valuePtr);
+ DECACHE_STACK_INFO();
if (TclGetIntForIndexM(interp, value2Ptr, slength-1, &index)!=TCL_OK) {
+ CACHE_STACK_INFO();
TRACE_ERROR(interp);
goto gotError;
}
+ CACHE_STACK_INFO();
if (index >= slength) {
TclNewObj(objResultPtr);
@@ -5134,13 +5143,21 @@ TEBCresume(
TRACE(("\"%.20s\" %.20s %.20s =>",
O2S(OBJ_AT_DEPTH(2)), O2S(OBJ_UNDER_TOS), O2S(OBJ_AT_TOS)));
slength = Tcl_GetCharLength(OBJ_AT_DEPTH(2)) - 1;
+
+ DECACHE_STACK_INFO();
if (TclGetIntForIndexM(interp, OBJ_UNDER_TOS, slength,
- &fromIdx) != TCL_OK
- || TclGetIntForIndexM(interp, OBJ_AT_TOS, slength,
+ &fromIdx) != TCL_OK) {
+ CACHE_STACK_INFO();
+ TRACE_ERROR(interp);
+ goto gotError;
+ }
+ if (TclGetIntForIndexM(interp, OBJ_AT_TOS, slength,
&toIdx) != TCL_OK) {
+ CACHE_STACK_INFO();
TRACE_ERROR(interp);
goto gotError;
}
+ CACHE_STACK_INFO();
if (fromIdx == TCL_INDEX_NONE) {
fromIdx = TCL_INDEX_START;
@@ -5223,14 +5240,17 @@ TEBCresume(
slength = Tcl_GetCharLength(valuePtr) - 1;
TRACE(("\"%.20s\" %s %s \"%.20s\" => ", O2S(valuePtr),
O2S(OBJ_UNDER_TOS), O2S(OBJ_AT_TOS), O2S(value3Ptr)));
+ DECACHE_STACK_INFO();
if (TclGetIntForIndexM(interp, OBJ_UNDER_TOS, slength,
&fromIdx) != TCL_OK
|| TclGetIntForIndexM(interp, OBJ_AT_TOS, slength,
&toIdx) != TCL_OK) {
+ CACHE_STACK_INFO();
TclDecrRefCount(value3Ptr);
TRACE_ERROR(interp);
goto gotError;
}
+ CACHE_STACK_INFO();
TclDecrRefCount(OBJ_AT_TOS);
(void) POP_OBJECT();
TclDecrRefCount(OBJ_AT_TOS);
diff --git a/generic/tclUtil.c b/generic/tclUtil.c
index 66caad5..11b557f 100644
--- a/generic/tclUtil.c
+++ b/generic/tclUtil.c
@@ -3517,7 +3517,7 @@ GetEndOffsetFromObj(
if ((t1 == TCL_NUMBER_INT) && (t2 == TCL_NUMBER_INT)) {
/* Both are wide, do wide-integer math */
if (*opPtr == '-') {
- if ((w2 == WIDE_MIN) && (interp != NULL)) {
+ if (w2 == WIDE_MIN) {
goto extreme;
}
w2 = -w2;
@@ -3539,13 +3539,6 @@ GetEndOffsetFromObj(
offset = WIDE_MIN;
}
}
- } else if (interp == NULL) {
- /*
- * We use an interp to do bignum index calculations.
- * If we don't get one, call all indices with bignums errors,
- * and rely on callers to handle it.
- */
- goto parseError;
} else {
/*
* At least one is big, do bignum math. Little reason to
@@ -3556,7 +3549,13 @@ GetEndOffsetFromObj(
Tcl_Obj *sum;
extreme:
- Tcl_ExprObj(interp, objPtr, &sum);
+ if (interp) {
+ Tcl_ExprObj(interp, objPtr, &sum);
+ } else {
+ Tcl_Interp *compute = Tcl_CreateInterp();
+ Tcl_ExprObj(compute, objPtr, &sum);
+ Tcl_DeleteInterp(compute);
+ }
TclGetNumberFromObj(NULL, sum, &cd, &numType);
if (numType == TCL_NUMBER_INT) {
diff --git a/tests/lindex.test b/tests/lindex.test
index 339d92c..32a30b2 100644
--- a/tests/lindex.test
+++ b/tests/lindex.test
@@ -449,6 +449,14 @@ test lindex-17.1 {Bug 1718580} -body {
lindex a end foo
} -match glob -result {bad index "foo"*} -returnCodes 1
+test lindex-18.0 {nested bytecode execution} -setup {
+ proc demo {i} {lindex {a b c} $i}
+} -body {
+ demo 0+0x10000000000000000
+} -cleanup {
+ rename demo {}
+}
+
catch { unset minus }
# cleanup
diff --git a/tests/string.test b/tests/string.test
index 99f147f..971b62e 100644
--- a/tests/string.test
+++ b/tests/string.test
@@ -1506,6 +1506,20 @@ test string-12.22.$noComp {string range, shimmering binary/index} {
test string-12.23.$noComp {string range, surrogates, bug [11ae2be95dac9417]} fullutf {
run {list [string range a\U100000b 1 1] [string range a\U100000b 2 2] [string range a\U100000b 3 3]}
} [list \U100000 b {}]
+test string-12.24.$noComp {bignum index arithmetic} -setup {
+ proc demo {i j} {string range fubar $i $j}
+} -cleanup {
+ rename demo {}
+} -body {
+ demo 2 0+0x10000000000000000
+} -result bar
+test string-12.25.$noComp {bignum index arithmetic} -setup {
+ proc demo {i j} {string range fubar $i $j}
+} -cleanup {
+ rename demo {}
+} -body {
+ demo 0x10000000000000000-0xffffffffffffffff 3
+} -result uba
test string-13.1.$noComp {string repeat} {
list [catch {run {string repeat}} msg] $msg
diff --git a/tests/util.test b/tests/util.test
index bcaf0a8..a73f554 100644
--- a/tests/util.test
+++ b/tests/util.test
@@ -739,6 +739,9 @@ test util-9.57 {Tcl_GetIntForIndex} {
test util-9.58 {Tcl_GetIntForIndex} -body {
string index abcd end--0x8000000000000000
} -result {}
+test util-9.59 {Tcl_GetIntForIndex} {
+ string index abcd 0-0x10000000000000000
+} {}
test util-10.1 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} {
convertDouble 0x0000000000000000