diff options
author | Peter Stephenson <pws@zsh.org> | 2015-10-29 17:06:27 +0000 |
---|---|---|
committer | Peter Stephenson <pws@zsh.org> | 2015-10-29 17:06:27 +0000 |
commit | de9effbce601db7ad7f7f0d0969b70b920b4e371 (patch) | |
tree | dcd69faaedb1322e922df67ed1285981b4c06d8d | |
parent | 300a58f5935631cad660ed238315e68bb86fca8c (diff) | |
download | zsh-de9effbce601db7ad7f7f0d0969b70b920b4e371.tar.gz zsh-de9effbce601db7ad7f7f0d0969b70b920b4e371.tar.xz zsh-de9effbce601db7ad7f7f0d0969b70b920b4e371.zip |
37018: Make WARNCREATEGLOBAL more consistent.
Wd don't need separate math handling any more, and can make it output the function name in all cases.
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | Src/math.c | 26 | ||||
-rw-r--r-- | Src/params.c | 52 | ||||
-rw-r--r-- | Test/E01options.ztst | 6 |
4 files changed, 45 insertions, 42 deletions
diff --git a/ChangeLog b/ChangeLog index b45d5b59e..ba9113487 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2015-10-29 Peter Stephenson <p.stephenson@samsung.com> + * 37018: Src/math.c, Src/params.c, Test/E01options.ztst: make + WARNCREATEGLOBAL consistent in all cases, outputting file name. + * unposted: .giignore: ignore .orig files. * 37014: Functions/MIME/zsh-mime-setup, diff --git a/Src/math.c b/Src/math.c index eee21e146..37981cf22 100644 --- a/Src/math.c +++ b/Src/math.c @@ -893,25 +893,6 @@ getcvar(char *s) return mn; } - -/* If script execution is inside a function call that hasn't returned, - * return the name of that function. Else return NULL. - */ - -/**/ -static const char * -in_function_call(void) -{ - Funcstack i; - for (i = funcstack; i; i = i->prev) - if (i->tp == FS_FUNC) { - DPUTS(!i->name, "funcstack entry with no name"); - return i->name; - } - - return NULL; -} - /**/ static mnumber setmathvar(struct mathvalue *mvp, mnumber v) @@ -947,13 +928,6 @@ setmathvar(struct mathvalue *mvp, mnumber v) if (noeval) return v; untokenize(mvp->lval); - if (isset(WARNCREATEGLOBAL)) { - const char *function_name; - if (!paramtab->getnode(paramtab, mvp->lval) && - (function_name = in_function_call())) - zwarn("math parameter %s created globally in function %s", - mvp->lval, function_name); - } pm = setnparam(mvp->lval, v); if (pm) { /* diff --git a/Src/params.c b/Src/params.c index 4d33660fb..5058695bb 100644 --- a/Src/params.c +++ b/Src/params.c @@ -2695,6 +2695,37 @@ gethkparam(char *s) } /**/ +static void +check_warn_create(Param pm, const char *pmtype) +{ + Funcstack i; + const char *name; + + if (pm->level != 0) + return; + + name = NULL; + for (i = funcstack; i; i = i->prev) { + if (i->tp == FS_FUNC) { + DPUTS(!i->name, "funcstack entry with no name"); + name = i->name; + break; + } + } + + if (name) + { + zwarn("%s parameter %s created globally in function %s", + pmtype, pm->node.nam, name); + } + else + { + zwarn("%s parameter %s created globally in function", + pmtype, pm->node.nam); + } +} + +/**/ mod_export Param assignsparam(char *s, char *val, int flags) { @@ -2747,9 +2778,8 @@ assignsparam(char *s, char *val, int flags) zsfree(val); return NULL; } - if ((flags & ASSPM_WARN_CREATE) && v->pm->level == 0) - zwarn("scalar parameter %s created globally in function", - v->pm->node.nam); + if (flags & ASSPM_WARN_CREATE) + check_warn_create(v->pm, "scalar"); if (flags & ASSPM_AUGMENT) { if (v->start == 0 && v->end == -1) { switch (PM_TYPE(v->pm->node.flags)) { @@ -2898,9 +2928,8 @@ assignaparam(char *s, char **val, int flags) return NULL; } - if ((flags & ASSPM_WARN_CREATE) && v->pm->level == 0) - zwarn("array parameter %s created globally in function", - v->pm->node.nam); + if (flags & ASSPM_WARN_CREATE) + check_warn_create(v->pm, "array"); if (flags & ASSPM_AUGMENT) { if (v->start == 0 && v->end == -1) { if (PM_TYPE(v->pm->node.flags) & PM_ARRAY) { @@ -2958,9 +2987,8 @@ sethparam(char *s, char **val) queue_signals(); if (!(v = fetchvalue(&vbuf, &s, 1, SCANPM_ASSIGNING))) { createparam(t, PM_HASHED); - if (isset(WARNCREATEGLOBAL) && locallevel > 0 && v->pm->level == 0) - zwarn("associative array parameter %s created globally in function", - v->pm->node.nam); + if (isset(WARNCREATEGLOBAL) && locallevel > 0) + check_warn_create(v->pm, "associative array"); } else if (!(PM_TYPE(v->pm->node.flags) & PM_HASHED) && !(v->pm->node.flags & PM_SPECIAL)) { unsetparam(t); @@ -3032,10 +3060,8 @@ 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); + if (!was_unset && isset(WARNCREATEGLOBAL) && locallevel > 0) + check_warn_create(v->pm, "numeric parameter"); } setnumvalue(v, val); unqueue_signals(); diff --git a/Test/E01options.ztst b/Test/E01options.ztst index 1caee8d24..15468e888 100644 --- a/Test/E01options.ztst +++ b/Test/E01options.ztst @@ -1116,9 +1116,9 @@ } fn 0:WARN_CREATE_GLOBAL option -?fn:3: scalar parameter foo1 created globally in function -?fn:5: scalar parameter foo1 created globally in function -?fn:15: math parameter foo5 created globally in function fn +?fn:3: scalar parameter foo1 created globally in function fn +?fn:5: scalar parameter foo1 created globally in function fn +?fn:15: numeric parameter parameter foo5 created globally in function fn # This really just tests if XTRACE is egregiously broken. # To test it properly would need a full set of its own. |