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