aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2011-10-03 10:04:02 +1000
committerSteve Bennett <steveb@workware.net.au>2011-10-21 11:43:06 +1000
commit435b38eb1c90b32a2e99a89721943a1a00ac6788 (patch)
treeb10e71a4b2e831e81b554a40b9c4e6dd1034d4b9
parenta61b052f4cf1f52c014879935f1a6db7fc5631be (diff)
downloadjimtcl-435b38eb1c90b32a2e99a89721943a1a00ac6788.zip
jimtcl-435b38eb1c90b32a2e99a89721943a1a00ac6788.tar.gz
jimtcl-435b38eb1c90b32a2e99a89721943a1a00ac6788.tar.bz2
Defer deleting local procs until after tailcall
It is useful to be able to tailcall a local proc. Thus deletion of local procs need to be deferred until tailcall processing is done. Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/jim.c b/jim.c
index 23d249b..9a6f556 100644
--- a/jim.c
+++ b/jim.c
@@ -10239,6 +10239,10 @@ static int JimCallProcedure(Jim_Interp *interp, Jim_Cmd *cmd, Jim_Obj *fileNameO
Jim_IncrRefCount(cmd->u.proc.bodyObjPtr);
interp->framePtr = callFramePtr;
+ /* Install a new stack for local procs */
+ prevLocalProcs = interp->localProcs;
+ interp->localProcs = NULL;
+
/* How many optional args are available */
optargs = (argc - 1 - cmd->u.proc.reqArity);
@@ -10281,17 +10285,9 @@ static int JimCallProcedure(Jim_Interp *interp, Jim_Cmd *cmd, Jim_Obj *fileNameO
}
}
- /* Install a new stack for local procs */
- prevLocalProcs = interp->localProcs;
- interp->localProcs = NULL;
-
/* Eval the body */
retcode = Jim_EvalObj(interp, cmd->u.proc.bodyObjPtr);
- /* Delete any local procs */
- JimDeleteLocalProcs(interp);
- interp->localProcs = prevLocalProcs;
-
badargset:
/* Destroy the callframe */
interp->framePtr = interp->framePtr->parentCallFrame;
@@ -10330,6 +10326,11 @@ badargset:
interp->errorProc = argv[0];
Jim_IncrRefCount(interp->errorProc);
}
+
+ /* Delete any local procs */
+ JimDeleteLocalProcs(interp);
+ interp->localProcs = prevLocalProcs;
+
return retcode;
}