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

changeset 906
c15d788cb381
parent 905
e9b8fbb30f5a
child 935
5b29f2a85085
     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;

mercurial