diff options
author | griffin <briang42@easystreet.net> | 2023-07-12 03:06:54 (GMT) |
---|---|---|
committer | griffin <briang42@easystreet.net> | 2023-07-12 03:06:54 (GMT) |
commit | 62f180300bf74ab95b1cb7957c5ff85a66e24f6a (patch) | |
tree | a913bdd606f6c6f58fbeabee4de4d7c91fd87554 /generic/tclExecute.c | |
parent | 6c4636e94b19b9b0d5972e4e76048e3a94351f82 (diff) | |
download | tcl-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.c | 23 |
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); |