diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | Src/subst.c | 19 | ||||
-rw-r--r-- | 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 <p.stephenson@samsung.com> + + * 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 <p.stephenson@samsung.com> * 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 |