diff options
author | apnadkarni <apnmbx-wits@yahoo.com> | 2023-07-27 16:26:38 (GMT) |
---|---|---|
committer | apnadkarni <apnmbx-wits@yahoo.com> | 2023-07-27 16:26:38 (GMT) |
commit | e253c3eed9122505c8c33fa337ccab63a75675c2 (patch) | |
tree | 92a176fadbeb5743cb12c73279115a05171cfd7d /generic/tclExecute.c | |
parent | 7f10145e496d9a3b8973e2c9d92c606d504fa0f8 (diff) | |
parent | af64c95042a9706c6d45118c8f341aafa5c26686 (diff) | |
download | tcl-e253c3eed9122505c8c33fa337ccab63a75675c2.zip tcl-e253c3eed9122505c8c33fa337ccab63a75675c2.tar.gz tcl-e253c3eed9122505c8c33fa337ccab63a75675c2.tar.bz2 |
Merge trunk
Diffstat (limited to 'generic/tclExecute.c')
-rw-r--r-- | generic/tclExecute.c | 52 |
1 files changed, 40 insertions, 12 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c index f953cf5..097c60e 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); @@ -6537,11 +6542,18 @@ TEBCresume( for (i = 0; i < numLists; i++) { varListPtr = infoPtr->varLists[i]; numVars = varListPtr->numVars; + int hasAbstractList; listPtr = OBJ_AT_DEPTH(listTmpDepth); + hasAbstractList = TclObjTypeHasProc(listPtr, indexProc) != 0; DECACHE_STACK_INFO(); - status = TclListObjGetElementsM( - interp, listPtr, &listLen, &elements); + if (hasAbstractList) { + status = Tcl_ListObjLength(interp, listPtr, &listLen); + elements = NULL; + } else { + status = TclListObjGetElementsM( + interp, listPtr, &listLen, &elements); + } if (status != TCL_OK) { CACHE_STACK_INFO(); goto gotError; @@ -6554,7 +6566,23 @@ TEBCresume( if (valIndex >= listLen) { TclNewObj(valuePtr); } else { - valuePtr = elements[valIndex]; + DECACHE_STACK_INFO(); + if (elements) { + valuePtr = elements[valIndex]; + } else { + status = Tcl_ListObjIndex( + interp, listPtr, valIndex, &valuePtr); + if (status != TCL_OK) { + /* Could happen for abstract lists */ + CACHE_STACK_INFO(); + goto gotError; + } + if (valuePtr == NULL) { + /* Permitted for Tcl_LOI to return NULL */ + TclNewObj(valuePtr); + } + } + CACHE_STACK_INFO(); } varIndex = varListPtr->varIndexes[j]; |