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);
+ }
+}