/*
* 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);
}
}