summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Src/Modules/parameter.c9
-rw-r--r--Src/Zle/zleparameter.c9
-rw-r--r--Src/module.c26
-rw-r--r--Src/zsh.h11
5 files changed, 54 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index e680104ac..3904c5f7b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,11 @@
* unposted: Config/version.mk, README, Etc/FAQ.yo: release
zsh version 4.2.2.
+ * 20695: Src/module.c, Src/zsh.h, Src/Modules/parameter.c,
+ Src/Zle/zleparameter.c: Cygwin barfs on an attempt to
+ use a pointer to an imported variable in a compile-time
+ initialiser.
+
* unposted: Fix .distfiles and .cvsignore for distribution.
* unposted: Completion/Unix/Command/_perforce: minor comment
diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c
index 6b7db0387..c6a6eca71 100644
--- a/Src/Modules/parameter.c
+++ b/Src/Modules/parameter.c
@@ -1812,6 +1812,13 @@ struct pardef {
Param pm;
};
+/*
+ * This is a duplicate of nullsethash_gsu. On some systems
+ * (such as Cygwin) we can't put a pointer to an imported variable
+ * in a compile-time initialiser, so we use this instead.
+ */
+static const struct gsu_hash pmnullsethash_gsu =
+{ hashgetfn, nullsethashfn, NULL };
static const struct gsu_hash pmcommands_gsu =
{ hashgetfn, setpmcommands, stdunsetfn };
static const struct gsu_hash pmfunctions_gsu =
@@ -1848,7 +1855,7 @@ static const struct gsu_array historywords_gsu =
static struct pardef partab[] = {
{ "parameters", PM_READONLY,
- getpmparameter, scanpmparameters, &nullsethash_gsu,
+ getpmparameter, scanpmparameters, &pmnullsethash_gsu,
NULL, NULL },
{ "commands", 0,
getpmcommand, scanpmcommands, &pmcommands_gsu,
diff --git a/Src/Zle/zleparameter.c b/Src/Zle/zleparameter.c
index ed415c960..bf6b60479 100644
--- a/Src/Zle/zleparameter.c
+++ b/Src/Zle/zleparameter.c
@@ -167,12 +167,19 @@ struct pardef {
Param pm;
};
+/*
+ * This is a duplicate of stdhash_gsu. On some systems
+ * (such as Cygwin) we can't put a pointer to an imported variable
+ * in a compile-time initialiser, so we use this instead.
+ */
+static const struct gsu_hash zlestdhash_gsu =
+{ hashgetfn, hashsetfn, stdunsetfn };
static const struct gsu_array keymaps_gsu =
{ keymapsgetfn, arrsetfn, stdunsetfn };
static struct pardef partab[] = {
{ "widgets", PM_READONLY,
- getpmwidgets, scanpmwidgets, &stdhash_gsu,
+ getpmwidgets, scanpmwidgets, &zlestdhash_gsu,
NULL, NULL },
{ "keymaps", PM_ARRAY|PM_SPECIAL|PM_READONLY,
NULL, NULL, NULL,
diff --git a/Src/module.c b/Src/module.c
index 4510d3037..c50e032b6 100644
--- a/Src/module.c
+++ b/Src/module.c
@@ -1894,7 +1894,31 @@ addparamdef(Paramdef d)
pm->level = 0;
pm->u.data = d->var;
- pm->gsu.i = (GsuInteger) d->gsu;
+ if (d->gsu)
+ pm->gsu.i = (GsuInteger) d->gsu;
+ else {
+ /*
+ * If no get/set/unset class, use the appropriate
+ * variable type.
+ */
+ switch (PM_TYPE(pm->flags)) {
+ case PM_SCALAR:
+ pm->gsu.s = &varscalar_gsu;
+ break;
+
+ case PM_INTEGER:
+ pm->gsu.i = &varinteger_gsu;
+ break;
+
+ case PM_ARRAY:
+ pm->gsu.a = &vararray_gsu;
+ break;
+
+ default:
+ unsetparam_pm(pm, 0, 1);
+ return 1;
+ }
+ }
return 0;
}
diff --git a/Src/zsh.h b/Src/zsh.h
index 065712457..5e0fee09b 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -1316,12 +1316,17 @@ struct paramdef {
#define PARAMDEF(name, flags, var, gsu) \
{ name, flags, (void *) var, (void *) gsu, }
+/*
+ * Note that the following definitions are appropriate for defining
+ * parameters that reference a variable (var). Hence the get/set/unset
+ * methods used will assume var needs dereferencing to get the value.
+ */
#define INTPARAMDEF(name, var) \
- { name, PM_INTEGER, (void *) var, (void *) &stdinteger_gsu }
+ { name, PM_INTEGER, (void *) var, NULL }
#define STRPARAMDEF(name, var) \
- { name, PM_SCALAR, (void *) var, (void *) &varscalar_gsu }
+ { name, PM_SCALAR, (void *) var, NULL }
#define ARRPARAMDEF(name, var) \
- { name, PM_ARRAY, (void *) var, (void *) &vararray_gsu }
+ { name, PM_ARRAY, (void *) var, NULL }
#define setsparam(S,V) assignsparam(S,V,0)
#define setaparam(S,V) assignaparam(S,V,0)