diff options
author | Steve Bennett <steveb@workware.net.au> | 2011-10-03 10:04:02 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2011-10-21 11:43:06 +1000 |
commit | 435b38eb1c90b32a2e99a89721943a1a00ac6788 (patch) | |
tree | b10e71a4b2e831e81b554a40b9c4e6dd1034d4b9 | |
parent | a61b052f4cf1f52c014879935f1a6db7fc5631be (diff) | |
download | jimtcl-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.c | 17 |
1 files changed, 9 insertions, 8 deletions
@@ -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; } |