summary refs log tree commit diff
diff options
context:
space:
mode:
authorHarald van Dijk <harald@gigawatt.nl>2011-03-15 15:44:47 +0800
committerHerbert Xu <herbert@gondor.apana.org.au>2011-03-15 15:44:47 +0800
commitaccde25e09f39d3aca64a50c72f23bf84d312757 (patch)
treee925e3d3adf92a853a2d4c56d7cf9b9b2ff22ee9
parent[SHELL] Port to Solaris (diff)
downloaddash-accde25e09f39d3aca64a50c72f23bf84d312757.tar.gz
dash-accde25e09f39d3aca64a50c72f23bf84d312757.zip
[EVAL] Let funcnode refer to a function definition, not its first command
It is not unrelated: I changed the meaning of struct funcnode's field n
to refer to the function definition, rather than the list of the
function's commands, because I needed to refer to the function
definition node from evalfun, which only gets passed a funcnode. But it
is something that could be applied independently (without being useful
by itself), so I've attached it as a separate patch for easier review.

Signed-off-by: Harald van Dijk <harald@gigawatt.nl>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--ChangeLog4
-rw-r--r--src/eval.c4
-rw-r--r--src/exec.c4
-rw-r--r--src/exec.h2
4 files changed, 9 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 08c3792..3e7465b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2011-03-15  Harald van Dijk <harald@gigawatt.nl>
+
+	* Let funcnode refer to a function definition, not its first command.
+
 2011-03-15  Brian Koropoff <bkoropoff@gmail.com>
 
 	* Port to Solaris.
diff --git a/src/eval.c b/src/eval.c
index 6e5c43e..9f4388a 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -296,7 +296,7 @@ calleval:
 		}
 		goto success;
 	case NDEFUN:
-		defun(n->narg.text, n->narg.next);
+		defun(n);
 success:
 		status = 0;
 setstatus:
@@ -954,7 +954,7 @@ evalfun(struct funcnode *func, int argc, char **argv, int flags)
 	shellparam.optind = 1;
 	shellparam.optoff = -1;
 	pushlocalvars();
-	evaltree(&func->n, flags & EV_TESTED);
+	evaltree(func->n.narg.next, flags & EV_TESTED);
 	poplocalvars(0);
 funcdone:
 	INTOFF;
diff --git a/src/exec.c b/src/exec.c
index 194088b..a13ad67 100644
--- a/src/exec.c
+++ b/src/exec.c
@@ -690,14 +690,14 @@ addcmdentry(char *name, struct cmdentry *entry)
  */
 
 void
-defun(char *name, union node *func)
+defun(union node *func)
 {
 	struct cmdentry entry;
 
 	INTOFF;
 	entry.cmdtype = CMDFUNCTION;
 	entry.u.func = copyfunc(func);
-	addcmdentry(name, &entry);
+	addcmdentry(func->narg.text, &entry);
 	INTON;
 }
 
diff --git a/src/exec.h b/src/exec.h
index daa6f10..9ccb305 100644
--- a/src/exec.h
+++ b/src/exec.h
@@ -71,7 +71,7 @@ void changepath(const char *);
 #ifdef notdef
 void getcmdentry(char *, struct cmdentry *);
 #endif
-void defun(char *, union node *);
+void defun(union node *);
 void unsetfunc(const char *);
 int typecmd(int, char **);
 int commandcmd(int, char **);