diff options
author | Barton E. Schaefer <schaefer@zsh.org> | 2016-10-29 11:56:50 -0700 |
---|---|---|
committer | Barton E. Schaefer <schaefer@zsh.org> | 2016-10-29 11:56:50 -0700 |
commit | ab81b98c49ace618f5a1607faf718e0b2e43948d (patch) | |
tree | 176def1f3a76e94c0b8d6821e410f702b571e373 | |
parent | 87c951c6bd5f889ec849ea45353969b407f8d5d5 (diff) | |
download | zsh-ab81b98c49ace618f5a1607faf718e0b2e43948d.tar.gz zsh-ab81b98c49ace618f5a1607faf718e0b2e43948d.tar.xz zsh-ab81b98c49ace618f5a1607faf718e0b2e43948d.zip |
39758: revise 39704 for array and hash parameters; more POSIXBUITINS tweaks for
export 39704 was commit 0f5e670, forgot to reference article number in that log. "typeset -p" outputs "typeset" for array and hash parameters, even when exported, because those types can be marked export but are never pushed to the enviroment. For POSIXBUILTINS, "export var" does not implicitly set $var, and its export state is preserved when assigned (but not when explicitly unset).
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | Src/builtin.c | 14 | ||||
-rw-r--r-- | Src/params.c | 16 |
3 files changed, 26 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog index f7487f01a..c453aee84 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2016-10-29 Barton E. Schaefer <schaefer@zsh.org> + + * 39758: Src/builtin.c, Src/params.c: revise 39704 to output + "typeset" for array and hash parameters, even when exported; for + POSIXBUILTINS, "export var" does not implicitly set $var, and its + export state is preserved when assigned (but not when explicitly + unset). + 2016-10-28 Daniel Shahaf <d.s@daniel.shahaf.name> * users/22036: Doc/Zsh/zle.yo: bracketed-paste: Document diff --git a/Src/builtin.c b/Src/builtin.c index 2db739ffc..986ace238 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -2008,11 +2008,12 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func), * handled in createparam(). Here we just avoid using it for the * present tests if it's unset. * - * POSIXBUILTINS horror: we need to retain the 'readonly' flag - * of an unset parameter. + * POSIXBUILTINS horror: we need to retain the 'readonly' or 'export' + * flags of an unset parameter. */ usepm = pm && (!(pm->node.flags & PM_UNSET) || - (isset(POSIXBUILTINS) && (pm->node.flags & PM_READONLY))); + (isset(POSIXBUILTINS) && + (pm->node.flags & (PM_READONLY|PM_EXPORTED)))); /* * We need to compare types with an existing pm if special, @@ -2135,7 +2136,8 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func), /* * Stricter rules about retaining readonly attribute in this case. */ - if ((on & PM_READONLY) && (!usepm || (pm->node.flags & PM_UNSET)) && + if ((on & (PM_READONLY|PM_EXPORTED)) && + (!usepm || (pm->node.flags & PM_UNSET)) && !ASG_VALUEP(asg)) on |= PM_UNSET; else if (usepm && (pm->node.flags & PM_READONLY) && @@ -2143,6 +2145,10 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func), zerr("read-only variable: %s", pm->node.nam); return NULL; } + /* This is handled by createparam(): + if (usepm && (pm->node.flags & PM_EXPORTED) && !(off & PM_EXPORTED)) + on |= PM_EXPORTED; + */ } /* diff --git a/Src/params.c b/Src/params.c index 3084b1ffe..330f22bb2 100644 --- a/Src/params.c +++ b/Src/params.c @@ -940,7 +940,10 @@ createparam(char *name, int flags) zerr("%s: restricted", name); return NULL; } - if (!(oldpm->node.flags & PM_UNSET) || (oldpm->node.flags & PM_SPECIAL)) { + if (!(oldpm->node.flags & PM_UNSET) || + (oldpm->node.flags & PM_SPECIAL) || + /* POSIXBUILTINS horror: we need to retain 'export' flags */ + (isset(POSIXBUILTINS) && (oldpm->node.flags & PM_EXPORTED))) { oldpm->node.flags &= ~PM_UNSET; if ((oldpm->node.flags & PM_SPECIAL) && oldpm->ename) { Param altpm = @@ -5225,10 +5228,6 @@ printparamvalue(Param p, int printflags) { char *t, **u; - if ((p->node.flags & PM_EXPORTED) && !p->env) { - putchar('\n'); - return; - } if (printflags & PRINT_KV_PAIR) putchar(' '); else @@ -5332,7 +5331,8 @@ printparamnode(HashNode hn, int printflags) } if (locallevel && p->level >= locallevel) { printf("typeset "); /* printf("local "); */ - } else if (p->node.flags & PM_EXPORTED) { + } else if ((p->node.flags & PM_EXPORTED) && + !(p->node.flags & (PM_ARRAY|PM_HASHED))) { printf("export "); } else if (locallevel) { printf("typeset -g "); @@ -5350,8 +5350,8 @@ printparamnode(HashNode hn, int printflags) if (pmptr->flags & PMTF_TEST_LEVEL) { if (p->level) doprint = 1; - } else if ((pmptr->binflag != PM_EXPORTED || - ((p->node.flags & PM_LOCAL) || p->level)) && + } else if ((pmptr->binflag != PM_EXPORTED || p->level || + (p->node.flags & (PM_LOCAL|PM_ARRAY|PM_HASHED))) && (p->node.flags & pmptr->binflag)) doprint = 1; |