1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-10-25 17:20:25 +02:00

37014: Improved internal parameter setting.

Enhance WARNCREATEGLOBAL to work in many more cases.

Don't create REPLY as an integer if it didn't previously exist
as one, even if the value to be set is integral, as this is likely to
mess up later uses of REPLY.
This commit is contained in:
Peter Stephenson 2015-10-29 15:01:07 +00:00
parent 9640e9f497
commit 0628802baf
9 changed files with 94 additions and 29 deletions

View file

@ -1,3 +1,14 @@
2015-10-29 Peter Stephenson <p.stephenson@samsung.com>
* 37014: Functions/MIME/zsh-mime-setup,
Functions/Misc/add-zsh-hook, Src/Modules/socket.c,
Src/Modules/tcp.c, Src/Modules/zpty.c, Src/builtin.c,
Src/params.c,Src/zsh.h: improved internal parameter setting.
Enhance WARNCREATEGLOBAL to work in many more cases. Don't
create REPLY as an integer if it didn't previously exist as one,
even if the value to be set is integral, as this is likely to
mess up later uses of REPLY.
2015-10-29 Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
* 36983 (with fix from 36990): Completion/Unix/Command/_head,

View file

@ -1,7 +1,7 @@
emulate -L zsh
setopt extendedglob cbases
local opt o_verbose o_list
local opt o_verbose o_list i
autoload -Uz zsh-mime-handler

View file

@ -82,9 +82,11 @@ if (( del )); then
else
if (( ${(P)+hook} )); then
if (( ${${(P)hook}[(I)$fn]} == 0 )); then
typeset -ga $hook
set -A $hook ${(P)hook} $fn
fi
else
typeset -ga $hook
set -A $hook $fn
fi
autoload $autoopts -- $fn

View file

@ -132,7 +132,7 @@ bin_zsocket(char *nam, char **args, Options ops, UNUSED(int func))
/* allow to be closed explicitly */
fdtable[sfd] = FDT_EXTERNAL;
setiparam("REPLY", sfd);
setiparam_no_convert("REPLY", (zlong)sfd);
if (verbose)
printf("%s listener is on fd %d\n", soun.sun_path, sfd);
@ -220,7 +220,7 @@ bin_zsocket(char *nam, char **args, Options ops, UNUSED(int func))
sfd = rfd;
}
setiparam("REPLY", sfd);
setiparam_no_convert("REPLY", (zlong)sfd);
if (verbose)
printf("new connection from %s is on fd %d\n", soun.sun_path, sfd);
@ -261,7 +261,7 @@ bin_zsocket(char *nam, char **args, Options ops, UNUSED(int func))
fdtable[sfd] = FDT_EXTERNAL;
}
setiparam("REPLY", sfd);
setiparam_no_convert("REPLY", (zlong)sfd);
if (verbose)
printf("%s is now on fd %d\n", soun.sun_path, sfd);

View file

@ -461,7 +461,7 @@ bin_ztcp(char *nam, char **args, Options ops, UNUSED(int func))
return 1;
}
setiparam("REPLY", sess->fd);
setiparam_no_convert("REPLY", (zlong)sess->fd);
if (verbose)
printf("%d listener is on fd %d\n", ntohs(sess->sock.in.sin_port), sess->fd);
@ -562,7 +562,7 @@ bin_ztcp(char *nam, char **args, Options ops, UNUSED(int func))
sess->fd = rfd;
}
setiparam("REPLY", sess->fd);
setiparam_no_convert("REPLY", (zlong)sess->fd);
if (verbose)
printf("%d is on fd %d\n", ntohs(sess->peer.in.sin_port), sess->fd);
@ -681,7 +681,7 @@ bin_ztcp(char *nam, char **args, Options ops, UNUSED(int func))
}
}
setiparam("REPLY", sess->fd);
setiparam_no_convert("REPLY", (zlong)sess->fd);
if (verbose)
printf("%s:%d is now on fd %d\n",

View file

@ -464,7 +464,7 @@ newptycmd(char *nam, char *pname, char **args, int echo, int nblock)
#endif
errno == EINTR));
setiparam("REPLY", master);
setiparam_no_convert("REPLY", (zlong)master);
return 0;
}

View file

@ -2090,7 +2090,9 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func),
tc = 0; /* but don't do a normal conversion */
}
} else if (!setsecondstype(pm, on, off)) {
if (asg->value.scalar && !(pm = setsparam(pname, ztrdup(asg->value.scalar))))
if (asg->value.scalar &&
!(pm = assignsparam(
pname, ztrdup(asg->value.scalar), 0)))
return NULL;
usepm = 1;
err = 0;
@ -2202,12 +2204,13 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func),
} else if (pm->env && !(pm->node.flags & PM_HASHELEM))
delenv(pm);
DPUTS(ASG_ARRAYP(asg), "BUG: typeset got array value where scalar expected");
if (asg->value.scalar && !(pm = setsparam(pname, ztrdup(asg->value.scalar))))
if (asg->value.scalar &&
!(pm = assignsparam(pname, ztrdup(asg->value.scalar), 0)))
return NULL;
} else if (asg->is_array) {
if (!(pm = setaparam(pname, asg->value.array ?
if (!(pm = assignaparam(pname, asg->value.array ?
zlinklist2array(asg->value.array) :
mkarray(NULL))))
mkarray(NULL), 0)))
return NULL;
}
pm->node.flags |= (on & PM_READONLY);
@ -2347,16 +2350,18 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func),
* creating a stray parameter along the way via createparam(),
* now called below in the isident() branch.
*/
if (!(pm = setsparam(pname, ztrdup(asg->value.scalar ? asg->value.scalar : ""))))
if (!(pm = assignsparam(
pname,
ztrdup(asg->value.scalar ? asg->value.scalar : ""), 0)))
return NULL;
dont_set = 1;
asg->is_array = 0;
keeplocal = 0;
on = pm->node.flags;
} else if (PM_TYPE(on) == PM_ARRAY && ASG_ARRAYP(asg)) {
if (!(pm = setaparam(pname, asg->value.array ?
zlinklist2array(asg->value.array) :
mkarray(NULL))))
if (!(pm = assignaparam(pname, asg->value.array ?
zlinklist2array(asg->value.array) :
mkarray(NULL), 0)))
return NULL;
dont_set = 1;
keeplocal = 0;
@ -2433,13 +2438,13 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func),
Param ipm = pm;
if (pm->node.flags & (PM_ARRAY|PM_HASHED)) {
DPUTS(!ASG_ARRAYP(asg), "BUG: inconsistent scalar value for array");
if (!(pm=setaparam(pname, asg->value.array ?
zlinklist2array(asg->value.array) :
mkarray(NULL))))
if (!(pm=assignaparam(pname, asg->value.array ?
zlinklist2array(asg->value.array) :
mkarray(NULL), 0)))
return NULL;
} else {
DPUTS(ASG_ARRAYP(asg), "BUG: inconsistent array value for scalar");
if (!(pm = setsparam(pname, ztrdup(asg->value.scalar))))
if (!(pm = assignsparam(pname, ztrdup(asg->value.scalar), 0)))
return NULL;
}
if (pm != ipm) {
@ -2687,9 +2692,10 @@ bin_typeset(char *name, char **argv, LinkList assigns, Options ops, int func)
/* Update join character */
tdp->joinchar = joinchar;
if (asg0.value.scalar)
setsparam(asg0.name, ztrdup(asg0.value.scalar));
assignsparam(asg0.name, ztrdup(asg0.value.scalar), 0);
else if (asg->value.array)
setaparam(asg->name, zlinklist2array(asg->value.array));
assignaparam(
asg->name, zlinklist2array(asg->value.array), 0);
return 0;
} else {
zwarnnam(name, "can't tie already tied scalar: %s",
@ -2750,9 +2756,9 @@ bin_typeset(char *name, char **argv, LinkList assigns, Options ops, int func)
zsfree(apm->ename);
apm->ename = ztrdup(asg0.name);
if (asg->value.array)
setaparam(asg->name, zlinklist2array(asg->value.array));
assignaparam(asg->name, zlinklist2array(asg->value.array), 0);
else if (oldval)
setsparam(asg0.name, oldval);
assignsparam(asg0.name, oldval, 0);
unqueue_signals();
return 0;

View file

@ -2826,6 +2826,15 @@ assignsparam(char *s, char *val, int flags)
return v->pm;
}
/**/
mod_export Param
setsparam(char *s, char *val)
{
return assignsparam(
s, val, isset(WARNCREATEGLOBAL) && locallevel > 0 ?
ASSPM_WARN_CREATE : 0);
}
/**/
mod_export Param
assignaparam(char *s, char **val, int flags)
@ -2914,6 +2923,16 @@ assignaparam(char *s, char **val, int flags)
return v->pm;
}
/**/
mod_export Param
setaparam(char *s, char **aval)
{
return assignaparam(
s, aval, isset(WARNCREATEGLOBAL) && locallevel >0 ?
ASSPM_WARN_CREATE : 0);
}
/**/
mod_export Param
sethparam(char *s, char **val)
@ -2937,11 +2956,15 @@ sethparam(char *s, char **val)
if (unset(EXECOPT))
return NULL;
queue_signals();
if (!(v = fetchvalue(&vbuf, &s, 1, SCANPM_ASSIGNING)))
if (!(v = fetchvalue(&vbuf, &s, 1, SCANPM_ASSIGNING))) {
createparam(t, PM_HASHED);
else if (!(PM_TYPE(v->pm->node.flags) & PM_HASHED) &&
if (isset(WARNCREATEGLOBAL) && locallevel > 0 && v->pm->level == 0)
zwarn("associative array parameter %s created globally in function",
v->pm->node.nam);
} else if (!(PM_TYPE(v->pm->node.flags) & PM_HASHED) &&
!(v->pm->node.flags & PM_SPECIAL)) {
unsetparam(t);
/* no WARNCREATEGLOBAL check here as parameter already existed */
createparam(t, PM_HASHED);
v = NULL;
}
@ -2968,6 +2991,7 @@ setnparam(char *s, mnumber val)
Value v;
char *t = s, *ss;
Param pm;
int was_unset = 0;
if (!isident(s)) {
zerr("not an identifier: %s", s);
@ -2987,6 +3011,7 @@ setnparam(char *s, mnumber val)
*/
unset(KSHARRAYS) && !ss) {
unsetparam_pm(v->pm, 0, 1);
was_unset = 1;
s = t;
v = NULL;
}
@ -3007,6 +3032,10 @@ setnparam(char *s, mnumber val)
}
v = getvalue(&vbuf, &t, 1);
DPUTS(!v, "BUG: value not found for new parameter");
if (!was_unset && isset(WARNCREATEGLOBAL) && locallevel > 0 &&
v->pm->level == 0)
zwarn("numeric parameter %s created globally in function",
v->pm->node.nam);
}
setnumvalue(v, val);
unqueue_signals();
@ -3025,6 +3054,26 @@ setiparam(char *s, zlong val)
return setnparam(s, mnval);
}
/*
* Set an integer parameter without forcing creation of an integer type.
* This is useful if the integer is going to be set to a parmaeter which
* would usually be scalar but may not exist.
*/
/**/
mod_export Param
setiparam_no_convert(char *s, zlong val)
{
/*
* If the target is already an integer, thisgets converted
* back. Low technology rules.
*/
char buf[BDIGBUFSIZE];
convbase(buf, val, 10);
return assignsparam(
s, ztrdup(buf),
isset(WARNCREATEGLOBAL) && locallevel > 0 ? ASSPM_WARN_CREATE : 0);
}
/* Unset a parameter */

View file

@ -1939,9 +1939,6 @@ struct paramdef {
{ name, flags | PM_SPECIAL | PM_HIDE | PM_HIDEVAL, \
NULL, gsufn, getfn, scanfn, NULL }
#define setsparam(S,V) assignsparam(S,V,0)
#define setaparam(S,V) assignaparam(S,V,0)
/*
* Flags for assignsparam and assignaparam.
*/