Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: [PATCH] Fix WATCH/watch tying



It turns out that I have to duplicate the string returned by casemodify. Here is an updated version:

Fix WATCH/watch tying

Philippe

diff --git a/Src/Modules/watch.c b/Src/Modules/watch.c
index bb27ab9db..f23819b25 100644
--- a/Src/Modules/watch.c
+++ b/Src/Modules/watch.c
@@ -695,8 +695,10 @@ static struct builtin bintab[] = {
 };
 
 static struct paramdef partab[] = {
-    PARAMDEF("WATCH", PM_SCALAR|PM_SPECIAL, &watch, NULL),
-    PARAMDEF("watch", PM_ARRAY|PM_SPECIAL, &watch, NULL),
+    PARAMDEF("WATCH", PM_SCALAR|PM_SPECIAL|PM_TIED, &watch,
+	     NULL /* &colonarr_gsu (see setup_()) */),
+    PARAMDEF("watch", PM_ARRAY|PM_SPECIAL|PM_TIED, &watch,
+	     NULL /* &vararray_gsu (see setup_() */),
 };
 
 static struct features module_features = {
@@ -739,15 +741,6 @@ boot_(UNUSED(Module m))
 {
     static char const * const default_watchfmt = DEFAULT_WATCHFMT;
 
-    Param pma = (Param) paramtab->getnode(paramtab, "watch");
-    Param pms = (Param) paramtab->getnode(paramtab, "WATCH");
-    if (pma && pms && pma->u.arr == watch && pms->u.arr == watch) {
-	/* only tie the two parameters if both were added */
-	pma->ename = "WATCH";
-	pms->ename = "watch";
-	pma->node.flags |= PM_TIED;
-	pms->node.flags |= PM_TIED;
-    }
     watch = mkarray(NULL);
 
     /* These two parameters are only set to defaults if not set.
diff --git a/Src/module.c b/Src/module.c
index 659bc3544..0b5cd5649 100644
--- a/Src/module.c
+++ b/Src/module.c
@@ -1085,6 +1085,9 @@ addparamdef(Paramdef d)
 	 */
 	switch (PM_TYPE(pm->node.flags)) {
 	case PM_SCALAR:
+	    if (pm->node.flags & PM_TIED)
+		pm->ename = ztrdup(casemodify(pm->node.nam, CASMOD_LOWER));
+	    /* fall-through */
 	case PM_NAMEREF:
 	    pm->gsu.s = d->gsu ? (GsuScalar)d->gsu : &varscalar_gsu;
 	    break;
@@ -1099,6 +1102,8 @@ addparamdef(Paramdef d)
 	    break;
 
 	case PM_ARRAY:
+	    if (pm->node.flags & PM_TIED)
+		pm->ename = ztrdup(casemodify(pm->node.nam, CASMOD_UPPER));
 	    pm->gsu.a = d->gsu ? (GsuArray)d->gsu : &vararray_gsu;
 	    break;
 
diff --git a/Test/V01zmodload.ztst b/Test/V01zmodload.ztst
index daf49cd72..ec55e0f95 100644
--- a/Test/V01zmodload.ztst
+++ b/Test/V01zmodload.ztst
@@ -236,6 +236,17 @@
  fi
 0d:Autoload a module via a math function
 
+ if [[ $mods[(r)zsh/watch] == zsh/watch ]]; then
+   zmodload -u zsh/watch
+   WATCH=foo:bar
+   typeset -p WATCH watch
+ else
+   ZTST_skip="zsh/watch module not available"
+ fi
+0:Autoload tied parameters
+>typeset -g -T WATCH watch=( foo bar )
+>typeset -g -aT WATCH watch=( foo bar )
+
 # Test module aliases
 
  zmodload -A example=zsh/example


Messages sorted by: Reverse Date, Date, Thread, Author