summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2013-12-17 21:19:36 (GMT)
committerdgp <dgp@users.sourceforge.net>2013-12-17 21:19:36 (GMT)
commit974c8356eef0f2ca083bea7c55750256592e1f66 (patch)
treeacf06ae94ce8c105feaa936ad3a98c6a308bf3d2
parentf3e8b534b38e07387ab2c0c94653917863c57411 (diff)
downloadtcl-974c8356eef0f2ca083bea7c55750256592e1f66.zip
tcl-974c8356eef0f2ca083bea7c55750256592e1f66.tar.gz
tcl-974c8356eef0f2ca083bea7c55750256592e1f66.tar.bz2
Factor out the level offsetting into a final pass. Let the first
pass of the "chain" operation just stitch things together and count levels.
-rw-r--r--generic/tclCmdIL.c43
1 files changed, 27 insertions, 16 deletions
diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c
index 28fb3ce..e26c211 100644
--- a/generic/tclCmdIL.c
+++ b/generic/tclCmdIL.c
@@ -104,7 +104,7 @@ typedef struct SortInfo {
* Forward declarations for procedures defined in this file:
*/
-static void CmdFrameChain(CoroutineData *corPtr);
+static int CmdFrameChain(CoroutineData *corPtr);
static int DictionaryCompare(const char *left, const char *right);
static int IfConditionCallback(ClientData data[],
Tcl_Interp *interp, int result);
@@ -1140,45 +1140,47 @@ TclInfoExistsCmd(
*----------------------------------------------------------------------
*/
-static void
+static int
Chain(
CmdFrame **cmdFramePtrPtr,
CoroutineData *corPtr)
{
CmdFrame *tailPtr = corPtr->caller.cmdFramePtr;
CmdFrame *runPtr = *cmdFramePtrPtr;
- int offset;
if (tailPtr == NULL) {
- return;
+ /* Think this can't happen. */
+ return 0;
}
if (runPtr == NULL) {
+ int toReturn = tailPtr->level;
+
*cmdFramePtrPtr = tailPtr;
- return;
+ tailPtr->level = 0;
+ return toReturn;
}
- offset = tailPtr->level;
-
while (runPtr->nextPtr) {
- runPtr->level += offset;
runPtr = runPtr->nextPtr;
}
- runPtr->level += offset;
runPtr->nextPtr = tailPtr;
+ return tailPtr->level;
}
-static void
+static int
CmdFrameChain(
CoroutineData *corPtr)
{
CmdFrame **cmdFramePtrPtr = &corPtr->caller.cmdFramePtr;
+ int sum = 0;
corPtr = corPtr->callerEEPtr->corPtr;
if (corPtr) {
- CmdFrameChain(corPtr);
- Chain(cmdFramePtrPtr, corPtr);
+ sum += CmdFrameChain(corPtr);
+ sum += Chain(cmdFramePtrPtr, corPtr);
}
+ return sum;
}
static int
@@ -1189,9 +1191,10 @@ InfoFrameCmd(
Tcl_Obj *const objv[]) /* Argument objects. */
{
Interp *iPtr = (Interp *) interp;
- int level, topLevel, code = TCL_OK;
+ int level, code = TCL_OK;
CmdFrame *framePtr, **cmdFramePtrPtr = &iPtr->cmdFramePtr;
CoroutineData *corPtr = iPtr->execEnvPtr->corPtr;
+ int topLevel = iPtr->cmdFramePtr ? iPtr->cmdFramePtr->level : 0;
if (objc > 2) {
Tcl_WrongNumArgs(interp, 1, objv, "?number?");
@@ -1199,11 +1202,19 @@ InfoFrameCmd(
}
if (corPtr) {
- CmdFrameChain(corPtr);
- Chain(cmdFramePtrPtr, corPtr);
+ topLevel += CmdFrameChain(corPtr);
+ topLevel += Chain(cmdFramePtrPtr, corPtr);
}
- topLevel = iPtr->cmdFramePtr ? iPtr->cmdFramePtr->level : 0;
+ framePtr = iPtr->cmdFramePtr;
+ while (framePtr) {
+ framePtr->level = topLevel--;
+ framePtr = framePtr->nextPtr;
+ }
+ if (topLevel) {
+ Tcl_Panic("Broken frame level calculation");
+ }
+ topLevel = iPtr->cmdFramePtr->level;
if (objc == 1) {
/*