From 435b38eb1c90b32a2e99a89721943a1a00ac6788 Mon Sep 17 00:00:00 2001 From: Steve Bennett Date: Mon, 3 Oct 2011 10:04:02 +1000 Subject: 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 --- jim.c | 17 +++++++++-------- 1 file 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; } -- cgit v1.1