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