summaryrefslogtreecommitdiffstats
path: root/generic/tclExecute.c
diff options
context:
space:
mode:
authorgriffin <briang42@easystreet.net>2023-06-20 01:28:25 (GMT)
committergriffin <briang42@easystreet.net>2023-06-20 01:28:25 (GMT)
commitbe39d74ee7ad07b23a55da56bcc926a5fcd1e1dc (patch)
treea0c4c577864e8a1f879d8642f026c6a1d09404c1 /generic/tclExecute.c
parentd8ce1ffde8b833f9a255676b3a916df861c3d8da (diff)
downloadtcl-be39d74ee7ad07b23a55da56bcc926a5fcd1e1dc.zip
tcl-be39d74ee7ad07b23a55da56bcc926a5fcd1e1dc.tar.gz
tcl-be39d74ee7ad07b23a55da56bcc926a5fcd1e1dc.tar.bz2
Fix crash in BC execution when str concat and abstract list lindex operations have recursive BC execution.
Add testcase for this bug.
Diffstat (limited to 'generic/tclExecute.c')
-rw-r--r--generic/tclExecute.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index 80c7e51..336815d 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -2598,13 +2598,16 @@ TEBCresume(
case INST_STR_CONCAT1:
opnd = TclGetUInt1AtPtr(pc+1);
+ DECACHE_STACK_INFO();
objResultPtr = TclStringCat(interp, opnd, &OBJ_AT_DEPTH(opnd-1),
TCL_STRING_IN_PLACE);
if (objResultPtr == NULL) {
+ CACHE_STACK_INFO();
TRACE_ERROR(interp);
goto gotError;
}
+ CACHE_STACK_INFO();
TRACE_WITH_OBJ(("%u => ", opnd), objResultPtr);
NEXT_INST_V(2, opnd, 1);
break;
@@ -4670,6 +4673,7 @@ TEBCresume(
/* special case for AbstractList */
if (TclObjTypeHasProc(valuePtr,indexProc)) {
+ DECACHE_STACK_INFO();
length = TclObjTypeHasProc(valuePtr, lengthProc)(valuePtr);
if (TclGetIntForIndexM(interp, value2Ptr, length-1, &index)!=TCL_OK) {
CACHE_STACK_INFO();
@@ -4765,11 +4769,13 @@ TEBCresume(
index = TclIndexDecode(opnd, length-1);
/* Compute value @ index */
+ DECACHE_STACK_INFO();
if (Tcl_ObjTypeIndex(interp, valuePtr, index, &objResultPtr)!=TCL_OK) {
CACHE_STACK_INFO();
TRACE_ERROR(interp);
goto gotError;
}
+ CACHE_STACK_INFO();
pcAdjustment = 5;
goto lindexFastPath2;
@@ -4850,6 +4856,7 @@ TEBCresume(
if (TclObjTypeHasProc(valuePtr, setElementProc)) {
+ DECACHE_STACK_INFO();
objResultPtr = Tcl_ObjTypeSetElement(interp,
valuePtr, numIndices,
&OBJ_AT_DEPTH(numIndices), OBJ_AT_TOS);
@@ -4858,6 +4865,7 @@ TEBCresume(
&OBJ_AT_DEPTH(numIndices), OBJ_AT_TOS);
}
if (!objResultPtr) {
+ CACHE_STACK_INFO();
TRACE_ERROR(interp);
goto gotError;
}
@@ -4865,7 +4873,7 @@ TEBCresume(
/*
* Set result.
*/
-
+ CACHE_STACK_INFO();
TRACE_APPEND(("\"%.30s\"\n", O2S(objResultPtr)));
NEXT_INST_V(5, numIndices+1, -1);
@@ -4978,6 +4986,7 @@ TEBCresume(
fromIdx = TclIndexDecode(fromIdx, objc - 1);
if (TclObjTypeHasProc(valuePtr, sliceProc)) {
+ DECACHE_STACK_INFO();
if (Tcl_ObjTypeSlice(interp, valuePtr, fromIdx, toIdx, &objResultPtr) != TCL_OK) {
objResultPtr = NULL;
}
@@ -4985,10 +4994,12 @@ TEBCresume(
objResultPtr = TclListObjRange(interp, valuePtr, fromIdx, toIdx);
}
if (objResultPtr == NULL) {
+ CACHE_STACK_INFO();
TRACE_ERROR(interp);
goto gotError;
}
+ CACHE_STACK_INFO();
TRACE_APPEND(("\"%.30s\"", O2S(objResultPtr)));
NEXT_INST_F(9, 1, 1);
@@ -5015,10 +5026,13 @@ TEBCresume(
do {
if (isAbstractList) {
+ DECACHE_STACK_INFO();
if (Tcl_ObjTypeIndex(interp, value2Ptr, i, &o) != TCL_OK) {
+ CACHE_STACK_INFO();
TRACE_ERROR(interp);
goto gotError;
}
+ CACHE_STACK_INFO();
} else {
Tcl_ListObjIndex(NULL, value2Ptr, i, &o);
}
@@ -6488,7 +6502,7 @@ TEBCresume(
pc += 5 - infoPtr->loopCtTemp;
- case INST_FOREACH_STEP:
+ case INST_FOREACH_STEP: /* TODO: address abstract list indexing here! */
/*
* "Step" a foreach loop (i.e., begin its next iteration) by assigning
* the next value list element to each loop var.