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