From d814071b1420418a3243642a5cdeb3946e7d1939 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Thu, 12 Nov 2015 14:28:15 +0000 Subject: 37096: Another $${(P)...} tweak. Make a top level (P) work with nested ones, i.e. ${(P)${(P)...}...} --- ChangeLog | 8 ++++++++ Src/subst.c | 19 +++++++++++++++++-- Test/D04parameter.ztst | 2 +- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index e9bef7d68..5397c6c51 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2015-11-12 Peter Stephenson + + * 37096: Src/subst.c, Test/D04parameter.ztst: make top-level + ${(P)...} with nested ${(P)...} to the right thing. + + * 37094: Src/subst.c, Test/D04parameter.ztst: Further tweaks to + parameter name references: array safety; nested parameters; tests. + 2015-11-11 Peter Stephenson * 37092: Doc/Zsh/expn.yo, Src/Zle/compctl.c, diff --git a/Src/subst.c b/Src/subst.c index c1369b5a7..b7f8338c7 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -1741,6 +1741,12 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags, * simply removed. */ int ms_flags = 0; + /* + * We need to do an extra fetch to honour the (P) flag. + * Complicated by the use of subexpressions that may have + * nested (P) flags. + */ + int fetch_needed; *s++ = '\0'; /* @@ -2325,9 +2331,18 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags, s = dyncat(val, s); /* Now behave po-faced as if it was always like that... */ subexp = 0; - } + /* + * If this is a (P) (first test) and at the top level + * (second test) we can't rely on the caller fetching + * the result from the pending aspar. So do it below. + */ + fetch_needed = aspar && !(pf_flags & PREFORK_SUBEXP); + } else + fetch_needed = 0; /* any initial aspar fetch already done */ v = (Value) NULL; - } else if (aspar) { + } else + fetch_needed = aspar; /* aspar fetch still needed */ + if (fetch_needed) { /* * No subexpression, but in any case the value is going * to give us the name of a parameter on which we do diff --git a/Test/D04parameter.ztst b/Test/D04parameter.ztst index 6f325d293..210c0d854 100644 --- a/Test/D04parameter.ztst +++ b/Test/D04parameter.ztst @@ -1840,7 +1840,7 @@ local two=three local three=four local -a four=(all these worlds belong to foo) - print ${${(P)${(P)${(P)one}}}} + print ${(P)${(P)${(P)one}}} print ${${(P)${(P)${(P)one}}}[3]} } testfn -- cgit 1.4.1