diff options
| -rw-r--r-- | ChangeLog | 10 | ||||
| -rw-r--r-- | Src/Modules/param_private.c | 3 | ||||
| -rw-r--r-- | Src/Modules/parameter.c | 5 | ||||
| -rw-r--r-- | Src/Zle/complete.c | 1 | ||||
| -rw-r--r-- | Src/Zle/computil.c | 1 | ||||
| -rw-r--r-- | Src/Zle/zle_params.c | 1 | ||||
| -rw-r--r-- | Src/builtin.c | 1 | ||||
| -rw-r--r-- | Src/exec.c | 1 | ||||
| -rw-r--r-- | Src/module.c | 1 | ||||
| -rw-r--r-- | Src/params.c | 10 | ||||
| -rw-r--r-- | Src/subst.c | 4 | ||||
| -rw-r--r-- | Src/zsh.h | 2 | ||||
| -rw-r--r-- | Test/A08time.ztst | 39 |
13 files changed, 60 insertions, 19 deletions
@@ -1,5 +1,15 @@ +2026-02-21 Bart Schaefer <schaefer@zsh.org> + + * dana: 54203: Test/A08time.ztst: replace "read -t" with "zselect" + 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 diff --git a/Src/Modules/param_private.c b/Src/Modules/param_private.c index 95859ce36..caa1fb0b0 100644 --- a/Src/Modules/param_private.c +++ b/Src/Modules/param_private.c @@ -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; diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c index 10e4ffc5c..779dcd024 100644 --- a/Src/Modules/parameter.c +++ b/Src/Modules/parameter.c @@ -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); diff --git a/Src/Zle/complete.c b/Src/Zle/complete.c index 647316c1a..5152764b8 100644 --- a/Src/Zle/complete.c +++ b/Src/Zle/complete.c @@ -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: diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c index 280e1dbd8..55b0a9b9f 100644 --- a/Src/Zle/computil.c +++ b/Src/Zle/computil.c @@ -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; diff --git a/Src/Zle/zle_params.c b/Src/Zle/zle_params.c index ec53ea4ef..54019bf3b 100644 --- a/Src/Zle/zle_params.c +++ b/Src/Zle/zle_params.c @@ -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: diff --git a/Src/builtin.c b/Src/builtin.c index 2bdbff8a6..c269dc1c6 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -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: diff --git a/Src/exec.c b/Src/exec.c index 27bca110c..7a928a316 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -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: diff --git a/Src/module.c b/Src/module.c index 19d7d9d42..659bc3544 100644 --- a/Src/module.c +++ b/Src/module.c @@ -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; diff --git a/Src/params.c b/Src/params.c index 8f366d81a..3199fd17b 100644 --- a/Src/params.c +++ b/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); diff --git a/Src/subst.c b/Src/subst.c index 9f0eccd16..56c1ad6dd 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -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 */ diff --git a/Test/A08time.ztst b/Test/A08time.ztst index 071038d1f..ee4d28c88 100644 --- a/Test/A08time.ztst +++ b/Test/A08time.ztst @@ -4,7 +4,8 @@ %prep - unset TIMEFMT + unset TIMEFMT zselect_skip + zmodload -s zsh/zselect || zselect_skip='zsh/zselect module not available' %test @@ -23,30 +24,42 @@ 0:TIMEFMT %*[USE] use millisecond precision *?x( <0-9>.<000-999>)(#c3) - ( TIMEFMT='%nU %nS'; time (read -k3 -t0.1) ) + if [[ -n $zselect_skip ]]; then + ZTST_skip=$zselect_skip + else + ( TIMEFMT='%nU %nS'; time (zselect -t 10) ) + fi 1:TIMEFMT %nU and %nS are limited to microsecond precision *?(0|[1-9][0-9]#000)ns (0|[1-9][0-9]#000)ns # SECONDS (after - before) must be greater than the elapsed time, but not much # greater. 25% was picked arbitrarily as something that hopefully will prevent # the test from failing on slow machines - ( - typeset -F SECONDS - TIMEFMT=%nE - a=$SECONDS - t=$( (time (read -k3 -t0.1)) 2>&1 ) - b=$SECONDS - s=$(( b - a )) - t=$(( ${t%ns}.0 / 10**9 )) - echo $s $t $(( s > t )) $(( t > s - (s * 0.25) )) - ) + if [[ -n $zselect_skip ]]; then + ZTST_skip=$zselect_skip + else + ( + typeset -F SECONDS + TIMEFMT=%nE + a=$SECONDS + t=$( (time (zselect -t 10)) 2>&1 ) + b=$SECONDS + s=$(( b - a )) + t=$(( ${t%ns}.0 / 10**9 )) + echo $s $t $(( s > t )) $(( t > s - (s * 0.25) )) + ) + fi 0:`time' elapsed time matches SECONDS *>[0-9.]## [0-9.]## 1 1 # Again, the wide range here is an attempt to prevent this test from failing on # slow machines. We don't care about the exact time, just that it's vaguely sane # and that each representation has the same basis - ( TIMEFMT='%E %mE %uE %nE %*E'; time (read -k3 -t0.1) ) + if [[ -n $zselect_skip ]]; then + ZTST_skip=$zselect_skip + else + ( TIMEFMT='%E %mE %uE %nE %*E'; time (zselect -t 10) ) + fi 1:TIMEFMT elapsed time values *?0.<10-50>s <10-500>ms <100000-500000>us <100000000-500000000>ns 0.<100-500> |
