Move ExceptionTest to a run-test.

Change-Id: Ied054e1770ccc86c470dfc8d06cab39fc3e97216
diff --git a/test/106-exceptions2/src/Main.java b/test/106-exceptions2/src/Main.java
new file mode 100644
index 0000000..7d5a64a
--- /dev/null
+++ b/test/106-exceptions2/src/Main.java
@@ -0,0 +1,235 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+class Main {
+
+    public int ifoo;
+
+    /* Test requires visual inspection of object code to verify */
+    int noThrow(Main nonNullA,
+                Main nonNullB,
+                Main nonNullC) {
+
+        // "this" check should be eliminated on both IGET/IPUT
+        ifoo++;
+
+       // "this" check should be eliminated on both IGET/IPUT
+       if (ifoo != 321) {
+           // Check not eliminated
+           nonNullA.ifoo = 12;
+           // Check not eliminated
+           nonNullB.ifoo = 21;
+       } else {
+           // Check not eliminated
+           nonNullA.ifoo = 12;
+       }
+
+       // Check eliminated
+       nonNullA.ifoo = 13;
+
+       // Check not eliminated
+       nonNullB.ifoo = 21;
+
+       nonNullC = nonNullB;
+
+       // Check eliminated
+       nonNullC.ifoo = 32;
+
+      // All null checks eliminated
+      return ifoo + nonNullA.ifoo + nonNullB.ifoo + nonNullC.ifoo;
+    }
+
+    /* Test to ensure we don't remove necessary null checks */
+    int checkThrow(Main nonNullA,
+                   Main nonNullB,
+                   Main nonNullC,
+                   Main nullA,
+                   Main nullB,
+                   Main nullC) {
+
+        // "this" check should be eliminated on both IGET/IPUT
+        ifoo++;
+
+       try {
+           nullA.ifoo = 12;
+           // Should not be reached
+           return -1;
+       } catch (NullPointerException npe) {
+           ifoo++;
+       }
+       try {
+           nullB.ifoo = 13;
+           // Should not be reached
+           return -2;
+       } catch (NullPointerException npe) {
+           ifoo++;
+       }
+       try {
+           nullC.ifoo = 14;
+           // Should not be reached
+           return -3;
+       } catch (NullPointerException npe) {
+           ifoo++;
+       }
+
+       // "this" check should be eliminated
+       if (ifoo != 321) {
+           // Check not eliminated
+           nonNullA.ifoo = 12;
+           // Check not eliminated
+           nonNullB.ifoo = 21;
+           // Should throw here
+           try {
+               nullA.ifoo = 11;
+               return -4;
+           } catch (NullPointerException npe) {
+           }
+       } else {
+           // Check not eliminated
+           nonNullA.ifoo = 12;
+           // Should throw here
+           try {
+               nullA.ifoo = 11;
+               return -5;
+           } catch (NullPointerException npe) {
+           }
+       }
+
+       // Check not eliminated
+       nonNullA.ifoo = 13;
+
+       // Check not eliminated
+       nonNullB.ifoo = 21;
+
+       nonNullC = nonNullB;
+
+       // Check eliminated
+       nonNullC.ifoo = 32;
+
+       // Should throw here
+       try {
+           nullA.ifoo = 13;
+           return -6;
+       } catch (NullPointerException npe) {
+       }
+
+      return ifoo + nonNullA.ifoo + nonNullB.ifoo + nonNullC.ifoo;
+    }
+
+
+    static int nullCheckTestNoThrow(int x) {
+        Main base = new Main();
+        Main a = new Main();
+        Main b = new Main();
+        Main c = new Main();
+        base.ifoo = x;
+        return base.noThrow(a,b,c);
+    }
+
+    static int nullCheckTestThrow(int x) {
+        Main base = new Main();
+        Main a = new Main();
+        Main b = new Main();
+        Main c = new Main();
+        Main d = null;
+        Main e = null;
+        Main f = null;
+        base.ifoo = x;
+        return base.checkThrow(a,b,c,d,e,f);
+    }
+
+
+    static void throwImplicitAIOBE(int[] array, int index) {
+      array[index] = 0;
+    }
+
+    static int checkAIOBE() {
+      int[] array = new int[10];
+      int res;
+      try {
+        throwImplicitAIOBE(array, 11);
+        res = 123;
+      } catch (NullPointerException npe) {
+        res = 768;
+      } catch (ArrayIndexOutOfBoundsException e) {
+        res = 456;
+      }
+      try {
+        throwImplicitAIOBE(array, -1);
+        res += 123;
+      } catch (NullPointerException npe) {
+        res += 768;
+      } catch (ArrayIndexOutOfBoundsException e) {
+        res += 456;
+      }
+      return res;
+    }
+
+    static int throwImplicitDivZero(int x, int y) {
+      return x / y;
+    }
+
+    static int checkDivZero() {
+      try {
+        throwImplicitDivZero(100, 0);
+        return 123;
+      } catch (NullPointerException npe) {
+        return 768;
+      } catch (ArrayIndexOutOfBoundsException e) {
+        return 987;
+      } catch (ArithmeticException e) {
+        return 456;
+      }
+    }
+
+    public static void main(String[] args) {
+        boolean failure = false;
+        int res;
+
+        res = nullCheckTestNoThrow(1976);
+        if (res == 2054) {
+            System.out.println("nullCheckTestNoThrow PASSED");
+        } else {
+            System.out.println("nullCheckTestNoThrow FAILED: " + res);
+            failure = true;
+        }
+
+        res = nullCheckTestThrow(1976);
+        if (res == 2057) {
+            System.out.println("nullCheckTestThrow PASSED");
+        } else {
+            System.out.println("nullCheckTestThrow FAILED: " + res);
+            failure = true;
+        }
+
+        res = checkAIOBE();
+        if (res == 912) {
+          System.out.println("checkAIOBE PASSED");
+        } else {
+          System.out.println("checkAIOBE FAILED: " + res);
+          failure = true;
+        }
+
+        res = checkDivZero();
+        if (res == 456) {
+          System.out.println("checkDivZero PASSED");
+        } else {
+          System.out.println("checkDivZero FAILED: " + res);
+          failure = true;
+        }
+        System.exit(failure ? 1 : 0);
+    }
+}