35623: All is_array assignments should be treated as having a value.

This commit is contained in:
Peter Stephenson 2015-06-27 17:46:03 +01:00
parent 2f0213d733
commit 420bfcfc66
4 changed files with 51 additions and 25 deletions

View file

@ -1,3 +1,9 @@
2015-06-27 Peter Stephenson <p.w.stephenson@ntlworld.com>
* 35623: Src/builtin.c, Src/zsh.h, Test/B02typeset.ztst: 35610
was incomplete: all is_array asignments should be treated as
having a value.
2015-06-26 Barton E. Schaefer <schaefer@zsh.org>
* 35626: Doc/Zsh/options.yo: update POSIX_CD to note that it is on

View file

@ -452,11 +452,13 @@ execbuiltin(LinkList args, LinkList assigns, Builtin bn)
if (asg->is_array) {
LinkNode arrnode;
fprintf(xtrerr, "=(");
for (arrnode = firstnode(asg->value.array);
arrnode;
incnode(arrnode)) {
fputc(' ', xtrerr);
quotedzputs((char *)getdata(arrnode), xtrerr);
if (asg->value.array) {
for (arrnode = firstnode(asg->value.array);
arrnode;
incnode(arrnode)) {
fputc(' ', xtrerr);
quotedzputs((char *)getdata(arrnode), xtrerr);
}
}
fprintf(xtrerr, " )");
} else if (asg->value.scalar) {
@ -1975,7 +1977,7 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func),
int on, int off, int roff, Asgment asg, Param altpm,
Options ops, int joinchar)
{
int usepm, tc, keeplocal = 0, newspecial = NS_NONE, readonly;
int usepm, tc, keeplocal = 0, newspecial = NS_NONE, readonly, dont_set = 0;
char *subscript;
/*
@ -2131,8 +2133,9 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func),
*/
if (usepm) {
if (asg->is_array ?
(asg->value.array && !(PM_TYPE(pm->node.flags) & (PM_ARRAY|PM_HASHED))) :
(asg->value.scalar && (PM_TYPE(pm->node.flags & (PM_ARRAY|PM_HASHED))))) {
!(PM_TYPE(pm->node.flags) & (PM_ARRAY|PM_HASHED)) :
(asg->value.scalar && (PM_TYPE(pm->node.flags &
(PM_ARRAY|PM_HASHED))))) {
zerrnam(cname, "%s: inconsistent type for assignment", pname);
return NULL;
}
@ -2141,8 +2144,7 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func),
if (OPT_ISSET(ops,'p'))
paramtab->printnode(&pm->node, PRINT_TYPESET);
else if (!OPT_ISSET(ops,'g') &&
(unset(TYPESETSILENT) || OPT_ISSET(ops,'m'))
&& !asg->is_array)
(unset(TYPESETSILENT) || OPT_ISSET(ops,'m')))
paramtab->printnode(&pm->node, PRINT_INCLUDEVALUE);
return pm;
}
@ -2199,9 +2201,10 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func),
DPUTS(ASG_ARRAYP(asg), "BUG: typeset got array value where scalar expected");
if (asg->value.scalar && !(pm = setsparam(pname, ztrdup(asg->value.scalar))))
return NULL;
} else if (asg->value.array) {
DPUTS(!ASG_ARRAYP(asg), "BUG: typeset got scalar value where array expected");
if (!(pm = setaparam(pname, zlinklist2array(asg->value.array))))
} else if (asg->is_array) {
if (!(pm = setaparam(pname, asg->value.array ?
zlinklist2array(asg->value.array) :
mkarray(NULL))))
return NULL;
}
pm->node.flags |= (on & PM_READONLY);
@ -2211,7 +2214,7 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func),
}
if (asg->is_array ?
(asg->value.array && !(on & (PM_ARRAY|PM_HASHED))) :
!(on & (PM_ARRAY|PM_HASHED)) :
(asg->value.scalar && (on & (PM_ARRAY|PM_HASHED)))) {
zerrnam(cname, "%s: inconsistent type for assignment", pname);
return NULL;
@ -2343,20 +2346,21 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func),
*/
if (!(pm = setsparam(pname, ztrdup(asg->value.scalar ? asg->value.scalar : ""))))
return NULL;
asg->value.scalar = NULL;
dont_set = 1;
asg->is_array = 0;
keeplocal = 0;
on = pm->node.flags;
} else if (PM_TYPE(on) == PM_ARRAY && ASG_ARRAYP(asg)) {
if (!(pm = setaparam(pname, asg->value.array ? zlinklist2array(asg->value.array) :
if (!(pm = setaparam(pname, asg->value.array ?
zlinklist2array(asg->value.array) :
mkarray(NULL))))
return NULL;
asg->value.array = NULL;
dont_set = 1;
keeplocal = 0;
on = pm->node.flags;
} else {
zerrnam(cname,
"%s: inconsistent array element or slice assignment", pname);
"%s: i1;nconsistent array element or slice assignment", pname);
return NULL;
}
}
@ -2422,11 +2426,13 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func),
pm->level = keeplocal;
else if (on & PM_LOCAL)
pm->level = locallevel;
if (ASG_VALUEP(asg)) {
if (ASG_VALUEP(asg) && !dont_set) {
Param ipm = pm;
if (pm->node.flags & (PM_ARRAY|PM_HASHED)) {
DPUTS(!ASG_ARRAYP(asg), "BUG: inconsistent scalar value for array");
if (!(pm=setaparam(pname, zlinklist2array(asg->value.array))))
if (!(pm=setaparam(pname, asg->value.array ?
zlinklist2array(asg->value.array) :
mkarray(NULL))))
return NULL;
} else {
DPUTS(ASG_ARRAYP(asg), "BUG: inconsistent array value for scalar");

View file

@ -1162,13 +1162,11 @@ struct asgment {
/*
* Assignment has value?
* We need to arrange for each of the values
* to be the same type or the compiler will
* get fed up.
* If the assignment is an arrray, then it certainly has a value --- we
* can only tell if there's an expicit assignment.
*/
#define ASG_VALUEP(asg) (ASG_ARRAYP(asg) ? \
((asg)->value.array != (LinkList)0) : \
#define ASG_VALUEP(asg) (ASG_ARRAYP(asg) || \
((asg)->value.scalar != (char *)0))
/* node in command path hash table (cmdnamtab) */

View file

@ -691,3 +691,19 @@
>4 one umm er five
>2 one five
>4 nothing to see here
array=(no really nothing here)
fn() {
typeset array=() array[2]=two array[4]=four
typeset -p array
typeset array=() array[3]=three array[1]=one
typeset -p array
}
fn
print $array
0:setting empty array in typeset
>typeset -a array
>array=('' two '' four)
>typeset -a array
>array=(one '' three)
>no really nothing here