|
1 // Test if isInCatchScope properly detects catch blocks. |
|
2 |
|
3 let g = newGlobal(); |
|
4 let dbg = new Debugger(g); |
|
5 |
|
6 function test(string, mustBeCaught) { |
|
7 let index = 0; |
|
8 dbg.onExceptionUnwind = function (frame) { |
|
9 let willBeCaught = false; |
|
10 do { |
|
11 if (frame.script.isInCatchScope(frame.offset)) { |
|
12 willBeCaught = true; |
|
13 break; |
|
14 } |
|
15 frame = frame.older; |
|
16 } while (frame != null); |
|
17 assertEq(willBeCaught, mustBeCaught[index++]); |
|
18 }; |
|
19 |
|
20 try { |
|
21 g.eval(string); |
|
22 } catch (ex) {} |
|
23 assertEq(index, mustBeCaught.length); |
|
24 } |
|
25 |
|
26 // Should correctly detect catch blocks |
|
27 test("throw new Error();", [false]); |
|
28 test("try { throw new Error(); } catch (e) {}", [true]); |
|
29 test("try { throw new Error(); } finally {}", [false, false]); |
|
30 test("try { throw new Error(); } catch (e) {} finally {}", [true]); |
|
31 |
|
32 // Source of the exception shouldn't matter |
|
33 test("(null)();", [false]); |
|
34 test("try { (null)(); } catch (e) {}", [true]); |
|
35 test("try { (null)(); } finally {}", [false, false]); |
|
36 test("try { (null)(); } catch (e) {} finally {}", [true]); |
|
37 |
|
38 // Should correctly detect catch blocks in functions |
|
39 test("function f() { throw new Error(); } f();", [false, false]); |
|
40 test("function f() { try { throw new Error(); } catch (e) {} } f();", [true]); |
|
41 test("function f() { try { throw new Error(); } finally {} } f();", [false, false, false]); |
|
42 test("function f() { try { throw new Error(); } catch (e) {} finally {} } f();", [true]); |
|
43 |
|
44 // Should correctly detect catch blocks in evals |
|
45 test("eval('throw new Error();')", [false, false]); |
|
46 test("eval('try { throw new Error(); } catch (e) {}');", [true]); |
|
47 test("eval('try { throw new Error(); } finally {}');", [false, false, false]); |
|
48 test("eval('try { throw new Error(); } catch (e) {} finally {}');", [true]); |
|
49 |
|
50 // Should correctly detect rethrows |
|
51 test("try { throw new Error(); } catch (e) { throw e; }", [true, false]); |
|
52 test("try { try { throw new Error(); } catch (e) { throw e; } } catch (e) {}", [true, true]); |
|
53 test("try { try { throw new Error(); } finally {} } catch (e) {}", [true, true]); |
|
54 test("function f() { try { throw new Error(); } catch (e) { throw e; } } f();", [true, false, false]); |
|
55 test("function f() { try { try { throw new Error(); } catch (e) { throw e; } } catch (e) {} } f();", [true, true]); |
|
56 test("function f() { try { try { throw new Error(); } finally {} } catch (e) {} } f();", [true, true]); |
|
57 test("eval('try { throw new Error(); } catch (e) { throw e; }')", [true, false, false]); |
|
58 test("eval('try { try { throw new Error(); } catch (e) { throw e; } } catch (e) {}')", [true, true]); |
|
59 |
|
60 // Should correctly detect catch blocks across frame boundaries |
|
61 test("function f() { throw new Error(); } try { f(); } catch (e) {}", [true, true]); |
|
62 test("function f() { throw new Error(); } try { f(); } catch (e) { throw e; }", [true, true, false]); |
|
63 test("try { eval('throw new Error()'); } catch (e) {}", [true, true]); |
|
64 test("try { eval('throw new Error()'); } catch (e) { throw e; }", [true, true, false]); |
|
65 |
|
66 // Should correctly detect catch blocks just before and just after throws |
|
67 test("throw new Error; try {} catch (e) {}", [false]); |
|
68 test("try {} catch (e) {} throw new Error();", [false]); |