diff options
author | andreask <andreask> | 2013-11-29 18:14:45 (GMT) |
---|---|---|
committer | andreask <andreask> | 2013-11-29 18:14:45 (GMT) |
commit | 1f5985755c20048da00ec051a34bae3b3742026b (patch) | |
tree | b95f0ba2bd6c6aa53ac18ca904597634c853cb08 | |
parent | be6ed41db2f292c42a40c9e4da6bbc21884a3b54 (diff) | |
download | tcl-1f5985755c20048da00ec051a34bae3b3742026b.zip tcl-1f5985755c20048da00ec051a34bae3b3742026b.tar.gz tcl-1f5985755c20048da00ec051a34bae3b3742026b.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.c | 15 |
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; |