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