1
0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-11-19 21:44:11 +01:00

Fix function stack unwinding on autoload failures.

This commit is contained in:
Bart Schaefer 2001-07-09 16:20:53 +00:00
parent 003ec8c7e8
commit 7457bdc19d
2 changed files with 12 additions and 6 deletions

@ -6,6 +6,11 @@
do this sometimes in order for existing $LINENO to show through.
This seems to cause more problems than it solves.
2001-07-09 Bart Schaefer <schaefer@zsh.org>
* 15321: Src/exec.c: Fix line numbers in an error message; unwind
function context properly on obscure autoloading failures.
2001-07-07 Bart Schaefer <schaefer@zsh.org>
* 15308: Src/builtin.c: Fix infinite loop on `r OLD=NEW' when OLD

@ -3273,7 +3273,10 @@ loadautofn(Shfunc shf, int fksh, int autol)
execode(prog, 1, 0);
shf = (Shfunc) shfunctab->getnode(shfunctab, n);
if (!shf || (shf->flags & PM_UNDEFINED)) {
/* We're not actually in the function; decrement locallevel */
locallevel--;
zwarn("%s: function not defined by file", n, 0);
locallevel++;
popheap();
return NULL;
}
@ -3359,9 +3362,7 @@ doshfunc(char *name, Eprog prog, LinkList doshargs, int flags, int noreturnval)
if(++funcdepth > MAX_FUNCTION_DEPTH)
{
zerr("maximum nested function level reached", NULL, 0);
scriptname = oldscriptname;
popheap();
return;
goto undoshfunc;
}
#endif
fstack.name = dupstring(name);
@ -3382,15 +3383,15 @@ doshfunc(char *name, Eprog prog, LinkList doshargs, int flags, int noreturnval)
errflag = 1;
else
lastval = 1;
popheap();
scriptname = oldscriptname;
return;
goto doneshfunc;
}
prog = shf->funcdef;
}
runshfunc(prog, wrappers, fstack.name);
doneshfunc:
funcstack = fstack.prev;
#ifdef MAX_FUNCTION_DEPTH
undoshfunc:
--funcdepth;
#endif
if (retflag) {