1%prep
2
3  setopt localtraps
4
5%test
6
7  unsetopt DEBUG_BEFORE_CMD
8  debug-trap-bug1() {
9    setopt localtraps
10    print "print bug file here" >bug-file
11    print "print this is line one
12    print this is line two
13    print this is line three
14    print and this is line fifty-nine." >bug-file2
15    function debug_trap_handler {
16	print $functrace[1]
17	do_bug
18    }
19    function do_bug {
20       . ./bug-file
21    }
22    trap 'echo EXIT hit' EXIT
23    trap 'debug_trap_handler' DEBUG
24    . ./bug-file2
25  }
26  debug-trap-bug1
270: Relationship between traps and sources
28>debug-trap-bug1:15
29>bug file here
30>this is line one
31>./bug-file2:1
32>bug file here
33>this is line two
34>./bug-file2:2
35>bug file here
36>this is line three
37>./bug-file2:3
38>bug file here
39>and this is line fifty-nine.
40>./bug-file2:4
41>bug file here
42>debug-trap-bug1:16
43>bug file here
44>EXIT hit
45
46  cat >zsh-trapreturn-bug2 <<-'HERE'
47	cmd='./fdasfsdafd'
48	[[ -x $cmd ]] && rm $cmd
49	set -o DEBUG_BEFORE_CMD
50	trap '[[ $? -ne 0 ]] && exit 0' DEBUG
51	$cmd  # invalid command
52	# Failure
53	exit 10
54	HERE
55  $ZTST_testdir/../Src/zsh -f ./zsh-trapreturn-bug2 2>erroutput.dif
56  mystat=$?
57  (
58   setopt extendedglob
59   print ${"$(< erroutput.dif)"%%:[^:]#: ./fdasfsdafd}
60  )
61  (( mystat == 0 ))
620: trapreturn handling bug is properly fixed
63>./zsh-trapreturn-bug2:5
64
65  fn() {
66    setopt localtraps localoptions debugbeforecmd
67    trap '(( LINENO == 4 )) && setopt errexit' DEBUG
68    print $LINENO three
69    print $LINENO four
70    print $LINENO five
71    [[ -o errexit ]] && print "Hey, ERREXIT is set!"
72  }
73  fn
741:Skip line from DEBUG trap
75>3 three
76>5 five
77
78  # Assignments are a special case, since they use a simpler
79  # wordcode type, so we need to test skipping them separately.
80  fn() {
81    setopt localtraps localoptions debugbeforecmd
82    trap '(( LINENO == 4 )) && setopt errexit' DEBUG
83    x=three
84    x=four
85    print $LINENO $x
86    [[ -o errexit ]] && print "Hey, ERREXIT is set!"
87  }
88  fn
891:Skip assignment from DEBUG trap
90>5 three
91
92  fn() {
93    setopt localtraps localoptions debugbeforecmd
94    trap 'print $LINENO' DEBUG
95    [[ a = a ]] && print a is ok
96  }
97  fn
980:line numbers of complex sublists
99>3
100>a is ok
101
102  fn() {
103    setopt localtraps localoptions debugbeforecmd
104    trap 'print $LINENO' DEBUG
105    print before
106    x='    first
107    second
108    third'
109    print $x
110  }
111  fn
1120:line numbers of multiline assignments
113>3
114>before
115>4
116>7
117>    first
118>    second
119>    third
120
121  fn() {
122    emulate -L zsh; setopt debugbeforecmd
123    trap 'print "$LINENO: '\''$ZSH_DEBUG_CMD'\''"' DEBUG
124    print foo &&
125    print bar ||
126    print rod
127    x=y
128    print $x
129    fn2() { echo wow }
130    fn2
131  }
132  fn
1330:ZSH_DEBUG_CMD in debug traps
134>3: 'print foo && print bar || print rod'
135>foo
136>bar
137>6: 'x=y '
138>7: 'print $x'
139>y
140>8: 'fn2 () {
141>	echo wow
142>}'
143>9: 'fn2'
144>0: 'echo wow'
145>wow
146
147  foo() {
148    emulate -L zsh; setopt debugbeforecmd
149    trap '[[ $ZSH_DEBUG_CMD == *bar* ]] && return 2' DEBUG
150    echo foo
151    echo bar
152  }
153  foo
1542:Status of forced return from eval-style DEBUG trap
155>foo
156
157%clean
158
159 rm -f bug-file bug-file2 erroutput.dif zsh-trapreturn-bug2
160