OLD | NEW |
| (Empty) |
1 // Copyright 2016 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 // Flags: --expose-debug-as debug --allow-natives-syntax | |
6 | |
7 // Test debug event catch prediction for thrown exceptions. We distinguish | |
8 // between "caught" and "uncaught" based on the following assumptions: | |
9 // 1) try-catch : Will always catch the exception. | |
10 // 2) try-finally : Will always re-throw the exception. | |
11 | |
12 Debug = debug.Debug; | |
13 | |
14 var log = []; | |
15 | |
16 function listener(event, exec_state, event_data, data) { | |
17 try { | |
18 if (event == Debug.DebugEvent.Exception) { | |
19 log.push([event_data.exception(), event_data.uncaught()]); | |
20 } | |
21 } catch (e) { | |
22 %AbortJS(e + "\n" + e.stack); | |
23 } | |
24 } | |
25 | |
26 Debug.setBreakOnException(); | |
27 Debug.setListener(listener); | |
28 | |
29 (function TryCatch() { | |
30 log = []; // Clear log. | |
31 function f(a) { | |
32 try { | |
33 throw "boom" + a; | |
34 } catch(e) { | |
35 return e; | |
36 } | |
37 } | |
38 assertEquals("boom1", f(1)); | |
39 assertEquals("boom2", f(2)); | |
40 %OptimizeFunctionOnNextCall(f); | |
41 assertEquals("boom3", f(3)); | |
42 print("Collect log:", log); | |
43 assertEquals([["boom1",false], ["boom2",false], ["boom3",false]], log); | |
44 })(); | |
45 | |
46 (function TryFinally() { | |
47 log = []; // Clear log. | |
48 function f(a) { | |
49 try { | |
50 throw "baem" + a; | |
51 } finally { | |
52 return a + 10; | |
53 } | |
54 } | |
55 assertEquals(11, f(1)); | |
56 assertEquals(12, f(2)); | |
57 %OptimizeFunctionOnNextCall(f); | |
58 assertEquals(13, f(3)); | |
59 print("Collect log:", log); | |
60 assertEquals([["baem1",true], ["baem2",true], ["baem3",true]], log); | |
61 })(); | |
62 | |
63 (function TryCatchFinally() { | |
64 log = []; // Clear log. | |
65 function f(a) { | |
66 try { | |
67 throw "wosh" + a; | |
68 } catch(e) { | |
69 return e + a; | |
70 } finally { | |
71 // Nothing. | |
72 } | |
73 } | |
74 assertEquals("wosh11", f(1)); | |
75 assertEquals("wosh22", f(2)); | |
76 %OptimizeFunctionOnNextCall(f); | |
77 assertEquals("wosh33", f(3)); | |
78 print("Collect log:", log); | |
79 assertEquals([["wosh1",false], ["wosh2",false], ["wosh3",false]], log); | |
80 })(); | |
81 | |
82 (function TryCatchNestedFinally() { | |
83 log = []; // Clear log. | |
84 function f(a) { | |
85 try { | |
86 try { | |
87 throw "bang" + a; | |
88 } finally { | |
89 // Nothing. | |
90 } | |
91 } catch(e) { | |
92 return e + a; | |
93 } | |
94 } | |
95 assertEquals("bang11", f(1)); | |
96 assertEquals("bang22", f(2)); | |
97 %OptimizeFunctionOnNextCall(f); | |
98 assertEquals("bang33", f(3)); | |
99 print("Collect log:", log); | |
100 assertEquals([["bang1",false], ["bang2",false], ["bang3",false]], log); | |
101 })(); | |
102 | |
103 (function TryFinallyNestedCatch() { | |
104 log = []; // Clear log. | |
105 function f(a) { | |
106 try { | |
107 try { | |
108 throw "peng" + a; | |
109 } catch(e) { | |
110 return e | |
111 } | |
112 } finally { | |
113 return a + 10; | |
114 } | |
115 } | |
116 assertEquals(11, f(1)); | |
117 assertEquals(12, f(2)); | |
118 %OptimizeFunctionOnNextCall(f); | |
119 assertEquals(13, f(3)); | |
120 print("Collect log:", log); | |
121 assertEquals([["peng1",false], ["peng2",false], ["peng3",false]], log); | |
122 })(); | |
123 | |
124 (function TryFinallyNestedFinally() { | |
125 log = []; // Clear log. | |
126 function f(a) { | |
127 try { | |
128 try { | |
129 throw "oops" + a; | |
130 } finally { | |
131 // Nothing. | |
132 } | |
133 } finally { | |
134 return a + 10; | |
135 } | |
136 } | |
137 assertEquals(11, f(1)); | |
138 assertEquals(12, f(2)); | |
139 %OptimizeFunctionOnNextCall(f); | |
140 assertEquals(13, f(3)); | |
141 print("Collect log:", log); | |
142 assertEquals([["oops1",true], ["oops2",true], ["oops3",true]], log); | |
143 })(); | |
OLD | NEW |