summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/exec.c3
-rw-r--r--Src/math.c25
2 files changed, 27 insertions, 1 deletions
diff --git a/Src/exec.c b/Src/exec.c
index 109a04a26..da808d6f1 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -176,7 +176,8 @@ mod_export int sfcontext;
/**/
struct execstack *exstack;
-/* Stack with names of functions currently active. */
+/* Stack with names of function calls, 'source' calls, and 'eval' calls
+ * currently active. */
/**/
mod_export Funcstack funcstack;
diff --git a/Src/math.c b/Src/math.c
index 977e92345..56565a629 100644
--- a/Src/math.c
+++ b/Src/math.c
@@ -894,6 +894,24 @@ getcvar(char *s)
}
+/* 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)
@@ -929,6 +947,13 @@ 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) {
/*