| // Copyright 2017 the V8 project authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | function f() { | 
 |   throw new Error(); | 
 | } | 
 |  | 
 | function g() { | 
 |   try { | 
 |     f(); | 
 |   } catch (e) { | 
 |     return 1;  // Break | 
 |   } | 
 | } | 
 |  | 
 | function h() { | 
 |   return g(); | 
 | } | 
 |  | 
 | %PrepareFunctionForOptimization(h); | 
 | h(); | 
 | h(); | 
 |  | 
 | var Debug = debug.Debug; | 
 | var step_count = 0; | 
 | var exception = null; | 
 |  | 
 | function listener(event, exec_state, event_data, data) { | 
 |   if (event == Debug.DebugEvent.Exception) { | 
 |     step_count++; | 
 |     exec_state.prepareStep(Debug.StepAction.StepNext); | 
 |   } else if (event == Debug.DebugEvent.Break) { | 
 |     step_count++; | 
 |     try { | 
 |       assertTrue(exec_state.frame().sourceLineText().includes('Break')); | 
 |     } catch (e) { | 
 |       exception = e; | 
 |       print(e); | 
 |     } | 
 |   } | 
 | } | 
 |  | 
 | Debug.setListener(listener); | 
 | Debug.setBreakOnException(); | 
 | %OptimizeFunctionOnNextCall(h); | 
 | h(); | 
 | Debug.setListener(null); | 
 | assertNull(exception); |