1// Copyright 2013 the V8 project authors. All rights reserved.
2// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions
6// are met:
7// 1.  Redistributions of source code must retain the above copyright
8//     notice, this list of conditions and the following disclaimer.
9// 2.  Redistributions in binary form must reproduce the above copyright
10//     notice, this list of conditions and the following disclaimer in the
11//     documentation and/or other materials provided with the distribution.
12//
13// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
24description(
25"This tests that throwing from a finally block has the expected effect."
26);
27
28var events = [];
29
30try {
31    events.push("1:try");
32} finally {
33    events.push("1:finally");
34}
35
36try {
37    try {
38        throw "2:thingy";
39    } finally {
40        events.push("2:finally");
41    }
42} catch (e) {
43    events.push(e);
44}
45
46try {
47    throw "3:thingy";
48} catch (e) {
49    events.push(e);
50} finally {
51    events.push("3:finally");
52}
53
54try {
55    try {
56        throw "4:thingy";
57    } catch (e) {
58        events.push(e);
59    } finally {
60        events.push("4:finally");
61        throw "4:another thingy";
62    }
63} catch (e) {
64    events.push(e);
65}
66
67try {
68    for (;;) {
69        try {
70            continue;
71        } finally {
72            events.push("5:hi");
73            throw "5:wat";
74        }
75    }
76} catch (e) {
77    events.push(e);
78}
79
80shouldBe("\"\" + events", "\"1:try,1:finally,2:finally,2:thingy,3:thingy,3:finally,4:thingy,4:finally,4:another thingy,5:hi,5:wat\"");
81