summaryrefslogtreecommitdiffstats
path: root/generic/tclExecute.c
diff options
context:
space:
mode:
authorgriffin <briang42@easystreet.net>2023-07-12 03:06:54 (GMT)
committergriffin <briang42@easystreet.net>2023-07-12 03:06:54 (GMT)
commit62f180300bf74ab95b1cb7957c5ff85a66e24f6a (patch)
treea913bdd606f6c6f58fbeabee4de4d7c91fd87554 /generic/tclExecute.c
parent6c4636e94b19b9b0d5972e4e76048e3a94351f82 (diff)
downloadtcl-62f180300bf74ab95b1cb7957c5ff85a66e24f6a.zip
tcl-62f180300bf74ab95b1cb7957c5ff85a66e24f6a.tar.gz
tcl-62f180300bf74ab95b1cb7957c5ff85a66e24f6a.tar.bz2
Fix foreach bug [a34733451b].
Other code cleanup discovered by code review.
Diffstat (limited to 'generic/tclExecute.c')
-rw-r--r--generic/tclExecute.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index 973ba8e..b9cf44b 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -4685,6 +4685,7 @@ TEBCresume(
TRACE_ERROR(interp);
goto gotError;
}
+ CACHE_STACK_INFO();
Tcl_IncrRefCount(objResultPtr); // reference held here
goto lindexDone;
}
@@ -4768,14 +4769,18 @@ TEBCresume(
/* Decode end-offset index values. */
index = TclIndexDecode(opnd, length-1);
- /* Compute value @ index */
- DECACHE_STACK_INFO();
- if (TclObjTypeIndex(interp, valuePtr, index, &objResultPtr)!=TCL_OK) {
+ if (index >= 0 && index < length) {
+ /* Compute value @ index */
+ DECACHE_STACK_INFO();
+ if (TclObjTypeIndex(interp, valuePtr, index, &objResultPtr)!=TCL_OK) {
+ CACHE_STACK_INFO();
+ TRACE_ERROR(interp);
+ goto gotError;
+ }
CACHE_STACK_INFO();
- TRACE_ERROR(interp);
- goto gotError;
+ } else {
+ TclNewObj(objResultPtr);
}
- CACHE_STACK_INFO();
pcAdjustment = 5;
goto lindexFastPath2;
@@ -4854,9 +4859,8 @@ TEBCresume(
* Compute the new variable value.
*/
+ DECACHE_STACK_INFO();
if (TclObjTypeHasProc(valuePtr, setElementProc)) {
-
- DECACHE_STACK_INFO();
objResultPtr = TclObjTypeSetElement(interp,
valuePtr, numIndices,
&OBJ_AT_DEPTH(numIndices), OBJ_AT_TOS);
@@ -4985,8 +4989,8 @@ TEBCresume(
fromIdx = TclIndexDecode(fromIdx, objc - 1);
+ DECACHE_STACK_INFO();
if (TclObjTypeHasProc(valuePtr, sliceProc)) {
- DECACHE_STACK_INFO();
if (TclObjTypeSlice(interp, valuePtr, fromIdx, toIdx, &objResultPtr) != TCL_OK) {
objResultPtr = NULL;
}
@@ -6458,6 +6462,7 @@ TEBCresume(
i, O2S(listPtr), O2S(Tcl_GetObjResult(interp))));
goto gotError;
}
+ CACHE_STACK_INFO();
if (Tcl_IsShared(listPtr)) {
objPtr = TclDuplicatePureObj(
interp, listPtr, &tclListType);