diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2010-05-26 18:54:19 +0800 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2010-05-26 18:54:19 +0800 |
commit | 95a60b2936e8835963bfb08eadc0edf9dddf0498 (patch) | |
tree | 7c7843fe6f74a7b93131d00fc49a799497c91863 /src/eval.c | |
parent | [VAR] Move unsetvar functionality into setvareq (diff) | |
download | dash-95a60b2936e8835963bfb08eadc0edf9dddf0498.tar.gz dash-95a60b2936e8835963bfb08eadc0edf9dddf0498.zip |
[VAR] Replace cmdenviron with localvars
This patch replaces the cmdenviron mechanism for temporary command variables with the localvars mechanism used by functions. This reduces code size, and more importantly, makes the variable assignment take effect immediately as required by POSIX. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to '')
-rw-r--r-- | src/eval.c | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/src/eval.c b/src/eval.c index 8d2767c..a6981a9 100644 --- a/src/eval.c +++ b/src/eval.c @@ -77,7 +77,6 @@ static int funcnest; /* depth of function calls */ char *commandname; -struct strlist *cmdenviron; int exitstatus; /* exit status of last command */ int back_exitstatus; /* exit status of backquoted command */ @@ -704,6 +703,7 @@ evalcommand(union node *cmd, int flags) /* First expand the arguments. */ TRACE(("evalcommand(0x%lx, %d) called\n", (long)cmd, flags)); setstackmark(&smark); + pushlocalvars(); back_exitstatus = 0; cmdentry.cmdtype = CMDBUILTIN; @@ -748,6 +748,8 @@ evalcommand(union node *cmd, int flags) spp = varlist.lastp; expandarg(argp, &varlist, EXP_VARTILDE); + mklocal((*spp)->text); + /* * Modify the command lookup path, if a PATH= assignment * is present @@ -835,6 +837,7 @@ bail: if (forkshell(jp, cmd, FORK_FG) != 0) { exitstatus = waitforjob(jp); INTON; + poplocalvars(0); break; } FORCEINTON; @@ -844,17 +847,9 @@ bail: /* NOTREACHED */ case CMDBUILTIN: - cmdenviron = varlist.list; - if (cmdenviron) { - struct strlist *list = cmdenviron; - int i = VNOSET; - if (spclbltin > 0 || argc == 0) { - i = 0; - if (execcmd && argc > 1) - i = VEXPORT; - } - listsetvar(list, i); - } + poplocalvars(spclbltin > 0 || argc == 0); + if (execcmd && argc > 1) + listsetvar(varlist.list, VEXPORT); if (evalbltin(cmdentry.u.cmd, argc, argv, flags)) { int status; int i; @@ -875,7 +870,7 @@ raise: break; case CMDFUNCTION: - listsetvar(varlist.list, 0); + poplocalvars(1); if (evalfun(cmdentry.u.func, argc, argv, flags)) goto raise; break; @@ -949,7 +944,7 @@ evalfun(struct funcnode *func, int argc, char **argv, int flags) shellparam.optoff = -1; pushlocalvars(); evaltree(&func->n, flags & EV_TESTED); - poplocalvars(); + poplocalvars(0); funcdone: INTOFF; funcnest--; |