summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandreask <andreask>2013-11-29 18:14:45 (GMT)
committerandreask <andreask>2013-11-29 18:14:45 (GMT)
commit1f5985755c20048da00ec051a34bae3b3742026b (patch)
treeb95f0ba2bd6c6aa53ac18ca904597634c853cb08
parentbe6ed41db2f292c42a40c9e4da6bbc21884a3b54 (diff)
downloadtcl-bug_0b874c344d_ak_info_frame_coro.zip
tcl-bug_0b874c344d_ak_info_frame_coro.tar.gz
tcl-bug_0b874c344d_ak_info_frame_coro.tar.bz2
Modified info frame's coro handling to allow for a caller coro without cmdFramePtr (toplevel)bug_0b874c344d_ak_info_frame_coro
-rw-r--r--generic/tclCmdIL.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c
index fa4ead4..5c17ec9 100644
--- a/generic/tclCmdIL.c
+++ b/generic/tclCmdIL.c
@@ -1147,7 +1147,7 @@ InfoFrameCmd(
Tcl_Obj *const objv[]) /* Argument objects. */
{
Interp *iPtr = (Interp *) interp;
- int level, topLevel, code = TCL_OK;
+ int corOffset, level, topLevel, code = TCL_OK;
CmdFrame *runPtr, *framePtr;
CoroutineData *corPtr = iPtr->execEnvPtr->corPtr;
@@ -1170,16 +1170,21 @@ InfoFrameCmd(
runPtr = iPtr->cmdFramePtr;
+ corOffset = (corPtr->caller.cmdFramePtr
+ ? corPtr->caller.cmdFramePtr->level
+ : 0);
+
/* TODO - deal with overflow */
- topLevel += corPtr->caller.cmdFramePtr->level;
+ topLevel += corOffset;
while (runPtr) {
- runPtr->level += corPtr->caller.cmdFramePtr->level;
+ runPtr->level += corOffset;
lastPtr = runPtr;
runPtr = runPtr->nextPtr;
}
if (lastPtr) {
lastPtr->nextPtr = corPtr->caller.cmdFramePtr;
} else {
+ /* (**) !lastPtr => 'iPtr->cmdFramePtr == NULL' */
iPtr->cmdFramePtr = corPtr->caller.cmdFramePtr;
}
}
@@ -1232,13 +1237,13 @@ InfoFrameCmd(
done:
if (corPtr) {
-
if (iPtr->cmdFramePtr == corPtr->caller.cmdFramePtr) {
+ /* This is right, see (**) at the beginning of the function */
iPtr->cmdFramePtr = NULL;
} else {
runPtr = iPtr->cmdFramePtr;
while (runPtr->nextPtr != corPtr->caller.cmdFramePtr) {
- runPtr->level -= corPtr->caller.cmdFramePtr->level;
+ runPtr->level -= corOffset;
runPtr = runPtr->nextPtr;
}
runPtr->level = 1;