summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bin/sh/eval.c4
-rw-r--r--bin/sh/exec.c2
-rw-r--r--bin/sh/mknodes.c6
-rw-r--r--bin/sh/nodes.c.pat13
-rw-r--r--tools/regression/bin/sh/execution/func2.011
5 files changed, 28 insertions, 8 deletions
diff --git a/bin/sh/eval.c b/bin/sh/eval.c
index 8dfa7dd..7978b84 100644
--- a/bin/sh/eval.c
+++ b/bin/sh/eval.c
@@ -807,9 +807,9 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd)
funcnest++;
exitstatus = oexitstatus;
if (flags & EV_TESTED)
- evaltree(&cmdentry.u.func->n, EV_TESTED);
+ evaltree(getfuncnode(cmdentry.u.func), EV_TESTED);
else
- evaltree(&cmdentry.u.func->n, 0);
+ evaltree(getfuncnode(cmdentry.u.func), 0);
funcnest--;
INTOFF;
unreffunc(cmdentry.u.func);
diff --git a/bin/sh/exec.c b/bin/sh/exec.c
index 639a23c..8107821 100644
--- a/bin/sh/exec.c
+++ b/bin/sh/exec.c
@@ -286,7 +286,7 @@ printentry(struct tblentry *cmdp, int verbose)
out1fmt("function %s", cmdp->cmdname);
if (verbose) {
INTOFF;
- name = commandtext(&cmdp->param.func->n);
+ name = commandtext(getfuncnode(cmdp->param.func));
out1c(' ');
out1str(name);
ckfree(name);
diff --git a/bin/sh/mknodes.c b/bin/sh/mknodes.c
index 904f9f4..1a177f8 100644
--- a/bin/sh/mknodes.c
+++ b/bin/sh/mknodes.c
@@ -248,11 +248,9 @@ output(char *file)
fputs("\tstruct nodelist *next;\n", hfile);
fputs("\tunion node *n;\n", hfile);
fputs("};\n\n\n", hfile);
- fputs("struct funcdef {\n", hfile);
- fputs("\tunsigned int refcount;\n", hfile);
- fputs("\tunion node n;\n", hfile);
- fputs("};\n\n\n", hfile);
+ fputs("struct funcdef;\n", hfile);
fputs("struct funcdef *copyfunc(union node *);\n", hfile);
+ fputs("union node *getfuncnode(struct funcdef *);\n", hfile);
fputs("void reffunc(struct funcdef *);\n", hfile);
fputs("void unreffunc(struct funcdef *);\n", hfile);
diff --git a/bin/sh/nodes.c.pat b/bin/sh/nodes.c.pat
index b6a8559..1f5adbb 100644
--- a/bin/sh/nodes.c.pat
+++ b/bin/sh/nodes.c.pat
@@ -61,6 +61,10 @@ STATIC struct nodelist *copynodelist(struct nodelist *);
STATIC char *nodesavestr(char *);
+struct funcdef {
+ unsigned int refcount;
+ union node n;
+};
/*
* Make a copy of a parse tree.
@@ -85,6 +89,12 @@ copyfunc(union node *n)
}
+union node *
+getfuncnode(struct funcdef *fn)
+{
+ return fn == NULL ? NULL : &fn->n;
+}
+
STATIC void
calcsize(union node *n)
@@ -153,7 +163,8 @@ nodesavestr(char *s)
void
reffunc(struct funcdef *fn)
{
- fn->refcount++;
+ if (fn)
+ fn->refcount++;
}
diff --git a/tools/regression/bin/sh/execution/func2.0 b/tools/regression/bin/sh/execution/func2.0
new file mode 100644
index 0000000..affa802
--- /dev/null
+++ b/tools/regression/bin/sh/execution/func2.0
@@ -0,0 +1,11 @@
+# $FreeBSD$
+
+f() { }
+f
+hash -v f >/dev/null
+f() { { }; }
+f
+hash -v f >/dev/null
+f() { { } }
+f
+hash -v f >/dev/null
OpenPOWER on IntegriCloud