summaryrefslogtreecommitdiffstats
path: root/generic/tclExecute.c
diff options
context:
space:
mode:
authorapnadkarni <apnmbx-wits@yahoo.com>2023-07-27 16:26:38 (GMT)
committerapnadkarni <apnmbx-wits@yahoo.com>2023-07-27 16:26:38 (GMT)
commite253c3eed9122505c8c33fa337ccab63a75675c2 (patch)
tree92a176fadbeb5743cb12c73279115a05171cfd7d /generic/tclExecute.c
parent7f10145e496d9a3b8973e2c9d92c606d504fa0f8 (diff)
parentaf64c95042a9706c6d45118c8f341aafa5c26686 (diff)
downloadtcl-e253c3eed9122505c8c33fa337ccab63a75675c2.zip
tcl-e253c3eed9122505c8c33fa337ccab63a75675c2.tar.gz
tcl-e253c3eed9122505c8c33fa337ccab63a75675c2.tar.bz2
Merge trunk
Diffstat (limited to 'generic/tclExecute.c')
-rw-r--r--generic/tclExecute.c52
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];