From 17e576782c4fd64194d4908af5b9774308f1205f Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Mon, 26 Jul 2004 13:18:07 +0000 Subject: 20198: fix TRAPEXIT. --- ChangeLog | 6 ++++++ Src/exec.c | 6 ++++-- Src/signals.c | 7 ++++--- Test/C03traps.ztst | 7 +++++++ Test/Makefile.in | 3 ++- Test/ztst.zsh | 2 ++ 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 + + * 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 * 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. -- cgit 1.4.1