1 ## oils_failures_allowed: 3
2 ## our_shell: ysh
3
4 #### getFrame()
5
6 var fr = vm.getFrame(0)
7 pp test_ (fr)
8 var d = dict(fr)
9 pp test_ (d.ARGV)
10 echo
11
12 proc p1 {
13 var p1_var = 'x'
14 p2
15 }
16
17 proc p2 {
18 echo 'p2 frame -1'
19 var fr = vm.getFrame(-1)
20 var d = dict(fr)
21
22 pp test_ (fr)
23 pp test_ (d)
24 pp test_ (keys(d))
25 echo
26
27 echo 'p2 frame -2'
28 setvar fr = vm.getFrame(-2)
29 setvar d = dict(fr)
30
31 pp test_ (fr)
32 pp test_ (keys(d))
33 echo
34 }
35
36 p1
37
38 var fr = vm.getFrame(99) # fails
39
40 ## status: 3
41 ## STDOUT:
42 <Frame>
43 (List) []
44
45 p2 frame -1
46 <Frame>
47 (Dict) {"ARGV":[],"fr":<Frame>}
48 (List) ["ARGV","fr"]
49
50 p2 frame -2
51 <Frame>
52 (List) ["ARGV","p1_var"]
53
54 ## END
55
56
57 #### bindFrame()
58
59 var frag = ^(echo $i)
60
61 # TODO: should be fragment
62 pp test_ (frag)
63
64 var cmd = bindFrame(frag, vm.getFrame(0))
65
66 pp test_ (cmd)
67
68 ## STDOUT:
69 ## END
70
71 #### vm.getDebugStack()
72
73 proc p {
74 echo $[len(vm.getDebugStack())]
75 }
76
77 proc p2 {
78 p
79 }
80
81 p
82 p2
83
84 ## STDOUT:
85 1
86 2
87 ## END
88
89 #### DebugFrame.toString() running file
90
91 $[ENV.SH] $[ENV.REPO_ROOT]/spec/testdata/debug-frame-main.ysh |
92 sed -e "s;$[ENV.REPO_ROOT];MYROOT;g" -e 's;#;%;g'
93
94 ## STDOUT:
95 %1 MYROOT/spec/testdata/debug-frame-main.ysh:4
96 print-stack
97 ^~~~~~~~~~~
98
99 %1 MYROOT/spec/testdata/debug-frame-main.ysh:7
100 my-proc
101 ^~~~~~~
102 %2 MYROOT/spec/testdata/debug-frame-lib.ysh:15
103 print-stack
104 ^~~~~~~~~~~
105 ## END
106
107
108 #### DebugFrame.toString() running stdin and -c
109
110 # stdin
111 echo 'source $[ENV.REPO_ROOT]/spec/testdata/debug-frame-lib.ysh; my-proc' |
112 $[ENV.SH] |
113 sed -e "s;$[ENV.REPO_ROOT];MYROOT;g" -e 's;#;%;g'
114 echo
115
116 # -c
117 $[ENV.SH] -c 'source $[ENV.REPO_ROOT]/spec/testdata/debug-frame-lib.ysh; my-proc' |
118 sed -e "s;$[ENV.REPO_ROOT];MYROOT;g" -e 's;#;%;g'
119
120 ## STDOUT:
121 %1 [ stdin ]:1
122 source $[ENV.REPO_ROOT]/spec/testdata/debug-frame-lib.ysh; my-proc
123 ^~~~~~~
124 %2 MYROOT/spec/testdata/debug-frame-lib.ysh:15
125 print-stack
126 ^~~~~~~~~~~
127
128 %1 [ -c flag ]:1
129 source $[ENV.REPO_ROOT]/spec/testdata/debug-frame-lib.ysh; my-proc
130 ^~~~~~~
131 %2 MYROOT/spec/testdata/debug-frame-lib.ysh:15
132 print-stack
133 ^~~~~~~~~~~
134 ## END
135
136 #### DebugFrame.toString() running eval
137
138 # -c and eval
139 $[ENV.SH] -c 'source $[ENV.REPO_ROOT]/spec/testdata/debug-frame-lib.ysh; eval "my-proc a b"' |
140 sed -e "s;$[ENV.REPO_ROOT];MYROOT;g" -e 's;#;%;g'
141 echo
142
143 # eval
144 $[ENV.SH] -c 'source $[ENV.REPO_ROOT]/spec/testdata/debug-frame-eval.ysh' |
145 sed -e "s;$[ENV.REPO_ROOT];MYROOT;g" -e 's;#;%;g'
146
147 ## STDOUT:
148 %1 [ -c flag ]:1
149 source $[ENV.REPO_ROOT]/spec/testdata/debug-frame-lib.ysh; eval "my-proc a b"
150 ^
151 %2 [ eval arg at line 1 of [ -c flag ] ]:1
152 my-proc a b
153 ^~~~~~~
154 %3 MYROOT/spec/testdata/debug-frame-lib.ysh:15
155 print-stack
156 ^~~~~~~~~~~
157
158 %1 [ -c flag ]:1
159 source $[ENV.REPO_ROOT]/spec/testdata/debug-frame-eval.ysh
160 ^~~~~~
161 %2 MYROOT/spec/testdata/debug-frame-eval.ysh:7
162 p3
163 ^~
164 %3 MYROOT/spec/testdata/debug-frame-eval.ysh:4
165 eval 'my-proc x y'
166 ^
167 %4 [ eval arg at line 4 of MYROOT/spec/testdata/debug-frame-eval.ysh ]:1
168 my-proc x y
169 ^~~~~~~
170 %5 MYROOT/spec/testdata/debug-frame-lib.ysh:15
171 print-stack
172 ^~~~~~~~~~~
173 ## END
174
175 #### DebugFrame.toString() running eval methods
176 $[ENV.SH] -c '
177 source $[ENV.REPO_ROOT]/spec/testdata/debug-frame-lib.ysh
178 var b = ^(my-proc a b)
179 proc p {
180 call io->eval(b)
181 }
182 p
183 ' | sed -e "s;$[ENV.REPO_ROOT];MYROOT;g" -e 's;#;%;g'
184
185 ## STDOUT:
186 %1 [ -c flag ]:7
187 p
188 ^
189 %2 [ -c flag ]:5
190 call io->eval(b)
191 ^
192 %3 [ -c flag ]:3
193 var b = ^(my-proc a b)
194 ^~~~~~~
195 %4 MYROOT/spec/testdata/debug-frame-lib.ysh:15
196 print-stack
197 ^~~~~~~~~~~
198 ## END
199
200 #### DebugFrame.toString() running YSH functions
201
202 # functions
203 $[ENV.SH] -c 'source $[ENV.REPO_ROOT]/spec/testdata/debug-frame-lib.ysh; call-func'
204 echo
205
206 ## STDOUT:
207 z
208 ## END
209
210 #### DebugFrame.toString() with 'use' builtin
211
212 # Work around spec test builtin limitation: line starting with # is treated as
213 # a comment
214
215 #echo $[ENV.REPO_ROOT]
216
217 $[ENV.SH] -c 'use $[ENV.REPO_ROOT]/spec/testdata/debug-frame-use.ysh' |
218 sed -e "s;$[ENV.REPO_ROOT];MYROOT;g" -e 's;#;%;g'
219
220 #write -- $[ENV.REPO_ROOT] | sed "s;$[ENV.REPO_ROOT];REPO_ROOT;g"
221
222 ## STDOUT:
223 %1 [ -c flag ]:1
224 use $[ENV.REPO_ROOT]/spec/testdata/debug-frame-use.ysh
225 ^~~
226 %2 MYROOT/spec/testdata/debug-frame-use.ysh:5
227 debug-frame-lib my-proc
228 ^~~~~~~
229 %3 MYROOT/spec/testdata/debug-frame-lib.ysh:15
230 print-stack
231 ^~~~~~~~~~~
232 ## END
233
234 #### FUNCNAME BASH_LINENO BASH_SOURCE not available with YSH functions
235
236 func g(x) {
237 echo ${FUNCNAME[@]}
238 echo ${BASH_LINENO[@]}
239 echo ${BASH_SOURCE[@]}
240 }
241
242 func f(x) {
243 return (g(x))
244 }
245
246 # We can allow it in procs -- there's no cost to doing so?
247
248 proc p {
249 call f(42)
250 }
251
252 p
253
254 ## STDOUT:
255 p
256 16
257 [ stdin ]
258 ## END
259
260 #### DebugFrame.toString() with trap ERR - external failure
261
262 source $[ENV.REPO_ROOT]/spec/testdata/debug-frame-lib.ysh
263
264 trap 'print-stack (prefix=false)' ERR
265 set -o errtrace # enable always
266
267 proc f {
268 g
269 }
270
271 proc g {
272 false
273 }
274
275 f
276
277 ## status: 1
278 ## STDOUT:
279 [ stdin ]:14
280 f
281 ^
282 [ stdin ]:7
283 g
284 ^
285 [ stdin ]:11
286 false
287 ^~~~~
288 ## END
289
290 #### DebugFrame.toString() with trap ERR - proc failure
291
292 source $[ENV.REPO_ROOT]/spec/testdata/debug-frame-lib.ysh
293
294 trap 'print-stack (prefix=false)' ERR
295 set -o errtrace # enable always
296
297 proc f {
298 g
299 }
300
301 proc g {
302 ( exit 42 )
303 #return 42
304 }
305
306 f
307
308 ## status: 42
309 ## STDOUT:
310 [ stdin ]:14
311 f
312 ^
313 [ stdin ]:11
314 return 42
315 ^~~~~~
316 ## END