about summary refs log tree commit diff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/builtin.c14
-rw-r--r--Src/exec.c4
2 files changed, 8 insertions, 10 deletions
diff --git a/Src/builtin.c b/Src/builtin.c
index 010c8c1f3..b8fd3f3b8 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -2515,12 +2515,13 @@ bin_functions(char *name, char **argv, Options ops, int func)
 	    shf = (Shfunc) zshcalloc(sizeof *shf);
 	    shf->flags = on;
 	    shf->funcdef = mkautofn(shf);
+	    shfunctab->addnode(shfunctab, ztrdup(*argv), shf);
 
 	    if (!strncmp(*argv, "TRAP", 4) &&
 		(signum = getsignum(*argv + 4)) != -1) {
 		if (settrap(signum, shf->funcdef)) {
-		    freeeprog(shf->funcdef);
-		    zfree(shf, sizeof(*shf));
+		    shfunctab->removenode(shfunctab, *argv);
+		    shfunctab->freenode((HashNode)shf);
 		    returnval = 1;
 		    ok = 0;
 		}
@@ -2528,12 +2529,9 @@ bin_functions(char *name, char **argv, Options ops, int func)
 		    sigtrapped[signum] |= ZSIG_FUNC;
 	    }
 
-	    if (ok) {
-		shfunctab->addnode(shfunctab, ztrdup(*argv), shf);
-		if (OPT_ISSET(ops,'X') &&
-		    eval_autoload(shf, shf->nam, ops, func))
-		    returnval = 1;
-	    }
+	    if (ok && OPT_ISSET(ops,'X') &&
+		eval_autoload(shf, shf->nam, ops, func))
+		returnval = 1;
 	} else
 	    returnval = 1;
     }
diff --git a/Src/exec.c b/Src/exec.c
index ff34edb4b..1bc461ffa 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -3546,10 +3546,10 @@ doshfunc(char *name, Eprog prog, LinkList doshargs, int flags, int noreturnval)
     if (prog->flags & EF_RUN) {
 	Shfunc shf;
 
-	runshfunc(prog, NULL, fstack.name);
-
 	prog->flags &= ~EF_RUN;
 
+	runshfunc(prog, NULL, fstack.name);
+
 	if (!(shf = (Shfunc) shfunctab->getnode(shfunctab,
 						(name = fname)))) {
 	    zwarn("%s: function not defined by file", name, 0);