1# mode: run
2# tag: nogil, withgil, exceptions
3
4cdef void foo_nogil(int i) nogil except *:
5    if i != 0: raise ValueError("huhu !")
6
7
8cdef void foo(int i) except * with gil:
9    if i != 0: raise ValueError
10
11
12cdef int bar(int i) except? -1 with gil:
13    if i != 0: raise ValueError
14    return 0
15
16
17cdef int spam(int i) except? -1 with gil:
18    if i != 0: raise TypeError
19    return -1
20
21
22def test_foo_nogil():
23    """
24    >>> test_foo_nogil()
25    """
26    #
27    foo_nogil(0)
28    foo_nogil(0)
29    with nogil:
30        foo_nogil(0)
31        foo_nogil(0)
32    #
33    try:
34        with nogil:
35            foo_nogil(0)
36    finally:
37        pass
38    #
39    try:
40        with nogil:
41            foo_nogil(0)
42        with nogil:
43            foo_nogil(0)
44    finally:
45        pass
46    #
47    try:
48        with nogil:
49            foo_nogil(0)
50        with nogil:
51            foo_nogil(1)
52    except:
53        with nogil:
54            foo_nogil(0)
55    finally:
56        with nogil:
57            foo_nogil(0)
58        pass
59    #
60    try:
61        with nogil:
62            foo_nogil(0)
63            foo_nogil(0)
64    finally:
65        pass
66    #
67    try:
68        with nogil:
69            foo_nogil(0)
70            foo_nogil(1)
71    except:
72        with nogil:
73            foo_nogil(0)
74    finally:
75        with nogil:
76            foo_nogil(0)
77        pass
78    #
79    try:
80        with nogil:
81            foo_nogil(0)
82        try:
83            with nogil:
84                foo_nogil(1)
85        except:
86            with nogil:
87                foo_nogil(1)
88        finally:
89            with nogil:
90                foo_nogil(0)
91            pass
92    except:
93        with nogil:
94            foo_nogil(0)
95    finally:
96        with nogil:
97            foo_nogil(0)
98        pass
99    #
100    try:
101        with nogil:
102            foo_nogil(0)
103        try:
104            with nogil:
105                foo_nogil(1)
106        except:
107            with nogil:
108                foo_nogil(1)
109        finally:
110            with nogil:
111                foo_nogil(1)
112            pass
113    except:
114        with nogil:
115            foo_nogil(0)
116    finally:
117        with nogil:
118            foo_nogil(0)
119        pass
120    #
121
122
123def test_foo():
124    """
125    >>> test_foo()
126    """
127    #
128    foo(0)
129    foo(0)
130    with nogil:
131        foo(0)
132        foo(0)
133    #
134    try:
135        with nogil:
136            foo(0)
137    finally:
138        pass
139    #
140    try:
141        with nogil:
142            foo(0)
143        with nogil:
144            foo(0)
145    finally:
146        pass
147    #
148    try:
149        with nogil:
150            foo(0)
151        with nogil:
152            foo(1)
153    except:
154        with nogil:
155            foo(0)
156    finally:
157        with nogil:
158            foo(0)
159        pass
160    #
161    try:
162        with nogil:
163            foo(0)
164            foo(0)
165    finally:
166        pass
167    #
168    try:
169        with nogil:
170            foo(0)
171            foo(1)
172    except:
173        with nogil:
174            foo(0)
175    finally:
176        with nogil:
177            foo(0)
178        pass
179    #
180    try:
181        with nogil:
182            foo(0)
183        try:
184            with nogil:
185                foo(1)
186        except:
187            with nogil:
188                foo(1)
189        finally:
190            with nogil:
191                foo(0)
192            pass
193    except:
194        with nogil:
195            foo(0)
196    finally:
197        with nogil:
198            foo(0)
199        pass
200    #
201    try:
202        with nogil:
203            foo(0)
204        try:
205            with nogil:
206                foo(1)
207        except:
208            with nogil:
209                foo(1)
210        finally:
211            with nogil:
212                foo(1)
213            pass
214    except:
215        with nogil:
216            foo(0)
217    finally:
218        with nogil:
219            foo(0)
220        pass
221    #
222
223
224def test_bar():
225    """
226    >>> test_bar()
227    """
228    #
229    bar(0)
230    bar(0)
231    with nogil:
232        bar(0)
233        bar(0)
234    #
235    try:
236        with nogil:
237            bar(0)
238    finally:
239        pass
240    #
241    try:
242        with nogil:
243            bar(0)
244        with nogil:
245            bar(0)
246    finally:
247        pass
248    #
249    try:
250        with nogil:
251            bar(0)
252        with nogil:
253            bar(1)
254    except ValueError:
255        with nogil:
256            bar(0)
257    finally:
258        with nogil:
259            bar(0)
260        pass
261    #
262    try:
263        with nogil:
264            bar(0)
265            bar(0)
266    finally:
267        pass
268    #
269    try:
270        with nogil:
271            bar(0)
272            bar(1)
273    except ValueError:
274        with nogil:
275            bar(0)
276    finally:
277        with nogil:
278            bar(0)
279        pass
280    #
281    try:
282        with nogil:
283            bar(0)
284        try:
285            with nogil:
286                bar(1)
287        except ValueError:
288            with nogil:
289                bar(1)
290        finally:
291            with nogil:
292                bar(0)
293            pass
294    except ValueError:
295        with nogil:
296            bar(0)
297    finally:
298        with nogil:
299            bar(0)
300        pass
301    #
302    try:
303        with nogil:
304            bar(0)
305        try:
306            with nogil:
307                bar(1)
308        except ValueError:
309            with nogil:
310                bar(1)
311        finally:
312            with nogil:
313                bar(1)
314            pass
315    except ValueError:
316        with nogil:
317            bar(0)
318    finally:
319        with nogil:
320            bar(0)
321        pass
322    #
323
324def test_spam():
325    """
326    >>> test_spam()
327    """
328    #
329    spam(0)
330    spam(0)
331    with nogil:
332        spam(0)
333        spam(0)
334    #
335    try:
336        with nogil:
337            spam(0)
338    finally:
339        pass
340    #
341    try:
342        with nogil:
343            spam(0)
344        with nogil:
345            spam(0)
346    finally:
347        pass
348    #
349    try:
350        with nogil:
351            spam(0)
352        with nogil:
353            spam(1)
354    except TypeError:
355        with nogil:
356            spam(0)
357    finally:
358        with nogil:
359            spam(0)
360        pass
361    #
362    try:
363        with nogil:
364            spam(0)
365            spam(0)
366    finally:
367        pass
368    #
369    try:
370        with nogil:
371            spam(0)
372            spam(1)
373    except TypeError:
374        with nogil:
375            spam(0)
376    finally:
377        with nogil:
378            spam(0)
379        pass
380    #
381    try:
382        with nogil:
383            spam(0)
384        try:
385            with nogil:
386                spam(1)
387        except TypeError:
388            with nogil:
389                spam(1)
390        finally:
391            with nogil:
392                spam(0)
393            pass
394    except TypeError:
395        with nogil:
396            spam(0)
397    finally:
398        with nogil:
399            spam(0)
400        pass
401    #
402    try:
403        with nogil:
404            spam(0)
405        try:
406            with nogil:
407                spam(1)
408        except TypeError:
409            with nogil:
410                spam(1)
411        finally:
412            with nogil:
413                spam(1)
414            pass
415    except TypeError:
416        with nogil:
417            spam(0)
418    finally:
419        with nogil:
420            spam(0)
421        pass
422    #
423