about summary refs log tree commit diff
path: root/Src
diff options
context:
space:
mode:
authorPeter Stephenson <pws@zsh.org>2016-09-06 09:42:33 +0100
committerPeter Stephenson <pws@zsh.org>2016-09-06 09:42:33 +0100
commitfe3a63fa6cdffa020e380d3e27cf0eb8f3b46b1f (patch)
tree57c9d2effcaf3fa6638dcecff492b2bd4e058f60 /Src
parent33a8a6f86cd63a1daf845b269f6c56ea477c891e (diff)
downloadzsh-fe3a63fa6cdffa020e380d3e27cf0eb8f3b46b1f.tar.gz
zsh-fe3a63fa6cdffa020e380d3e27cf0eb8f3b46b1f.tar.xz
zsh-fe3a63fa6cdffa020e380d3e27cf0eb8f3b46b1f.zip
39181: Add PM_SINGLE and use for compstate.
This flags that compstate (or any other special) can only have
a single instance and an attempt to create a new one is an error.
Given the very fiddly semantics of compstate any other usage
seems pointless.

No investigation yet of other variables that could use this.

Note it's still possible to hide such variables; only instances
that keep the special nature are affected.
Diffstat (limited to 'Src')
-rw-r--r--Src/Zle/complete.c5
-rw-r--r--Src/builtin.c4
-rw-r--r--Src/zsh.h1
3 files changed, 8 insertions, 2 deletions
diff --git a/Src/Zle/complete.c b/Src/Zle/complete.c
index b28b95ef9..4bf238fab 100644
--- a/Src/Zle/complete.c
+++ b/Src/Zle/complete.c
@@ -1238,8 +1238,9 @@ makecompparams(void)
 
     addcompparams(comprparams, comprpms);
 
-    if (!(cpm = createparam(COMPSTATENAME,
-			    PM_SPECIAL|PM_REMOVABLE|PM_LOCAL|PM_HASHED)))
+    if (!(cpm = createparam(
+	      COMPSTATENAME,
+	      PM_SPECIAL|PM_REMOVABLE|PM_SINGLE|PM_LOCAL|PM_HASHED)))
 	cpm = (Param) paramtab->getnode(paramtab, COMPSTATENAME);
     DPUTS(!cpm, "param not set in makecompparams");
 
diff --git a/Src/builtin.c b/Src/builtin.c
index da453000c..3b82c9e7f 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -2266,6 +2266,10 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func),
 	    zerrnam(cname, "%s: restricted", pname);
 	    return pm;
 	}
+	if (pm->node.flags & PM_SINGLE) {
+	    zerrnam(cname, "%s: can only have a single instance", pname);
+	    return pm;
+	}
 	/*
 	 * For specials, we keep the same struct but zero everything.
 	 * Maybe it would be easier to create a new struct but copy
diff --git a/Src/zsh.h b/Src/zsh.h
index 36fddd000..87e6a9868 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -1792,6 +1792,7 @@ struct tieddata {
 #define PM_ZSHSTORED	(1<<18) /* function stored in zsh form              */
 
 /* Remaining flags do not correspond directly to command line arguments */
+#define PM_SINGLE       (1<<20) /* special can only have a single instance  */
 #define PM_LOCAL	(1<<21) /* this parameter will be made local        */
 #define PM_SPECIAL	(1<<22) /* special builtin parameter                */
 #define PM_DONTIMPORT	(1<<23)	/* do not import this variable              */