diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Src/hist.c | 5 | ||||
-rw-r--r-- | Src/params.c | 9 | ||||
-rw-r--r-- | Src/subst.c | 12 | ||||
-rw-r--r-- | Src/zsh.h | 1 |
5 files changed, 23 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog index 049640139..4ed4acefe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2017-09-25 Peter Stephenson <p.w.stephenson@ntlworld.com> + + * 41747: Sr/hist.c, Src/params.c, Src/subst.c. Src/zsh.h: add + flag so as not to create hash table when checking existence. + 2017-09-24 Daniel Shahaf <d.s@daniel.shahaf.name> * 41755: Doc/Zsh/params.yo: Followup to last: minor clarification diff --git a/Src/hist.c b/Src/hist.c index da5a8b29f..177250f31 100644 --- a/Src/hist.c +++ b/Src/hist.c @@ -1083,7 +1083,6 @@ hbegin(int dohist) } else histactive = HA_ACTIVE | HA_NOINC; - hf = getsparam("HISTFILE"); /* * For INCAPPENDHISTORYTIME, when interactive, save the history here * as it gives a better estimate of the times of commands. @@ -1104,8 +1103,10 @@ hbegin(int dohist) */ if (isset(INCAPPENDHISTORYTIME) && !isset(SHAREHISTORY) && !isset(INCAPPENDHISTORY) && - !(histactive & HA_NOINC) && !strin && histsave_stack_pos == 0) + !(histactive & HA_NOINC) && !strin && histsave_stack_pos == 0) { + hf = getsparam("HISTFILE"); savehistfile(hf, 0, HFILE_USE_OPTIONS | HFILE_FAST); + } } /**/ diff --git a/Src/params.c b/Src/params.c index c7514de8a..4d4d08085 100644 --- a/Src/params.c +++ b/Src/params.c @@ -1204,7 +1204,7 @@ isident(char *s) /**/ static zlong getarg(char **str, int *inv, Value v, int a2, zlong *w, - int *prevcharlen, int *nextcharlen) + int *prevcharlen, int *nextcharlen, int flags) { int hasbeg = 0, word = 0, rev = 0, ind = 0, down = 0, l, i, ishash; int keymatch = 0, needtok = 0, arglen, len, inpar = 0; @@ -1407,6 +1407,8 @@ getarg(char **str, int *inv, Value v, int a2, zlong *w, if (ishash) { HashTable ht = v->pm->gsu.h->getfn(v->pm); if (!ht) { + if (flags & SCANPM_CHECKING) + return isset(KSHARRAYS) ? 1 : 0; ht = newparamtable(17, v->pm->node.nam); v->pm->gsu.h->setfn(v->pm, ht); } @@ -1848,7 +1850,8 @@ getindex(char **pptr, Value v, int flags) zlong we = 0, dummy; int startprevlen, startnextlen; - start = getarg(&s, &inv, v, 0, &we, &startprevlen, &startnextlen); + start = getarg(&s, &inv, v, 0, &we, &startprevlen, &startnextlen, + flags); if (inv) { if (!v->isarr && start != 0) { @@ -1922,7 +1925,7 @@ getindex(char **pptr, Value v, int flags) if ((com = (*s == ','))) { s++; - end = getarg(&s, &inv, v, 1, &dummy, NULL, NULL); + end = getarg(&s, &inv, v, 1, &dummy, NULL, NULL, flags); } else { end = we ? we : start; } diff --git a/Src/subst.c b/Src/subst.c index 357dc9168..55b5444c6 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -2446,7 +2446,13 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags, */ if (!subexp || aspar) { char *ov = val; - + int scanflags = hkeys | hvals; + if (arrasg) + scanflags |= SCANPM_ASSIGNING; + if (qt) + scanflags |= SCANPM_DQUOTED; + if (chkset) + scanflags |= SCANPM_CHECKING; /* * Second argument: decide whether to use the subexpression or * the string next on the line as the parameter name. @@ -2475,9 +2481,7 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags, if (!(v = fetchvalue(&vbuf, (subexp ? &ov : &s), (wantt ? -1 : ((unset(KSHARRAYS) || inbrace) ? 1 : -1)), - hkeys|hvals| - (arrasg ? SCANPM_ASSIGNING : 0)| - (qt ? SCANPM_DQUOTED : 0))) || + scanflags)) || (v->pm && (v->pm->node.flags & PM_UNSET)) || (v->flags & VALFLAG_EMPTY)) vunset = 1; diff --git a/Src/zsh.h b/Src/zsh.h index f7242dd34..b6e2001fb 100644 --- a/Src/zsh.h +++ b/Src/zsh.h @@ -1911,6 +1911,7 @@ struct tieddata { * necessarily want to match multiple * elements */ +#define SCANPM_CHECKING (1<<10) /* Check if set, no need to create */ /* "$foo[@]"-style substitution * Only sign bit is significant */ |