summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--Src/builtin.c14
-rw-r--r--Src/params.c16
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;