diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2010-05-27 14:21:17 +0800 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2010-05-27 14:21:17 +0800 |
commit | f74ae6869a7a9124c8a5cb5f3f64491d28200cc3 (patch) | |
tree | d354a116fe3bcbf9fc932076d516721796e74fc5 | |
parent | [VAR] Do not poplocalvars prematurely on regular utilities (diff) | |
download | dash-f74ae6869a7a9124c8a5cb5f3f64491d28200cc3.tar.gz dash-f74ae6869a7a9124c8a5cb5f3f64491d28200cc3.zip |
[REDIR] Move null redirect checks into caller
The null redirect checks were added as an optimisation to avoid unnecessary memory allocations. However, we could avoid this completely by simply making the caller avoid making a redirection unless it is not null. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | src/eval.c | 6 | ||||
-rw-r--r-- | src/redir.c | 14 |
3 files changed, 6 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog index 4fc35a6..1fd184b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,7 @@ * Fix poplocalvar on abnormal exit from function. * Do not poplocalvars prematurely on regular utilities. + * Move null redirect checks into caller. 2010-05-26 Herbert Xu <herbert@gondor.apana.org.au> diff --git a/src/eval.c b/src/eval.c index 337667f..59bded9 100644 --- a/src/eval.c +++ b/src/eval.c @@ -224,7 +224,8 @@ evaltree(union node *n, int flags) evaltree(n->nredir.n, flags & EV_TESTED); status = exitstatus; } - popredir(0); + if (n->nredir.redirect) + popredir(0); goto setstatus; case NCMD: #ifdef notyet @@ -879,7 +880,8 @@ raise: } out: - popredir(execcmd); + if (cmd->ncmd.redirect) + popredir(execcmd); unwindlocalvars(localvar_stop); if (lastarg) /* dsl: I think this is intended to be used to support diff --git a/src/redir.c b/src/redir.c index 54af96b..16decfc 100644 --- a/src/redir.c +++ b/src/redir.c @@ -72,12 +72,10 @@ MKINIT struct redirtab { struct redirtab *next; int renamed[10]; - int nullredirs; }; MKINIT struct redirtab *redirlist; -MKINIT int nullredirs; STATIC int openredirect(union node *); #ifdef notyet @@ -113,7 +111,6 @@ redirect(union node *redir, int flags) memory[i] = 0; memory[1] = flags & REDIR_BACKQ; #endif - nullredirs++; if (!redir) { return; } @@ -124,10 +121,8 @@ redirect(union node *redir, int flags) q = ckmalloc(sizeof (struct redirtab)); q->next = redirlist; redirlist = q; - q->nullredirs = nullredirs - 1; for (i = 0 ; i < 10 ; i++) q->renamed[i] = EMPTY; - nullredirs = 0; sv = q; } n = redir; @@ -343,8 +338,6 @@ popredir(int drop) struct redirtab *rp; int i; - if (--nullredirs >= 0) - return; INTOFF; rp = redirlist; for (i = 0 ; i < 10 ; i++) { @@ -364,7 +357,6 @@ popredir(int drop) } } redirlist = rp->next; - nullredirs = rp->nullredirs; ckfree(rp); INTON; } @@ -381,12 +373,8 @@ RESET { /* * Discard all saved file descriptors. */ - for (;;) { - nullredirs = 0; - if (!redirlist) - break; + while (redirlist) popredir(0); - } } #endif |