hush: functions have priority over builtins (!)
function old new delta
pseudo_exec_argv 291 305 +14
run_pipe 1560 1555 -5
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 14/-5) Total: 9 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/shell/hush.c b/shell/hush.c
index 8e9e0e9..2fba637 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -7090,11 +7090,13 @@
argv[0] = G.global_argv[0];
G.global_argv = argv;
G.global_argc = n = 1 + string_array_len(argv + 1);
+//? close_saved_fds_and_FILE_list();
/* On MMU, funcp->body is always non-NULL */
n = run_list(funcp->body);
fflush_all();
_exit(n);
# else
+//? close_saved_fds_and_FILE_list();
re_execute_shell(to_free,
funcp->body_as_string,
G.global_argv[0],
@@ -7180,6 +7182,7 @@
#if BB_MMU
int rcode;
fflush_all();
+//? close_saved_fds_and_FILE_list();
rcode = x->b_function(argv);
fflush_all();
_exit(rcode);
@@ -7301,6 +7304,16 @@
goto skip;
#endif
+#if ENABLE_HUSH_FUNCTIONS
+ /* Check if the command matches any functions (this goes before bltins) */
+ {
+ const struct function *funcp = find_function(argv[0]);
+ if (funcp) {
+ exec_function(&nommu_save->argv_from_re_execing, funcp, argv);
+ }
+ }
+#endif
+
/* Check if the command matches any of the builtins.
* Depending on context, this might be redundant. But it's
* easier to waste a few CPU cycles than it is to figure out
@@ -7317,15 +7330,6 @@
exec_builtin(&nommu_save->argv_from_re_execing, x, argv);
}
}
-#if ENABLE_HUSH_FUNCTIONS
- /* Check if the command matches any functions */
- {
- const struct function *funcp = find_function(argv[0]);
- if (funcp) {
- exec_function(&nommu_save->argv_from_re_execing, funcp, argv);
- }
- }
-#endif
#if ENABLE_FEATURE_SH_STANDALONE
/* Check if the command matches any busybox applets */
@@ -7339,7 +7343,7 @@
* should not show tty fd open.
*/
close_saved_fds_and_FILE_list();
-///FIXME: should also close saved redir fds
+//FIXME: should also close saved redir fds
debug_printf_exec("running applet '%s'\n", argv[0]);
run_applet_no_and_exit(a, argv[0], argv);
}
@@ -7976,12 +7980,13 @@
return G.last_exitcode;
}
- x = find_builtin(argv_expanded[0]);
#if ENABLE_HUSH_FUNCTIONS
- funcp = NULL;
- if (!x)
- funcp = find_function(argv_expanded[0]);
+ /* Check if argv[0] matches any functions (this goes before bltins) */
+ funcp = find_function(argv_expanded[0]);
#endif
+ x = NULL;
+ if (!funcp)
+ x = find_builtin(argv_expanded[0]);
if (x || funcp) {
if (!funcp) {
if (x->b_function == builtin_exec && argv_expanded[1] == NULL) {