OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "test/cctest/compiler/function-tester.h" | 5 #include "test/cctest/compiler/function-tester.h" |
6 | 6 |
7 namespace v8 { | 7 namespace v8 { |
8 namespace internal { | 8 namespace internal { |
9 namespace compiler { | 9 namespace compiler { |
10 | 10 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 | 54 |
55 message = T.CheckThrowsReturnMessage(T.false_value(), T.Val("Wat?")); | 55 message = T.CheckThrowsReturnMessage(T.false_value(), T.Val("Wat?")); |
56 CHECK(t == message->Get()->Equals(context, v8_str("Uncaught Error: Wat?"))); | 56 CHECK(t == message->Get()->Equals(context, v8_str("Uncaught Error: Wat?"))); |
57 | 57 |
58 message = T.CheckThrowsReturnMessage(T.true_value(), T.Val("Kaboom!")); | 58 message = T.CheckThrowsReturnMessage(T.true_value(), T.Val("Kaboom!")); |
59 CHECK(t == message->Get()->Equals(context, v8_str("Uncaught Kaboom!"))); | 59 CHECK(t == message->Get()->Equals(context, v8_str("Uncaught Kaboom!"))); |
60 } | 60 } |
61 | 61 |
62 | 62 |
63 TEST(ThrowMessageIndirectly) { | 63 TEST(ThrowMessageIndirectly) { |
64 i::FLAG_turbo_try_finally = true; | |
65 static const char* src = | 64 static const char* src = |
66 "(function(a, b) {" | 65 "(function(a, b) {" |
67 " try {" | 66 " try {" |
68 " if (a) { throw b; } else { throw new Error(b); }" | 67 " if (a) { throw b; } else { throw new Error(b); }" |
69 " } finally {" | 68 " } finally {" |
70 " try { throw 'clobber'; } catch (e) { 'unclobber'; }" | 69 " try { throw 'clobber'; } catch (e) { 'unclobber'; }" |
71 " }" | 70 " }" |
72 "})"; | 71 "})"; |
73 FunctionTester T(src); | 72 FunctionTester T(src); |
74 v8::Local<v8::Message> message; | 73 v8::Local<v8::Message> message; |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 FunctionTester T(src); | 162 FunctionTester T(src); |
164 | 163 |
165 CompileRun("function thrower() { throw 'T-'; }"); | 164 CompileRun("function thrower() { throw 'T-'; }"); |
166 T.CheckCall(T.Val("-A-T-"), T.NewFunction("thrower")); | 165 T.CheckCall(T.Val("-A-T-"), T.NewFunction("thrower")); |
167 CompileRun("function returner() { return 'R-'; }"); | 166 CompileRun("function returner() { return 'R-'; }"); |
168 T.CheckCall(T.Val("-A-B-R-"), T.NewFunction("returner")); | 167 T.CheckCall(T.Val("-A-B-R-"), T.NewFunction("returner")); |
169 } | 168 } |
170 | 169 |
171 | 170 |
172 TEST(Finally) { | 171 TEST(Finally) { |
173 i::FLAG_turbo_try_finally = true; | |
174 const char* src = | 172 const char* src = |
175 "(function(a,b) {" | 173 "(function(a,b) {" |
176 " var r = '-';" | 174 " var r = '-';" |
177 " try {" | 175 " try {" |
178 " r += 'A-';" | 176 " r += 'A-';" |
179 " } finally {" | 177 " } finally {" |
180 " r += 'B-';" | 178 " r += 'B-';" |
181 " }" | 179 " }" |
182 " return r;" | 180 " return r;" |
183 "})"; | 181 "})"; |
184 FunctionTester T(src); | 182 FunctionTester T(src); |
185 | 183 |
186 T.CheckCall(T.Val("-A-B-")); | 184 T.CheckCall(T.Val("-A-B-")); |
187 } | 185 } |
188 | 186 |
189 | 187 |
190 TEST(FinallyBreak) { | 188 TEST(FinallyBreak) { |
191 i::FLAG_turbo_try_finally = true; | |
192 const char* src = | 189 const char* src = |
193 "(function(a,b) {" | 190 "(function(a,b) {" |
194 " var r = '-';" | 191 " var r = '-';" |
195 " L: try {" | 192 " L: try {" |
196 " r += 'A-';" | 193 " r += 'A-';" |
197 " if (a) return r;" | 194 " if (a) return r;" |
198 " r += 'B-';" | 195 " r += 'B-';" |
199 " if (b) break L;" | 196 " if (b) break L;" |
200 " r += 'C-';" | 197 " r += 'C-';" |
201 " } finally {" | 198 " } finally {" |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 " return e + 1;" | 234 " return e + 1;" |
238 " }" | 235 " }" |
239 "})"; | 236 "})"; |
240 FunctionTester T(src); | 237 FunctionTester T(src); |
241 | 238 |
242 T.CheckCall(T.Val(2), T.Val(1)); | 239 T.CheckCall(T.Val(2), T.Val(1)); |
243 } | 240 } |
244 | 241 |
245 | 242 |
246 TEST(DeoptFinallyReturn) { | 243 TEST(DeoptFinallyReturn) { |
247 i::FLAG_turbo_try_finally = true; | |
248 const char* src = | 244 const char* src = |
249 "(function f(a) {" | 245 "(function f(a) {" |
250 " try {" | 246 " try {" |
251 " throw a;" | 247 " throw a;" |
252 " } finally {" | 248 " } finally {" |
253 " %DeoptimizeFunction(f);" | 249 " %DeoptimizeFunction(f);" |
254 " return a + 1;" | 250 " return a + 1;" |
255 " }" | 251 " }" |
256 "})"; | 252 "})"; |
257 FunctionTester T(src); | 253 FunctionTester T(src); |
258 | 254 |
259 T.CheckCall(T.Val(2), T.Val(1)); | 255 T.CheckCall(T.Val(2), T.Val(1)); |
260 } | 256 } |
261 | 257 |
262 | 258 |
263 TEST(DeoptFinallyReThrow) { | 259 TEST(DeoptFinallyReThrow) { |
264 i::FLAG_turbo_try_finally = true; | |
265 const char* src = | 260 const char* src = |
266 "(function f(a) {" | 261 "(function f(a) {" |
267 " try {" | 262 " try {" |
268 " throw a;" | 263 " throw a;" |
269 " } finally {" | 264 " } finally {" |
270 " %DeoptimizeFunction(f);" | 265 " %DeoptimizeFunction(f);" |
271 " }" | 266 " }" |
272 "})"; | 267 "})"; |
273 FunctionTester T(src); | 268 FunctionTester T(src); |
274 | 269 |
275 #if 0 // TODO(mstarzinger): Enable once we can. | |
276 T.CheckThrows(T.NewObject("new Error"), T.Val(1)); | 270 T.CheckThrows(T.NewObject("new Error"), T.Val(1)); |
277 #endif | |
278 } | 271 } |
279 | 272 |
280 } // namespace compiler | 273 } // namespace compiler |
281 } // namespace internal | 274 } // namespace internal |
282 } // namespace v8 | 275 } // namespace v8 |
OLD | NEW |