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) {