Main.java revision bbf1e41e8d9b2446756e729f30c2501fb3e682c1
143a364291dcdfe08e530e9568748359735dd7442buzbee// Copyright 2011 Google Inc. All Rights Reserved. 243a364291dcdfe08e530e9568748359735dd7442buzbee 343a364291dcdfe08e530e9568748359735dd7442buzbeeclass ExceptionTest { 443a364291dcdfe08e530e9568748359735dd7442buzbee 543a364291dcdfe08e530e9568748359735dd7442buzbee public int ifoo; 643a364291dcdfe08e530e9568748359735dd7442buzbee 743a364291dcdfe08e530e9568748359735dd7442buzbee /* Test requires visual inspection of object code to verify */ 843a364291dcdfe08e530e9568748359735dd7442buzbee int noThrow(ExceptionTest nonNullA, 943a364291dcdfe08e530e9568748359735dd7442buzbee ExceptionTest nonNullB, 1043a364291dcdfe08e530e9568748359735dd7442buzbee ExceptionTest nonNullC) { 1143a364291dcdfe08e530e9568748359735dd7442buzbee 1243a364291dcdfe08e530e9568748359735dd7442buzbee // "this" check should be eliminated on both IGET/IPUT 1343a364291dcdfe08e530e9568748359735dd7442buzbee ifoo++; 1443a364291dcdfe08e530e9568748359735dd7442buzbee 1543a364291dcdfe08e530e9568748359735dd7442buzbee // "this" check should be eliminated on both IGET/IPUT 1643a364291dcdfe08e530e9568748359735dd7442buzbee if (ifoo != 321) { 1743a364291dcdfe08e530e9568748359735dd7442buzbee // Check not eliminated 1843a364291dcdfe08e530e9568748359735dd7442buzbee nonNullA.ifoo = 12; 1943a364291dcdfe08e530e9568748359735dd7442buzbee // Check not eliminated 2043a364291dcdfe08e530e9568748359735dd7442buzbee nonNullB.ifoo = 21; 2143a364291dcdfe08e530e9568748359735dd7442buzbee } else { 2243a364291dcdfe08e530e9568748359735dd7442buzbee // Check not eliminated 2343a364291dcdfe08e530e9568748359735dd7442buzbee nonNullA.ifoo = 12; 2443a364291dcdfe08e530e9568748359735dd7442buzbee } 2543a364291dcdfe08e530e9568748359735dd7442buzbee 2643a364291dcdfe08e530e9568748359735dd7442buzbee // Check eliminated 2743a364291dcdfe08e530e9568748359735dd7442buzbee nonNullA.ifoo = 13; 2843a364291dcdfe08e530e9568748359735dd7442buzbee 2943a364291dcdfe08e530e9568748359735dd7442buzbee // Check not eliminated 3043a364291dcdfe08e530e9568748359735dd7442buzbee nonNullB.ifoo = 21; 3143a364291dcdfe08e530e9568748359735dd7442buzbee 3243a364291dcdfe08e530e9568748359735dd7442buzbee nonNullC = nonNullB; 3343a364291dcdfe08e530e9568748359735dd7442buzbee 3443a364291dcdfe08e530e9568748359735dd7442buzbee // Check eliminated 3543a364291dcdfe08e530e9568748359735dd7442buzbee nonNullC.ifoo = 32; 3643a364291dcdfe08e530e9568748359735dd7442buzbee 3743a364291dcdfe08e530e9568748359735dd7442buzbee // All null checks eliminated 3843a364291dcdfe08e530e9568748359735dd7442buzbee return ifoo + nonNullA.ifoo + nonNullB.ifoo + nonNullC.ifoo; 3943a364291dcdfe08e530e9568748359735dd7442buzbee } 4043a364291dcdfe08e530e9568748359735dd7442buzbee 4143a364291dcdfe08e530e9568748359735dd7442buzbee /* Test to ensure we don't remove necessary null checks */ 4243a364291dcdfe08e530e9568748359735dd7442buzbee int checkThrow(ExceptionTest nonNullA, 4343a364291dcdfe08e530e9568748359735dd7442buzbee ExceptionTest nonNullB, 4443a364291dcdfe08e530e9568748359735dd7442buzbee ExceptionTest nonNullC, 4543a364291dcdfe08e530e9568748359735dd7442buzbee ExceptionTest nullA, 4643a364291dcdfe08e530e9568748359735dd7442buzbee ExceptionTest nullB, 4743a364291dcdfe08e530e9568748359735dd7442buzbee ExceptionTest nullC) { 4843a364291dcdfe08e530e9568748359735dd7442buzbee 4943a364291dcdfe08e530e9568748359735dd7442buzbee // "this" check should be eliminated on both IGET/IPUT 5043a364291dcdfe08e530e9568748359735dd7442buzbee ifoo++; 5143a364291dcdfe08e530e9568748359735dd7442buzbee 5243a364291dcdfe08e530e9568748359735dd7442buzbee try { 5343a364291dcdfe08e530e9568748359735dd7442buzbee nullA.ifoo = 12; 5443a364291dcdfe08e530e9568748359735dd7442buzbee // Should not be reached 5543a364291dcdfe08e530e9568748359735dd7442buzbee return -1; 5643a364291dcdfe08e530e9568748359735dd7442buzbee } catch (NullPointerException npe) { 5743a364291dcdfe08e530e9568748359735dd7442buzbee ifoo++; 5843a364291dcdfe08e530e9568748359735dd7442buzbee } 5943a364291dcdfe08e530e9568748359735dd7442buzbee try { 6043a364291dcdfe08e530e9568748359735dd7442buzbee nullB.ifoo = 13; 6143a364291dcdfe08e530e9568748359735dd7442buzbee // Should not be reached 6243a364291dcdfe08e530e9568748359735dd7442buzbee return -2; 6343a364291dcdfe08e530e9568748359735dd7442buzbee } catch (NullPointerException npe) { 6443a364291dcdfe08e530e9568748359735dd7442buzbee ifoo++; 6543a364291dcdfe08e530e9568748359735dd7442buzbee } 6643a364291dcdfe08e530e9568748359735dd7442buzbee try { 6743a364291dcdfe08e530e9568748359735dd7442buzbee nullC.ifoo = 14; 6843a364291dcdfe08e530e9568748359735dd7442buzbee // Should not be reached 6943a364291dcdfe08e530e9568748359735dd7442buzbee return -3; 7043a364291dcdfe08e530e9568748359735dd7442buzbee } catch (NullPointerException npe) { 7143a364291dcdfe08e530e9568748359735dd7442buzbee ifoo++; 7243a364291dcdfe08e530e9568748359735dd7442buzbee } 7343a364291dcdfe08e530e9568748359735dd7442buzbee 7443a364291dcdfe08e530e9568748359735dd7442buzbee // "this" check should be eliminated 7543a364291dcdfe08e530e9568748359735dd7442buzbee if (ifoo != 321) { 7643a364291dcdfe08e530e9568748359735dd7442buzbee // Check not eliminated 7743a364291dcdfe08e530e9568748359735dd7442buzbee nonNullA.ifoo = 12; 7843a364291dcdfe08e530e9568748359735dd7442buzbee // Check not eliminated 7943a364291dcdfe08e530e9568748359735dd7442buzbee nonNullB.ifoo = 21; 8043a364291dcdfe08e530e9568748359735dd7442buzbee // Should throw here 8143a364291dcdfe08e530e9568748359735dd7442buzbee try { 8243a364291dcdfe08e530e9568748359735dd7442buzbee nullA.ifoo = 11; 8343a364291dcdfe08e530e9568748359735dd7442buzbee return -4; 8443a364291dcdfe08e530e9568748359735dd7442buzbee } catch (NullPointerException npe) { 8543a364291dcdfe08e530e9568748359735dd7442buzbee } 8643a364291dcdfe08e530e9568748359735dd7442buzbee } else { 8743a364291dcdfe08e530e9568748359735dd7442buzbee // Check not eliminated 8843a364291dcdfe08e530e9568748359735dd7442buzbee nonNullA.ifoo = 12; 8943a364291dcdfe08e530e9568748359735dd7442buzbee // Should throw here 9043a364291dcdfe08e530e9568748359735dd7442buzbee try { 9143a364291dcdfe08e530e9568748359735dd7442buzbee nullA.ifoo = 11; 9243a364291dcdfe08e530e9568748359735dd7442buzbee return -5; 9343a364291dcdfe08e530e9568748359735dd7442buzbee } catch (NullPointerException npe) { 9443a364291dcdfe08e530e9568748359735dd7442buzbee } 9543a364291dcdfe08e530e9568748359735dd7442buzbee } 9643a364291dcdfe08e530e9568748359735dd7442buzbee 9743a364291dcdfe08e530e9568748359735dd7442buzbee // Check not eliminated 9843a364291dcdfe08e530e9568748359735dd7442buzbee nonNullA.ifoo = 13; 9943a364291dcdfe08e530e9568748359735dd7442buzbee 10043a364291dcdfe08e530e9568748359735dd7442buzbee // Check not eliminated 10143a364291dcdfe08e530e9568748359735dd7442buzbee nonNullB.ifoo = 21; 10243a364291dcdfe08e530e9568748359735dd7442buzbee 10343a364291dcdfe08e530e9568748359735dd7442buzbee nonNullC = nonNullB; 10443a364291dcdfe08e530e9568748359735dd7442buzbee 10543a364291dcdfe08e530e9568748359735dd7442buzbee // Check eliminated 10643a364291dcdfe08e530e9568748359735dd7442buzbee nonNullC.ifoo = 32; 10743a364291dcdfe08e530e9568748359735dd7442buzbee 10843a364291dcdfe08e530e9568748359735dd7442buzbee // Should throw here 10943a364291dcdfe08e530e9568748359735dd7442buzbee try { 11043a364291dcdfe08e530e9568748359735dd7442buzbee nullA.ifoo = 13; 11143a364291dcdfe08e530e9568748359735dd7442buzbee return -6; 11243a364291dcdfe08e530e9568748359735dd7442buzbee } catch (NullPointerException npe) { 11343a364291dcdfe08e530e9568748359735dd7442buzbee } 11443a364291dcdfe08e530e9568748359735dd7442buzbee 11543a364291dcdfe08e530e9568748359735dd7442buzbee return ifoo + nonNullA.ifoo + nonNullB.ifoo + nonNullC.ifoo; 11643a364291dcdfe08e530e9568748359735dd7442buzbee } 11743a364291dcdfe08e530e9568748359735dd7442buzbee 11843a364291dcdfe08e530e9568748359735dd7442buzbee 11943a364291dcdfe08e530e9568748359735dd7442buzbee static int nullCheckTestNoThrow(int x) { 12043a364291dcdfe08e530e9568748359735dd7442buzbee ExceptionTest base = new ExceptionTest(); 12143a364291dcdfe08e530e9568748359735dd7442buzbee ExceptionTest a = new ExceptionTest(); 12243a364291dcdfe08e530e9568748359735dd7442buzbee ExceptionTest b = new ExceptionTest(); 12343a364291dcdfe08e530e9568748359735dd7442buzbee ExceptionTest c = new ExceptionTest(); 12443a364291dcdfe08e530e9568748359735dd7442buzbee base.ifoo = x; 12543a364291dcdfe08e530e9568748359735dd7442buzbee return base.noThrow(a,b,c); 12643a364291dcdfe08e530e9568748359735dd7442buzbee } 12743a364291dcdfe08e530e9568748359735dd7442buzbee 12843a364291dcdfe08e530e9568748359735dd7442buzbee static int nullCheckTestThrow(int x) { 12943a364291dcdfe08e530e9568748359735dd7442buzbee ExceptionTest base = new ExceptionTest(); 13043a364291dcdfe08e530e9568748359735dd7442buzbee ExceptionTest a = new ExceptionTest(); 13143a364291dcdfe08e530e9568748359735dd7442buzbee ExceptionTest b = new ExceptionTest(); 13243a364291dcdfe08e530e9568748359735dd7442buzbee ExceptionTest c = new ExceptionTest(); 13343a364291dcdfe08e530e9568748359735dd7442buzbee ExceptionTest d = null; 13443a364291dcdfe08e530e9568748359735dd7442buzbee ExceptionTest e = null; 13543a364291dcdfe08e530e9568748359735dd7442buzbee ExceptionTest f = null; 13643a364291dcdfe08e530e9568748359735dd7442buzbee base.ifoo = x; 13743a364291dcdfe08e530e9568748359735dd7442buzbee return base.checkThrow(a,b,c,d,e,f); 13843a364291dcdfe08e530e9568748359735dd7442buzbee } 13943a364291dcdfe08e530e9568748359735dd7442buzbee 14043a364291dcdfe08e530e9568748359735dd7442buzbee 14143a364291dcdfe08e530e9568748359735dd7442buzbee public static void main(String[] args) { 142bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom boolean failure = false; 14343a364291dcdfe08e530e9568748359735dd7442buzbee int res; 14443a364291dcdfe08e530e9568748359735dd7442buzbee 14543a364291dcdfe08e530e9568748359735dd7442buzbee res = nullCheckTestNoThrow(1976); 14643a364291dcdfe08e530e9568748359735dd7442buzbee if (res == 2054) { 14743a364291dcdfe08e530e9568748359735dd7442buzbee System.out.println("nullCheckTestNoThrow PASSED"); 14843a364291dcdfe08e530e9568748359735dd7442buzbee } else { 14943a364291dcdfe08e530e9568748359735dd7442buzbee System.out.println("nullCheckTestNoThrow FAILED: " + res); 150bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom failure = true; 15143a364291dcdfe08e530e9568748359735dd7442buzbee } 15243a364291dcdfe08e530e9568748359735dd7442buzbee 153bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstromif (false) { // TODO: enable this test when passing 15443a364291dcdfe08e530e9568748359735dd7442buzbee res = nullCheckTestThrow(1976); 15543a364291dcdfe08e530e9568748359735dd7442buzbee if (res == 2057) { 156bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom System.out.println("nullCheckTestThrow PASSED"); 15743a364291dcdfe08e530e9568748359735dd7442buzbee } else { 158bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom System.out.println("nullCheckTestThrow FAILED: " + res); 159bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom failure = true; 16043a364291dcdfe08e530e9568748359735dd7442buzbee } 161bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom} 162bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom System.exit(failure ? 1 : 0); 16343a364291dcdfe08e530e9568748359735dd7442buzbee } 16443a364291dcdfe08e530e9568748359735dd7442buzbee} 165