content: /*
   * Copyright (C) 2015 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  import java.lang.reflect.Method;
  
  public class Main {
  
    // Workaround for b/18051191.
    class InnerClass {}
  
    public enum TestPath {
      ExceptionalFlow1(true, false, 3),
      ExceptionalFlow2(false, true, 8),
      NormalFlow(false, false, 42);
  
      TestPath(boolean arg1, boolean arg2, int expected) {
        this.arg1 = arg1;
        this.arg2 = arg2;
        this.expected = expected;
      }
  
      public boolean arg1;
      public boolean arg2;
      public int expected;
    }
  
    public static void testMethod(String method) throws Exception {
      Class<?> c = Class.forName("Runtime");
      Method m = c.getMethod(method, new Class[] { boolean.class, boolean.class });
  
      for (TestPath path : TestPath.values()) {
        Object[] arguments = new Object[] { path.arg1, path.arg2 };
        int actual = (Integer) m.invoke(null, arguments);
  
        if (actual != path.expected) {
          throw new Error("Method: \"" + method + "\", path: " + path + ", " +
                          "expected: " + path.expected + ", actual: " + actual);
        }
      }
    }
  
    public static void main(String[] args) throws Exception {
      testMethod("testUseAfterCatch_int");
      testMethod("testUseAfterCatch_long");
      testMethod("testUseAfterCatch_float");
      testMethod("testUseAfterCatch_double");
      testMethod("testCatchPhi_const");
      testMethod("testCatchPhi_int");
      testMethod("testCatchPhi_long");
      testMethod("testCatchPhi_float");
      testMethod("testCatchPhi_double");
      testMethod("testCatchPhi_singleSlot");
      testMethod("testCatchPhi_doubleSlot");
    }
  }
  