diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2016-10-25 20:26:02 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2016-10-25 20:26:02 +0200 |
commit | 7aec86820d7bcf2842d167969c4fa7159ea643f7 (patch) | |
tree | a53577353eebe340ba6bc6571944752957b047be | |
parent | 20a2cd6291924d405e636916962c6294d3b8544e (diff) | |
download | busybox-w32-7aec86820d7bcf2842d167969c4fa7159ea643f7.tar.gz busybox-w32-7aec86820d7bcf2842d167969c4fa7159ea643f7.tar.bz2 busybox-w32-7aec86820d7bcf2842d167969c4fa7159ea643f7.zip |
ash: [EVAL] Let funcnode refer to a function definition, not its first command
Upstream patch:
Date: Tue, 15 Mar 2011 15:44:47 +0800
[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>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | shell/ash.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/shell/ash.c b/shell/ash.c index 8092e3971..b7f20ba36 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -8449,14 +8449,14 @@ copyfunc(union node *n) | |||
8449 | * Define a shell function. | 8449 | * Define a shell function. |
8450 | */ | 8450 | */ |
8451 | static void | 8451 | static void |
8452 | defun(char *name, union node *func) | 8452 | defun(union node *func) |
8453 | { | 8453 | { |
8454 | struct cmdentry entry; | 8454 | struct cmdentry entry; |
8455 | 8455 | ||
8456 | INT_OFF; | 8456 | INT_OFF; |
8457 | entry.cmdtype = CMDFUNCTION; | 8457 | entry.cmdtype = CMDFUNCTION; |
8458 | entry.u.func = copyfunc(func); | 8458 | entry.u.func = copyfunc(func); |
8459 | addcmdentry(name, &entry); | 8459 | addcmdentry(func->narg.text, &entry); |
8460 | INT_ON; | 8460 | INT_ON; |
8461 | } | 8461 | } |
8462 | 8462 | ||
@@ -8654,7 +8654,7 @@ evaltree(union node *n, int flags) | |||
8654 | status = 0; | 8654 | status = 0; |
8655 | goto setstatus; | 8655 | goto setstatus; |
8656 | case NDEFUN: | 8656 | case NDEFUN: |
8657 | defun(n->narg.text, n->narg.next); | 8657 | defun(n); |
8658 | /* Not necessary. To test it: | 8658 | /* Not necessary. To test it: |
8659 | * "false; f() { qwerty; }; echo $?" should print 0. | 8659 | * "false; f() { qwerty; }; echo $?" should print 0. |
8660 | */ | 8660 | */ |
@@ -9079,7 +9079,7 @@ evalfun(struct funcnode *func, int argc, char **argv, int flags) | |||
9079 | shellparam.optind = 1; | 9079 | shellparam.optind = 1; |
9080 | shellparam.optoff = -1; | 9080 | shellparam.optoff = -1; |
9081 | #endif | 9081 | #endif |
9082 | evaltree(&func->n, flags & EV_TESTED); | 9082 | evaltree(func->n.narg.next, flags & EV_TESTED); |
9083 | funcdone: | 9083 | funcdone: |
9084 | INT_OFF; | 9084 | INT_OFF; |
9085 | funcnest--; | 9085 | funcnest--; |