summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--Src/Modules/param_private.c3
-rw-r--r--Src/Modules/parameter.c5
-rw-r--r--Src/Zle/complete.c1
-rw-r--r--Src/Zle/computil.c1
-rw-r--r--Src/Zle/zle_params.c1
-rw-r--r--Src/builtin.c1
-rw-r--r--Src/exec.c1
-rw-r--r--Src/module.c1
-rw-r--r--Src/params.c10
-rw-r--r--Src/subst.c4
-rw-r--r--Src/zsh.h2
-rw-r--r--Test/A08time.ztst39
13 files changed, 60 insertions, 19 deletions
diff --git a/ChangeLog b/ChangeLog
index 3e687f112..e80f8a4d3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)
diff --git a/Src/zsh.h b/Src/zsh.h
index bc784e7ad..0dc83ded4 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -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>