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 12Debug = debug.Debug; 13 14var log = []; 15 16function 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 26Debug.setBreakOnException(); 27Debug.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})(); 144