| // Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file | 
 | // for details. All rights reserved. Use of this source code is governed by a | 
 | // BSD-style license that can be found in the LICENSE file. | 
 |  | 
 | public class SynchronizedBlock { | 
 |  | 
 |   public static int emptyBlock(Object obj) { | 
 |     int x = 123; | 
 |     synchronized (obj) {} | 
 |     int y = 456; | 
 |     return x + y; | 
 |   } | 
 |  | 
 |   public static int nonThrowingBlock(Object obj) { | 
 |     int x = 123; | 
 |     synchronized (obj) { | 
 |       dontThrow(); | 
 |     } | 
 |     int y = 456; | 
 |     return x + y; | 
 |   } | 
 |  | 
 |   public static int throwingBlock(Object obj) { | 
 |     try { | 
 |       int x = 123; | 
 |       synchronized (obj) { | 
 |         doThrow(); | 
 |       } | 
 |       int y = 456; | 
 |       return x + y; | 
 |     } catch (Throwable e) { return 42; } // one line to avoid Java vs Art issue. | 
 |   } | 
 |  | 
 |   public static int nestedNonThrowingBlock(Object obj1, Object obj2) { | 
 |     int x = 123; | 
 |     synchronized (obj1) { | 
 |       dontThrow(); | 
 |       synchronized (obj2) { | 
 |         dontThrow(); | 
 |       } | 
 |     } | 
 |     int y = 456; | 
 |     return x + y; | 
 |   } | 
 |  | 
 |   public static int nestedThrowingBlock(Object obj1, Object obj2) { | 
 |     try { | 
 |       int x = 123; | 
 |       synchronized (obj1) { | 
 |         dontThrow(); | 
 |         synchronized (obj2) { | 
 |           doThrow(); | 
 |         } | 
 |       } | 
 |       int y = 456; | 
 |       return x + y; | 
 |     } catch (Throwable e) { return 42; } // one line to avoid Java vs Art issue. | 
 |   } | 
 |  | 
 |   public static void dontThrow() { | 
 |     return; | 
 |   } | 
 |  | 
 |   public static void doThrow() { | 
 |     throw new RuntimeException(); | 
 |   } | 
 |  | 
 |   public static void main(String[] args) { | 
 |     System.out.println(emptyBlock(new Object())); | 
 |     System.out.println(nonThrowingBlock(new Object())); | 
 |     System.out.println(throwingBlock(new Object())); | 
 |     System.out.println(nestedNonThrowingBlock(new Object(), new Object())); | 
 |     System.out.println(nestedThrowingBlock(new Object(), new Object())); | 
 |   } | 
 | } |