about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--Src/exec.c6
-rw-r--r--Src/signals.c7
-rw-r--r--Test/C03traps.ztst7
-rw-r--r--Test/Makefile.in3
-rwxr-xr-xTest/ztst.zsh2
6 files changed, 25 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 4574ca4f4..b51b03590 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2004-07-26  Peter Stephenson  <pws@csr.com>
+
+	* 20198: Src/exec.c, Src/signals.c, Test/C03traps.ztst,
+	Test/Makefile.in, Test/ztst.zsh: EXIT traps were freed before
+	being run.  This isn't recommended by most programming text books.
+
 2004-07-25  Bart Schaefer  <schaefer@zsh.org>
 
 	* unposted: Doc/Zsh/contrib.yo: documentation for "zargs".
diff --git a/Src/exec.c b/Src/exec.c
index 83f397335..ee0752035 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -3495,7 +3495,8 @@ doshfunc(char *name, Eprog prog, LinkList doshargs, int flags, int noreturnval)
 	memcpy(oldpipestats, pipestats, bytes);
     }
 
-    starttrapscope();
+    if (!intrap)
+	starttrapscope();
 
     tab = pparams;
     if (!(flags & PM_UNDEFINED))
@@ -3595,7 +3596,8 @@ doshfunc(char *name, Eprog prog, LinkList doshargs, int flags, int noreturnval)
 	opts[LOCALOPTIONS] = saveopts[LOCALOPTIONS];
     }
 
-    endtrapscope();
+    if (!intrap)
+	endtrapscope();
 
     if (trapreturn < -1)
 	trapreturn++;
diff --git a/Src/signals.c b/Src/signals.c
index 1c134aaa6..064feb480 100644
--- a/Src/signals.c
+++ b/Src/signals.c
@@ -939,6 +939,10 @@ endtrapscope(void)
  * with non-standard sigtrapped & sigfuncs values
  */
 
+/* Are we already executing a trap? */
+/**/
+int intrap;
+
 /**/
 void
 dotrapargs(int sig, int *sigtr, void *sigfn)
@@ -949,9 +953,6 @@ dotrapargs(int sig, int *sigtr, void *sigfn)
     int obreaks = breaks;
     int isfunc;
 
-    /* Are we already executing a trap? */
-    static int intrap;
-
     /* if signal is being ignored or the trap function		      *
      * is NULL, then return					      *
      *								      *
diff --git a/Test/C03traps.ztst b/Test/C03traps.ztst
index 26ba73da5..3ef399efd 100644
--- a/Test/C03traps.ztst
+++ b/Test/C03traps.ztst
@@ -57,6 +57,13 @@
 >Function 1 going
 >Function 2 going
 
+# $ZTST_exe is relative to the parent directory.
+# We ought to fix this in ztst.zsh...
+  cd ..
+  $ZTST_exe -fc 'TRAPEXIT() { print Exited.; }'
+0:EXIT traps on a script
+>Exited.
+
   fn1() {
     trap
     trap 'print INT1' INT
diff --git a/Test/Makefile.in b/Test/Makefile.in
index 2e14b99ea..1e03c703f 100644
--- a/Test/Makefile.in
+++ b/Test/Makefile.in
@@ -46,7 +46,8 @@ check test:
 	  $(MAKE) MODDIR=`pwd`/$(subdir)/Modules install.modules > /dev/null; \
 	fi
 	-for f in $(sdir)/$(TESTNUM)*.ztst; do \
-	  $(dir_top)/Src/zsh +Z -f $(sdir)/ztst.zsh $$f; \
+	  ZTST_exe=$(dir_top)/Src/zsh \
+	    $(dir_top)/Src/zsh +Z -f $(sdir)/ztst.zsh $$f; \
 	done
 	rm -rf Modules .zcompdump
 
diff --git a/Test/ztst.zsh b/Test/ztst.zsh
index 51ca12a30..a110c401c 100755
--- a/Test/ztst.zsh
+++ b/Test/ztst.zsh
@@ -31,6 +31,8 @@ emulate -R zsh
 # Set the module load path to correspond to this build of zsh.
 # This Modules directory should have been created by "make check".
 [[ -d Modules/zsh ]] && module_path=( $PWD/Modules )
+# Allow this to be passed down.
+export MODULE_PATH
 
 # We need to be able to save and restore the options used in the test.
 # We use the $options variable of the parameter module for this.