74990daac9ff0fcc9391fff3819f7e4eda9e8eb9
[platform/upstream/nodejs.git] / deps / v8 / test / cctest / compiler / test-run-jsexceptions.cc
1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "src/v8.h"
6
7 #include "test/cctest/compiler/function-tester.h"
8
9 using namespace v8::internal;
10 using namespace v8::internal::compiler;
11
12 TEST(Throw) {
13   i::FLAG_turbo_exceptions = true;
14   FunctionTester T("(function(a,b) { if (a) { throw b; } else { return b; }})");
15
16   T.CheckThrows(T.true_value(), T.NewObject("new Error"));
17   T.CheckCall(T.Val(23), T.false_value(), T.Val(23));
18 }
19
20
21 TEST(ThrowSourcePosition) {
22   static const char* src =
23       "(function(a, b) {        \n"
24       "  if (a == 1) throw 1;   \n"
25       "  if (a == 2) {throw 2}  \n"
26       "  if (a == 3) {0;throw 3}\n"
27       "  throw 4;               \n"
28       "})                       ";
29   FunctionTester T(src);
30   v8::Handle<v8::Message> message;
31
32   message = T.CheckThrowsReturnMessage(T.Val(1), T.undefined());
33   CHECK(!message.IsEmpty());
34   CHECK_EQ(2, message->GetLineNumber());
35   CHECK_EQ(40, message->GetStartPosition());
36
37   message = T.CheckThrowsReturnMessage(T.Val(2), T.undefined());
38   CHECK(!message.IsEmpty());
39   CHECK_EQ(3, message->GetLineNumber());
40   CHECK_EQ(67, message->GetStartPosition());
41
42   message = T.CheckThrowsReturnMessage(T.Val(3), T.undefined());
43   CHECK(!message.IsEmpty());
44   CHECK_EQ(4, message->GetLineNumber());
45   CHECK_EQ(95, message->GetStartPosition());
46 }
47
48
49 // TODO(mstarzinger): Increase test coverage by having similar tests within the
50 // mjsunit suite to also test integration with other components (e.g. OSR).
51
52
53 TEST(Catch) {
54   i::FLAG_turbo_exceptions = true;
55   const char* src =
56       "(function(a,b) {"
57       "  var r = '-';"
58       "  try {"
59       "    r += 'A-';"
60       "    throw 'B-';"
61       "  } catch (e) {"
62       "    r += e;"
63       "  }"
64       "  return r;"
65       "})";
66   FunctionTester T(src);
67
68   T.CheckCall(T.Val("-A-B-"));
69 }
70
71
72 TEST(CatchNested) {
73   i::FLAG_turbo_exceptions = true;
74   const char* src =
75       "(function(a,b) {"
76       "  var r = '-';"
77       "  try {"
78       "    r += 'A-';"
79       "    throw 'C-';"
80       "  } catch (e) {"
81       "    try {"
82       "      throw 'B-';"
83       "    } catch (e) {"
84       "      r += e;"
85       "    }"
86       "    r += e;"
87       "  }"
88       "  return r;"
89       "})";
90   FunctionTester T(src);
91
92   T.CheckCall(T.Val("-A-B-C-"));
93 }
94
95
96 TEST(CatchBreak) {
97   i::FLAG_turbo_exceptions = true;
98   const char* src =
99       "(function(a,b) {"
100       "  var r = '-';"
101       "  L: try {"
102       "    r += 'A-';"
103       "    if (a) break L;"
104       "    r += 'B-';"
105       "    throw 'C-';"
106       "  } catch (e) {"
107       "    if (b) break L;"
108       "    r += e;"
109       "  }"
110       "  r += 'D-';"
111       "  return r;"
112       "})";
113   FunctionTester T(src);
114
115   T.CheckCall(T.Val("-A-D-"), T.true_value(), T.false_value());
116   T.CheckCall(T.Val("-A-B-D-"), T.false_value(), T.true_value());
117   T.CheckCall(T.Val("-A-B-C-D-"), T.false_value(), T.false_value());
118 }
119
120
121 TEST(Finally) {
122   i::FLAG_turbo_exceptions = true;
123   const char* src =
124       "(function(a,b) {"
125       "  var r = '-';"
126       "  try {"
127       "    r += 'A-';"
128       "  } finally {"
129       "    r += 'B-';"
130       "  }"
131       "  return r;"
132       "})";
133   FunctionTester T(src);
134
135   T.CheckCall(T.Val("-A-B-"));
136 }
137
138
139 TEST(FinallyBreak) {
140   i::FLAG_turbo_exceptions = true;
141   const char* src =
142       "(function(a,b) {"
143       "  var r = '-';"
144       "  L: try {"
145       "    r += 'A-';"
146       "    if (a) return r;"
147       "    r += 'B-';"
148       "    if (b) break L;"
149       "    r += 'C-';"
150       "  } finally {"
151       "    r += 'D-';"
152       "  }"
153       "  return r;"
154       "})";
155   FunctionTester T(src);
156
157   T.CheckCall(T.Val("-A-"), T.true_value(), T.false_value());
158   T.CheckCall(T.Val("-A-B-D-"), T.false_value(), T.true_value());
159   T.CheckCall(T.Val("-A-B-C-D-"), T.false_value(), T.false_value());
160 }