ash: [EXPAND] Optimise nulonly away and just use quoted as before
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 1 Oct 2016 19:02:06 +0000 (21:02 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 1 Oct 2016 19:02:06 +0000 (21:02 +0200)
Upstream commit:

    Date: Wed, 8 Oct 2014 20:09:56 +0800
    [EXPAND] Optimise nulonly away and just use quoted as before

    This patch makes a small optimisation by using the same value for
    quoted between evalvar and varvalue by eliminating nulonly and
    passing along quoted instead.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c

index d830e3962425073db48abfd49f1baea88969100d..d320c38acbba02755b901a486e91211695e660af 100644 (file)
@@ -6606,22 +6606,19 @@ subevalvar(char *p, char *varname, int strloc, int subtype,
  * ash -c 'echo ${#1#}'  name:'1=#'
  */
 static NOINLINE ssize_t
-varvalue(char *name, int varflags, int flags, struct strlist *var_str_list, int *nulonly)
+varvalue(char *name, int varflags, int flags, struct strlist *var_str_list, int *quotedp)
 {
        const char *p;
        int num;
        int i;
        ssize_t len = 0;
        int sep;
-       int quoted = flags & EXP_QUOTED;
+       int quoted = *quotedp;
        int subtype = varflags & VSTYPE;
        int discard = subtype == VSPLUS || subtype == VSLENGTH;
        int quotes = (discard ? 0 : (flags & QUOTES_ESC)) | QUOTES_KEEPNUL;
        int syntax = quoted ? DQSYNTAX : BASESYNTAX;
 
-       sep = *nulonly ? (flags & EXP_FULL) << CHAR_BIT : 0;
-       *nulonly = 0;
-
        switch (*name) {
        case '$':
                num = rootpid;
@@ -6658,6 +6655,7 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list, int
                char **ap;
                char sepc;
 
+               sep = 0;
                if (quoted && (flags & EXP_FULL)) {
                        /* note: this is not meant as PEOF value */
                        sep = 1 << CHAR_BIT;
@@ -6665,11 +6663,14 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list, int
                }
                /* fall through */
        case '*':
-               sep |= ifsset() ? (unsigned char)(ifsval()[0]) : ' ';
+               sep = ifsset() ? (unsigned char)(ifsval()[0]) : ' ';
+               if (!quoted) {
  param:
-               ap = shellparam.p;
+                       sep |= (flags & EXP_FULL) << CHAR_BIT;
+               }
                sepc = sep;
-               *nulonly = !sepc;
+               *quotedp = !sepc;
+               ap = shellparam.p;
                if (!ap)
                        return -1;
                while ((p = *ap++) != NULL) {
@@ -6759,7 +6760,6 @@ evalvar(char *p, int flag, struct strlist *var_str_list)
        char subtype;
        int quoted;
        char easy;
-       int nulonly;
        char *var;
        int patloc;
        int startloc;
@@ -6770,12 +6770,11 @@ evalvar(char *p, int flag, struct strlist *var_str_list)
        quoted = flag & EXP_QUOTED;
        var = p;
        easy = (!quoted || (*var == '@' && shellparam.nparam));
-       nulonly = easy;
        startloc = expdest - (char *)stackblock();
        p = strchr(p, '=') + 1; //TODO: use var_end(p)?
 
  again:
-       varlen = varvalue(var, varflags, flag, var_str_list, &nulonly);
+       varlen = varvalue(var, varflags, flag, var_str_list, &quoted);
        if (varflags & VSNUL)
                varlen--;
 
@@ -6824,7 +6823,7 @@ evalvar(char *p, int flag, struct strlist *var_str_list)
  record:
                if (!easy)
                        goto end;
-               recordregion(startloc, expdest - (char *)stackblock(), nulonly);
+               recordregion(startloc, expdest - (char *)stackblock(), quoted);
                goto end;
        }