mirror of
https://git.code.sf.net/p/zsh/code
synced 2026-04-18 06:53:35 -04:00
53776: Add PM_NAMEREF to PM_TYPE, reject array initializers for namerefs
This commit is contained in:
committed by
Bart Schaefer
parent
7f1dec0bae
commit
09e1b5631d
@@ -1,5 +1,11 @@
|
||||
2026-02-16 Bart Schaefer <schaefer@zsh.org>
|
||||
|
||||
* Philippe: 53776: Src/builtin.c, Src/exec.c, Src/module.c,
|
||||
Src/params.c, Src/subst.c, Src/zsh.h, Src/Modules/param_private.c,
|
||||
Src/Modules/parameter.c, Src/Zle/complete.c, Src/Zle/computil.c,
|
||||
Src/Zle/zle_params.c: Treat PM_NAMEREF as first-class PM_TYPE,
|
||||
enabling rejection of array initializers for namerefs
|
||||
|
||||
* Philippe: 54122: Src/builtin.c, Test/K01nameref.ztst: avoid
|
||||
warnings for valid nameref options
|
||||
|
||||
|
||||
@@ -100,6 +100,7 @@ makeprivate(HashNode hn, UNUSED(int flags))
|
||||
/* why have a union if we need this switch anyway? */
|
||||
switch (PM_TYPE(pm->node.flags)) {
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
pm->gsu.s->setfn(pm, tpm->u.str);
|
||||
tpm->u.str = NULL;
|
||||
break;
|
||||
@@ -138,6 +139,7 @@ makeprivate(HashNode hn, UNUSED(int flags))
|
||||
struct gsu_closure *gsu = zalloc(sizeof(struct gsu_closure));
|
||||
switch (PM_TYPE(pm->node.flags)) {
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
gsu->g = (void *)(pm->gsu.s);
|
||||
gsu->u.s = scalar_private_gsu;
|
||||
pm->gsu.s = (GsuScalar)gsu;
|
||||
@@ -180,6 +182,7 @@ is_private(Param pm)
|
||||
{
|
||||
switch (PM_TYPE(pm->node.flags)) {
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
if (!pm->gsu.s || pm->gsu.s->unsetfn != pps_unsetfn)
|
||||
return 0;
|
||||
break;
|
||||
|
||||
@@ -49,15 +49,14 @@ paramtypestr(Param pm)
|
||||
if (pm->node.flags & PM_AUTOLOAD)
|
||||
return dupstring("undefined");
|
||||
|
||||
/* For simplicity we treat PM_NAMEREF as PM_TYPE(PM_SCALAR) */
|
||||
switch (PM_TYPE(f)|(f & PM_NAMEREF)) {
|
||||
switch (PM_TYPE(f)) {
|
||||
case PM_SCALAR: val = "scalar"; break;
|
||||
case PM_NAMEREF: val = "nameref"; break;
|
||||
case PM_ARRAY: val = "array"; break;
|
||||
case PM_INTEGER: val = "integer"; break;
|
||||
case PM_EFLOAT:
|
||||
case PM_FFLOAT: val = "float"; break;
|
||||
case PM_HASHED: val = "association"; break;
|
||||
case PM_NAMEREF: val = "nameref"; break;
|
||||
}
|
||||
DPUTS(!val, "BUG: type not handled in parameter");
|
||||
val = dupstring(val);
|
||||
|
||||
@@ -1308,6 +1308,7 @@ addcompparams(struct compparam *cp, Param *pp)
|
||||
if ((pm->u.data = cp->var)) {
|
||||
switch(PM_TYPE(cp->type)) {
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
pm->gsu.s = &compvarscalar_gsu;
|
||||
break;
|
||||
case PM_INTEGER:
|
||||
|
||||
@@ -3699,6 +3699,7 @@ bin_compquote(char *nam, char **args, Options ops, UNUSED(int func))
|
||||
if ((v = getvalue(&vbuf, &name, 0))) {
|
||||
switch (PM_TYPE(v->pm->node.flags)) {
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
setstrvalue(v, ztrdup(comp_quote(getstrvalue(v),
|
||||
OPT_ISSET(ops,'p'))));
|
||||
break;
|
||||
|
||||
@@ -207,6 +207,7 @@ makezleparams(int ro)
|
||||
pm->u.data = zp->data;
|
||||
switch(PM_TYPE(zp->type)) {
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
pm->gsu.s = zp->gsu;
|
||||
break;
|
||||
case PM_ARRAY:
|
||||
|
||||
@@ -2628,6 +2628,7 @@ typeset_single(char *cname, char *pname, Param pm, int func,
|
||||
*/
|
||||
switch (PM_TYPE(pm->node.flags)) {
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
pm->gsu.s->setfn(pm, ztrdup(""));
|
||||
break;
|
||||
case PM_INTEGER:
|
||||
|
||||
@@ -4517,6 +4517,7 @@ restore_params(LinkList restorelist, LinkList removelist)
|
||||
tpm->node.flags = pm->node.flags;
|
||||
switch (PM_TYPE(pm->node.flags)) {
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
tpm->gsu.s->setfn(tpm, pm->u.str);
|
||||
break;
|
||||
case PM_INTEGER:
|
||||
|
||||
@@ -1085,6 +1085,7 @@ addparamdef(Paramdef d)
|
||||
*/
|
||||
switch (PM_TYPE(pm->node.flags)) {
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
pm->gsu.s = d->gsu ? (GsuScalar)d->gsu : &varscalar_gsu;
|
||||
break;
|
||||
|
||||
|
||||
10
Src/params.c
10
Src/params.c
@@ -977,6 +977,7 @@ assigngetset(Param pm)
|
||||
{
|
||||
switch (PM_TYPE(pm->node.flags)) {
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
pm->gsu.s = &stdscalar_gsu;
|
||||
break;
|
||||
case PM_INTEGER:
|
||||
@@ -1230,6 +1231,7 @@ copyparam(Param tpm, Param pm, int fakecopy)
|
||||
}
|
||||
switch (PM_TYPE(pm->node.flags)) {
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
tpm->u.str = ztrdup(pm->gsu.s->getfn(pm));
|
||||
break;
|
||||
case PM_INTEGER:
|
||||
@@ -2355,6 +2357,7 @@ getstrvalue(Value v)
|
||||
v->pm->base, v->pm->node.flags, NULL);
|
||||
break;
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
s = v->pm->gsu.s->getfn(v->pm);
|
||||
break;
|
||||
default:
|
||||
@@ -2694,6 +2697,7 @@ assignstrvalue(Value v, char *val, int flags)
|
||||
v->pm->node.flags &= ~PM_UNSET;
|
||||
switch (PM_TYPE(v->pm->node.flags)) {
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
if (v->start == 0 && v->end == -1) {
|
||||
v->pm->gsu.s->setfn(v->pm, val);
|
||||
if ((v->pm->node.flags & (PM_LEFT | PM_RIGHT_B | PM_RIGHT_Z)) &&
|
||||
@@ -2850,6 +2854,7 @@ setnumvalue(Value v, mnumber val)
|
||||
}
|
||||
switch (PM_TYPE(v->pm->node.flags)) {
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
case PM_ARRAY:
|
||||
if ((val.type & MN_INTEGER) || outputradix) {
|
||||
if (!(val.type & MN_INTEGER))
|
||||
@@ -3260,6 +3265,7 @@ assignsparam(char *s, char *val, int flags)
|
||||
if (v->start == 0 && v->end == -1) {
|
||||
switch (PM_TYPE(v->pm->node.flags)) {
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
v->start = INT_MAX; /* just append to scalar value */
|
||||
break;
|
||||
case PM_INTEGER:
|
||||
@@ -3296,6 +3302,7 @@ assignsparam(char *s, char *val, int flags)
|
||||
} else {
|
||||
switch (PM_TYPE(v->pm->node.flags)) {
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
if (v->end > 0)
|
||||
v->start = v->end;
|
||||
else
|
||||
@@ -3943,6 +3950,7 @@ stdunsetfn(Param pm, UNUSED(int exp))
|
||||
{
|
||||
switch (PM_TYPE(pm->node.flags)) {
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
if (pm->gsu.s->setfn)
|
||||
pm->gsu.s->setfn(pm, NULL);
|
||||
break;
|
||||
@@ -5915,6 +5923,7 @@ scanendscope(HashNode hn, UNUSED(int flags))
|
||||
if (!(tpm->node.flags & (PM_NORESTORE|PM_READONLY)))
|
||||
switch (PM_TYPE(pm->node.flags)) {
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
pm->gsu.s->setfn(pm, tpm->u.str);
|
||||
break;
|
||||
case PM_INTEGER:
|
||||
@@ -6024,6 +6033,7 @@ printparamvalue(Param p, int printflags)
|
||||
* on the type of the parameter */
|
||||
switch (PM_TYPE(p->node.flags)) {
|
||||
case PM_SCALAR:
|
||||
case PM_NAMEREF:
|
||||
/* string: simple output */
|
||||
if (p->gsu.s->getfn && (t = p->gsu.s->getfn(p)))
|
||||
quotedzputs(t, stdout);
|
||||
|
||||
@@ -2813,14 +2813,14 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags,
|
||||
!(v->pm->node.flags & PM_UNSET))) {
|
||||
int f = v->pm->node.flags;
|
||||
|
||||
switch (PM_TYPE(f)|(f & PM_NAMEREF)) {
|
||||
switch (PM_TYPE(f)) {
|
||||
case PM_SCALAR: val = "scalar"; break;
|
||||
case PM_NAMEREF: val = "nameref"; break;
|
||||
case PM_ARRAY: val = "array"; break;
|
||||
case PM_INTEGER: val = "integer"; break;
|
||||
case PM_EFLOAT:
|
||||
case PM_FFLOAT: val = "float"; break;
|
||||
case PM_HASHED: val = "association"; break;
|
||||
case PM_NAMEREF: val = "nameref"; break;
|
||||
}
|
||||
val = dupstring(val);
|
||||
if (v->pm->level)
|
||||
|
||||
@@ -1883,7 +1883,7 @@ struct tieddata {
|
||||
#define PM_HASHED (1<<4) /* association */
|
||||
|
||||
#define PM_TYPE(X) \
|
||||
(X & (PM_SCALAR|PM_INTEGER|PM_EFLOAT|PM_FFLOAT|PM_ARRAY|PM_HASHED))
|
||||
(X & (PM_SCALAR|PM_INTEGER|PM_EFLOAT|PM_FFLOAT|PM_ARRAY|PM_HASHED|PM_NAMEREF))
|
||||
|
||||
#define PM_LEFT (1<<5) /* left justify, remove leading blanks */
|
||||
#define PM_RIGHT_B (1<<6) /* right justify, fill with leading blanks */
|
||||
|
||||
Reference in New Issue
Block a user