From 34f70c5dc08bbecd20fbb8a1797851103fbad45e Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Sat, 28 Jan 2017 19:33:27 +0000 Subject: 40440: Add $functions_source hash to zsh/parameter. This allows you to find out where a function was loaded from. --- Src/Modules/parameter.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) (limited to 'Src/Modules/parameter.c') diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c index 98bcaba6e..6e6228732 100644 --- a/Src/Modules/parameter.c +++ b/Src/Modules/parameter.c @@ -515,6 +515,98 @@ scanpmdisfunctions(HashTable ht, ScanFunc func, int flags) scanfunctions(ht, func, flags, DISABLED); } +/* Functions for the functions_source special parameter. */ + +/* Retrieve the source file for a function by explicit name */ + +/**/ +static HashNode +getfunction_source(UNUSED(HashTable ht), const char *name, int dis) +{ + Shfunc shf; + Param pm = NULL; + + pm = (Param) hcalloc(sizeof(struct param)); + pm->node.nam = dupstring(name); + pm->node.flags = PM_SCALAR|PM_READONLY; + pm->gsu.s = dis ? &pmdisfunction_gsu : &pmfunction_gsu; + + if ((shf = (Shfunc) shfunctab->getnode2(shfunctab, name)) && + (dis ? (shf->node.flags & DISABLED) : !(shf->node.flags & DISABLED))) { + pm->u.str = getshfuncfile(shf); + if (!pm->u.str) + pm->u.str = dupstring(""); + } + return &pm->node; +} + +/* Retrieve the source file for functions by scanning the table */ + +/**/ +static void +scanfunctions_source(UNUSED(HashTable ht), ScanFunc func, int flags, int dis) +{ + struct param pm; + int i; + HashNode hn; + + memset((void *)&pm, 0, sizeof(struct param)); + pm.node.flags = PM_SCALAR|PM_READONLY; + pm.gsu.s = dis ? &pmdisfunction_gsu : &pmfunction_gsu; + + for (i = 0; i < shfunctab->hsize; i++) { + for (hn = shfunctab->nodes[i]; hn; hn = hn->next) { + if (dis ? (hn->flags & DISABLED) : !(hn->flags & DISABLED)) { + pm.node.nam = hn->nam; + if (func != scancountparams && + ((flags & (SCANPM_WANTVALS|SCANPM_MATCHVAL)) || + !(flags & SCANPM_WANTKEYS))) { + pm.u.str = getshfuncfile((Shfunc)hn); + if (!pm.u.str) + pm.u.str = dupstring(""); + } + func(&pm.node, flags); + } + } + } +} + +/* Param table entry for retrieving functions_source element */ + +/**/ +static HashNode +getpmfunction_source(HashTable ht, const char *name) +{ + return getfunction_source(ht, name, 0); +} + +/* Param table entry for retrieving ds_functions_source element */ + +/**/ +static HashNode +getpmdisfunction_source(HashTable ht, const char *name) +{ + return getfunction_source(ht, name, 1); +} + +/* Param table entry for scanning functions_source table */ + +/**/ +static void +scanpmfunction_source(HashTable ht, ScanFunc func, int flags) +{ + scanfunctions_source(ht, func, flags, 0); +} + +/* Param table entry for scanning dis_functions_source table */ + +/**/ +static void +scanpmdisfunction_source(HashTable ht, ScanFunc func, int flags) +{ + scanfunctions_source(ht, func, flags, 1); +} + /* Functions for the funcstack special parameter. */ /**/ @@ -2095,6 +2187,8 @@ static struct paramdef partab[] = { NULL, getpmdisbuiltin, scanpmdisbuiltins), SPECIALPMDEF("dis_functions", 0, &pmdisfunctions_gsu, getpmdisfunction, scanpmdisfunctions), + SPECIALPMDEF("dis_functions_source", PM_READONLY, NULL, + getpmdisfunction_source, scanpmdisfunction_source), SPECIALPMDEF("dis_galiases", 0, &pmdisgaliases_gsu, getpmdisgalias, scanpmdisgaliases), SPECIALPMDEF("dis_patchars", PM_ARRAY|PM_READONLY, @@ -2111,6 +2205,8 @@ static struct paramdef partab[] = { &funcstack_gsu, NULL, NULL), SPECIALPMDEF("functions", 0, &pmfunctions_gsu, getpmfunction, scanpmfunctions), + SPECIALPMDEF("functions_source", PM_READONLY, NULL, + getpmfunction_source, scanpmfunction_source), SPECIALPMDEF("functrace", PM_ARRAY|PM_READONLY, &functrace_gsu, NULL, NULL), SPECIALPMDEF("galiases", 0, -- cgit v1.2.3 From e9267adb49877bf3e7b30a740745535109202001 Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Tue, 7 Feb 2017 04:28:50 +0000 Subject: 40508: Make $functions re-settable. --- ChangeLog | 5 +++++ Src/Modules/parameter.c | 4 ++-- Test/V06parameter.ztst | 6 ++++++ 3 files changed, 13 insertions(+), 2 deletions(-) (limited to 'Src/Modules/parameter.c') diff --git a/ChangeLog b/ChangeLog index 0f24ac959..09e9b62f2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2017-02-08 Daniel Shahaf + + * 40508: Src/Modules/parameter.c, Test/V06parameter.ztst: + Make $functions re-settable. + 2017-02-07 Peter Stephenson * Sebastian: 40507: Src/Modules/db_gdbm.c: remove extraneous diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c index 6e6228732..c251e4f97 100644 --- a/Src/Modules/parameter.c +++ b/Src/Modules/parameter.c @@ -330,7 +330,7 @@ unsetpmfunction(Param pm, UNUSED(int exp)) /**/ static void -setfunctions(UNUSED(Param pm), HashTable ht, int dis) +setfunctions(Param pm, HashTable ht, int dis) { int i; HashNode hn; @@ -349,7 +349,7 @@ setfunctions(UNUSED(Param pm), HashTable ht, int dis) setfunction(hn->nam, ztrdup(getstrvalue(&v)), dis); } - deleteparamtable(ht); + hashsetfn(pm, ht); } /**/ diff --git a/Test/V06parameter.ztst b/Test/V06parameter.ztst index 10e0a276e..27d587852 100644 --- a/Test/V06parameter.ztst +++ b/Test/V06parameter.ztst @@ -86,6 +86,12 @@ >I have been autoloaded >$mydir/myfunc + functions+=(a 'echo foo'); a + functions+=(a 'echo bar'); a +0:$functions can be appended to twice +>foo +>bar + %clean rm -f autofn functrace.zsh rocky3.zsh sourcedfile myfunc -- cgit v1.2.3 From 6c476c22111122006dcacc767b2c2846ede881e8 Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Fri, 24 Feb 2017 05:17:04 +0000 Subject: 40626: Make $options re-settable. Follow-up to 40508. Reported-by: James McGlashan --- ChangeLog | 5 +++++ Src/Modules/parameter.c | 4 ++-- Test/V06parameter.ztst | 3 +++ 3 files changed, 10 insertions(+), 2 deletions(-) (limited to 'Src/Modules/parameter.c') diff --git a/ChangeLog b/ChangeLog index 8a069b209..fbedf0ae2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2017-02-25 Daniel Shahaf + + * 40626: Src/Modules/parameter.c, Test/V06parameter.ztst: + Make $options re-settable. + 2017-02-23 Barton E. Schaefer * unposted (cf. 40617): Doc/Zsh/expn.yo: clarify description of diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c index c251e4f97..c7aac88d1 100644 --- a/Src/Modules/parameter.c +++ b/Src/Modules/parameter.c @@ -937,7 +937,7 @@ unsetpmoption(Param pm, UNUSED(int exp)) /**/ static void -setpmoptions(UNUSED(Param pm), HashTable ht) +setpmoptions(Param pm, HashTable ht) { int i; HashNode hn; @@ -962,7 +962,7 @@ setpmoptions(UNUSED(Param pm), HashTable ht) (val && strcmp(val, "off")), 0, opts)) zwarn("can't change option: %s", hn->nam); } - deleteparamtable(ht); + hashsetfn(pm, ht); } static const struct gsu_scalar pmoption_gsu = diff --git a/Test/V06parameter.ztst b/Test/V06parameter.ztst index 27d587852..2b6671300 100644 --- a/Test/V06parameter.ztst +++ b/Test/V06parameter.ztst @@ -92,6 +92,9 @@ >foo >bar + options+=(); options+=() +0:$options can be appended to twice + %clean rm -f autofn functrace.zsh rocky3.zsh sourcedfile myfunc -- cgit v1.2.3 From c7048cd88f508b775b3805199f8fd68efd4279df Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Sun, 26 Feb 2017 06:11:19 +0000 Subject: Revert 40626 which broke tests. --- ChangeLog | 7 ++++++- Src/Modules/parameter.c | 4 ++-- Test/V06parameter.ztst | 3 --- 3 files changed, 8 insertions(+), 6 deletions(-) (limited to 'Src/Modules/parameter.c') diff --git a/ChangeLog b/ChangeLog index 5907112fb..0f8bc93e8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2017-02-25 Daniel Shahaf + + * 40644: Src/Modules/parameter.c, Test/V06parameter.ztst: + Revert 40626 which broke tests. + 2017-02-25 Barton E. Schaefer * 40640 (plus doc typo fixed): Doc/Zsh/expn.yo, Src/subst.c: the @@ -10,7 +15,7 @@ to the completion. * 40626: Src/Modules/parameter.c, Test/V06parameter.ztst: - Make $options re-settable. + Make $options re-settable. [reverted in 40644] 2017-02-23 Barton E. Schaefer diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c index c7aac88d1..c251e4f97 100644 --- a/Src/Modules/parameter.c +++ b/Src/Modules/parameter.c @@ -937,7 +937,7 @@ unsetpmoption(Param pm, UNUSED(int exp)) /**/ static void -setpmoptions(Param pm, HashTable ht) +setpmoptions(UNUSED(Param pm), HashTable ht) { int i; HashNode hn; @@ -962,7 +962,7 @@ setpmoptions(Param pm, HashTable ht) (val && strcmp(val, "off")), 0, opts)) zwarn("can't change option: %s", hn->nam); } - hashsetfn(pm, ht); + deleteparamtable(ht); } static const struct gsu_scalar pmoption_gsu = diff --git a/Test/V06parameter.ztst b/Test/V06parameter.ztst index 2b6671300..27d587852 100644 --- a/Test/V06parameter.ztst +++ b/Test/V06parameter.ztst @@ -92,9 +92,6 @@ >foo >bar - options+=(); options+=() -0:$options can be appended to twice - %clean rm -f autofn functrace.zsh rocky3.zsh sourcedfile myfunc -- cgit v1.2.3 From d00931de5c2b7aa846daf137865dd05ac8d4be8a Mon Sep 17 00:00:00 2001 From: "Barton E. Schaefer" Date: Sun, 26 Feb 2017 12:03:56 -0800 Subject: 40650: redo 40508 and 40626 with comments explaining what is actually going on --- ChangeLog | 5 +++++ Src/Modules/parameter.c | 34 +++++++++++++++++++++++++--------- 2 files changed, 30 insertions(+), 9 deletions(-) (limited to 'Src/Modules/parameter.c') diff --git a/ChangeLog b/ChangeLog index 0f8bc93e8..95a3ccd41 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2017-02-26 Barton E. Schaefer + + * 40650: Src/Modules/parameter.c: redo 40508 and 40626 with + comments explaining what is actually going on + 2017-02-25 Daniel Shahaf * 40644: Src/Modules/parameter.c, Test/V06parameter.ztst: diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c index c251e4f97..10c47d214 100644 --- a/Src/Modules/parameter.c +++ b/Src/Modules/parameter.c @@ -167,7 +167,7 @@ unsetpmcommand(Param pm, UNUSED(int exp)) /**/ static void -setpmcommands(UNUSED(Param pm), HashTable ht) +setpmcommands(Param pm, HashTable ht) { int i; HashNode hn; @@ -190,7 +190,15 @@ setpmcommands(UNUSED(Param pm), HashTable ht) cmdnamtab->addnode(cmdnamtab, ztrdup(hn->nam), &cn->node); } - deleteparamtable(ht); + /* + * On full-array assignment ht is a temporary hash with the default + * get/set functions, whereas pm->u.hash has the special $commands + * get/set functions. Do not assign ht to pm, just delete it. + * + * On append, ht and pm->u.hash are the same table, don't delete. + */ + if (ht != pm->u.hash) + deleteparamtable(ht); } static const struct gsu_scalar pmcommand_gsu = @@ -349,7 +357,9 @@ setfunctions(Param pm, HashTable ht, int dis) setfunction(hn->nam, ztrdup(getstrvalue(&v)), dis); } - hashsetfn(pm, ht); + /* See setpmcommands() above */ + if (ht != pm->u.hash) + deleteparamtable(ht); } /**/ @@ -937,7 +947,7 @@ unsetpmoption(Param pm, UNUSED(int exp)) /**/ static void -setpmoptions(UNUSED(Param pm), HashTable ht) +setpmoptions(Param pm, HashTable ht) { int i; HashNode hn; @@ -962,7 +972,9 @@ setpmoptions(UNUSED(Param pm), HashTable ht) (val && strcmp(val, "off")), 0, opts)) zwarn("can't change option: %s", hn->nam); } - deleteparamtable(ht); + /* See setpmcommands() above */ + if (ht != pm->u.hash) + deleteparamtable(ht); } static const struct gsu_scalar pmoption_gsu = @@ -1501,7 +1513,7 @@ unsetpmnameddir(Param pm, UNUSED(int exp)) /**/ static void -setpmnameddirs(UNUSED(Param pm), HashTable ht) +setpmnameddirs(Param pm, HashTable ht) { int i; HashNode hn, next, hd; @@ -1543,7 +1555,9 @@ setpmnameddirs(UNUSED(Param pm), HashTable ht) i = opts[INTERACTIVE]; opts[INTERACTIVE] = 0; - deleteparamtable(ht); + /* See setpmcommands() above */ + if (ht != pm->u.hash) + deleteparamtable(ht); opts[INTERACTIVE] = i; } @@ -1724,7 +1738,7 @@ unsetpmsalias(Param pm, UNUSED(int exp)) /**/ static void -setaliases(HashTable alht, UNUSED(Param pm), HashTable ht, int flags) +setaliases(HashTable alht, Param pm, HashTable ht, int flags) { int i; HashNode hn, next, hd; @@ -1760,7 +1774,9 @@ setaliases(HashTable alht, UNUSED(Param pm), HashTable ht, int flags) alht->addnode(alht, ztrdup(hn->nam), createaliasnode(ztrdup(val), flags)); } - deleteparamtable(ht); + /* See setpmcommands() above */ + if (ht != pm->u.hash) + deleteparamtable(ht); } /**/ -- cgit v1.2.3