src/share/classes/com/sun/tools/javac/comp/Flow.java

changeset 2252
fa004631cf00
parent 2146
7de97abc4a5c
child 2370
acd64168cf8b
     1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Flow.java	Thu Jan 23 06:34:53 2014 -0800
     1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Flow.java	Mon Jan 27 21:05:58 2014 +0000
     1.3 @@ -1,5 +1,5 @@
     1.4  /*
     1.5 - * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
     1.6 + * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
     1.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     1.8   *
     1.9   * This code is free software; you can redistribute it and/or modify it
    1.10 @@ -1461,9 +1461,19 @@
    1.11              this.names = names;
    1.12          }
    1.13  
    1.14 +        private boolean isInitialConstructor = false;
    1.15 +
    1.16          @Override
    1.17          protected void markDead(JCTree tree) {
    1.18 -            inits.inclRange(returnadr, nextadr);
    1.19 +            if (!isInitialConstructor) {
    1.20 +                inits.inclRange(returnadr, nextadr);
    1.21 +            } else {
    1.22 +                for (int address = returnadr; address < nextadr; address++) {
    1.23 +                    if (!(isFinalUninitializedStaticField(vardecls[address].sym))) {
    1.24 +                        inits.incl(address);
    1.25 +                    }
    1.26 +                }
    1.27 +            }
    1.28              uninits.inclRange(returnadr, nextadr);
    1.29          }
    1.30  
    1.31 @@ -1476,8 +1486,17 @@
    1.32              return
    1.33                  sym.pos >= startPos &&
    1.34                  ((sym.owner.kind == MTH ||
    1.35 -                 ((sym.flags() & (FINAL | HASINIT | PARAMETER)) == FINAL &&
    1.36 -                  classDef.sym.isEnclosedBy((ClassSymbol)sym.owner))));
    1.37 +                isFinalUninitializedField(sym)));
    1.38 +        }
    1.39 +
    1.40 +        boolean isFinalUninitializedField(VarSymbol sym) {
    1.41 +            return sym.owner.kind == TYP &&
    1.42 +                   ((sym.flags() & (FINAL | HASINIT | PARAMETER)) == FINAL &&
    1.43 +                   classDef.sym.isEnclosedBy((ClassSymbol)sym.owner));
    1.44 +        }
    1.45 +
    1.46 +        boolean isFinalUninitializedStaticField(VarSymbol sym) {
    1.47 +            return isFinalUninitializedField(sym) && sym.isStatic();
    1.48          }
    1.49  
    1.50          /** Initialize new trackable variable by setting its address field
    1.51 @@ -1731,10 +1750,9 @@
    1.52              int returnadrPrev = returnadr;
    1.53  
    1.54              Assert.check(pendingExits.isEmpty());
    1.55 -
    1.56 +            boolean lastInitialConstructor = isInitialConstructor;
    1.57              try {
    1.58 -                boolean isInitialConstructor =
    1.59 -                    TreeInfo.isInitialConstructor(tree);
    1.60 +                isInitialConstructor = TreeInfo.isInitialConstructor(tree);
    1.61  
    1.62                  if (!isInitialConstructor) {
    1.63                      firstadr = nextadr;
    1.64 @@ -1789,6 +1807,7 @@
    1.65                  nextadr = nextadrPrev;
    1.66                  firstadr = firstadrPrev;
    1.67                  returnadr = returnadrPrev;
    1.68 +                isInitialConstructor = lastInitialConstructor;
    1.69              }
    1.70          }
    1.71  

mercurial