1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Flow.java Thu Mar 03 09:43:24 2011 +0000 1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Flow.java Thu Mar 03 17:32:35 2011 +0000 1.3 @@ -804,14 +804,16 @@ 1.4 ListBuffer<PendingExit> prevPendingExits = pendingExits; 1.5 boolean prevLoopPassTwo = loopPassTwo; 1.6 pendingExits = new ListBuffer<PendingExit>(); 1.7 + int prevErrors = log.nerrors; 1.8 do { 1.9 Bits uninitsEntry = uninits.dup(); 1.10 + uninitsEntry.excludeFrom(nextadr); 1.11 scanStat(tree.body); 1.12 alive |= resolveContinues(tree); 1.13 scanCond(tree.cond); 1.14 - if (log.nerrors != 0 || 1.15 + if (log.nerrors != prevErrors || 1.16 loopPassTwo || 1.17 - uninitsEntry.diffSet(uninitsWhenTrue).nextBit(firstadr)==-1) 1.18 + uninitsEntry.dup().diffSet(uninitsWhenTrue).nextBit(firstadr)==-1) 1.19 break; 1.20 inits = initsWhenTrue; 1.21 uninits = uninitsEntry.andSet(uninitsWhenTrue); 1.22 @@ -831,8 +833,10 @@ 1.23 Bits initsCond; 1.24 Bits uninitsCond; 1.25 pendingExits = new ListBuffer<PendingExit>(); 1.26 + int prevErrors = log.nerrors; 1.27 do { 1.28 Bits uninitsEntry = uninits.dup(); 1.29 + uninitsEntry.excludeFrom(nextadr); 1.30 scanCond(tree.cond); 1.31 initsCond = initsWhenFalse; 1.32 uninitsCond = uninitsWhenFalse; 1.33 @@ -841,9 +845,9 @@ 1.34 alive = !tree.cond.type.isFalse(); 1.35 scanStat(tree.body); 1.36 alive |= resolveContinues(tree); 1.37 - if (log.nerrors != 0 || 1.38 + if (log.nerrors != prevErrors || 1.39 loopPassTwo || 1.40 - uninitsEntry.diffSet(uninits).nextBit(firstadr) == -1) 1.41 + uninitsEntry.dup().diffSet(uninits).nextBit(firstadr) == -1) 1.42 break; 1.43 uninits = uninitsEntry.andSet(uninits); 1.44 loopPassTwo = true; 1.45 @@ -864,8 +868,10 @@ 1.46 Bits initsCond; 1.47 Bits uninitsCond; 1.48 pendingExits = new ListBuffer<PendingExit>(); 1.49 + int prevErrors = log.nerrors; 1.50 do { 1.51 Bits uninitsEntry = uninits.dup(); 1.52 + uninitsEntry.excludeFrom(nextadr); 1.53 if (tree.cond != null) { 1.54 scanCond(tree.cond); 1.55 initsCond = initsWhenFalse; 1.56 @@ -883,7 +889,7 @@ 1.57 scanStat(tree.body); 1.58 alive |= resolveContinues(tree); 1.59 scan(tree.step); 1.60 - if (log.nerrors != 0 || 1.61 + if (log.nerrors != prevErrors || 1.62 loopPassTwo || 1.63 uninitsEntry.dup().diffSet(uninits).nextBit(firstadr) == -1) 1.64 break; 1.65 @@ -897,8 +903,6 @@ 1.66 alive = resolveBreaks(tree, prevPendingExits) || 1.67 tree.cond != null && !tree.cond.type.isTrue(); 1.68 nextadr = nextadrPrev; 1.69 - inits.excludeFrom(nextadr); 1.70 - uninits.excludeFrom(nextadr); 1.71 } 1.72 1.73 public void visitForeachLoop(JCEnhancedForLoop tree) { 1.74 @@ -913,13 +917,15 @@ 1.75 1.76 letInit(tree.pos(), tree.var.sym); 1.77 pendingExits = new ListBuffer<PendingExit>(); 1.78 + int prevErrors = log.nerrors; 1.79 do { 1.80 Bits uninitsEntry = uninits.dup(); 1.81 + uninitsEntry.excludeFrom(nextadr); 1.82 scanStat(tree.body); 1.83 alive |= resolveContinues(tree); 1.84 - if (log.nerrors != 0 || 1.85 + if (log.nerrors != prevErrors || 1.86 loopPassTwo || 1.87 - uninitsEntry.diffSet(uninits).nextBit(firstadr) == -1) 1.88 + uninitsEntry.dup().diffSet(uninits).nextBit(firstadr) == -1) 1.89 break; 1.90 uninits = uninitsEntry.andSet(uninits); 1.91 loopPassTwo = true;