Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: $* assignment regression in shwordsplit
- X-seq: zsh-workers 40929
- From: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- To: zsh-workers@xxxxxxx
- Subject: Re: $* assignment regression in shwordsplit
- Date: Sun, 2 Apr 2017 13:15:02 -0700
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=brasslantern-com.20150623.gappssmtp.com; s=20150623; h=from:message-id:date:in-reply-to:comments:references:to:subject :mime-version; bh=Y9Obg/45Hw6W/IUTPvVVkQrWPPivzRtBdJK3sqdU/ig=; b=JlpVC+/aUMvzM45ej9wlrsmKSrCcUQ8tgAT6w+1d9MDU89JX/SDc54SpLLGYXPTtGb S4LpR36RiUVfABqvtnQHXAnroYoPP/ogr0ZEknWQWuFpRjvp26sgkkGsvuA4cOyz1jZZ ohnMKoKBoqXuqqnPEONSsb6GfG09WQmpYwH4WLSXc13i2s8FVOnxVg9mDfzDeCM0Cz0d dCKJDt9v5d0h5ERWDUdphMJTpVeM9aVFziomQ2gjKH50kwpKFY77gfGm2rdu2dKrFlhV 3IwismD3szHLW9wQA/s1BfiZnMi6XjbL60Q4mxgMEc8Zk4ABK7eSM4u3IEICM5JCybR2 2Zxg==
- In-reply-to: <20170402175851.GA10565@fujitsu.shahaf.local2>
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
- References: <662d58a2-94fd-657c-e414-452f48ef47fc@inlv.org> <20170402175851.GA10565@fujitsu.shahaf.local2>
Hrm. Well, we can do it this way instead, but that changes the effects
of ${(u)...} and and ${^...} in the expansion, requiring an extra level
of nested braces.
Obviously in the bit removed by this patch it's the wrong thing to join
up the entire input linklist. I guess we'd need to join only the nodes
added around the input node n (plus turn off LF_ARRAY), but there's no
good way to keep track of that (?). Maybe it would work to join up
everything to the left of n. Anybody with a clearer idea what's going
on here care to interject?
Meanwhile this fixes the bug without failing the other related tests.
diff --git a/Src/subst.c b/Src/subst.c
index e639c96..5b1bf89 100644
--- a/Src/subst.c
+++ b/Src/subst.c
@@ -446,7 +446,7 @@ singsub(char **s)
* NULL to use IFS). The return value is true iff the expansion resulted
* in an empty list.
*
- * *ms_flags is set to bits in the enum above as neeed.
+ * *ms_flags is set to bits in the enum above as needed.
*/
/**/
@@ -3779,6 +3779,13 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags,
* as a scalar.)
*/
+ if (isarr && ssub) {
+ /* prefork() wants a scalar, so join no matter what else */
+ val = sepjoin(aval, NULL, 1);
+ isarr = 0;
+ l->list.flags &= ~LF_ARRAY;
+ }
+
/*
* If a multsub result had whitespace at the start and we're
* splitting and there's a previous string, now's the time to do so.
@@ -4026,18 +4033,6 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags,
y = dupstring(nulstring);
setdata(n, (void *) y);
}
- if (isarr && ssub) {
- /* prefork() wants a scalar, so join no matter what else */
- LinkNode tn;
-
- aval = hlinklist2array(l, 0);
- val = sepjoin(aval, NULL, 1);
- n = firstnode(l);
- for (tn = lastnode(l); tn && tn != n; tn = lastnode(l))
- uremnode(l, tn);
- setdata(n, (void *) val);
- l->list.flags &= ~LF_ARRAY;
- }
if (eval)
*str = (char *) getdata(n);
Messages sorted by:
Reverse Date,
Date,
Thread,
Author