langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java
changeset 25604 8ff6a4ac812a
parent 25602 7ed5b85cdbb2
child 25607 9c077e7613c4
equal deleted inserted replaced
25603:d5fa4eab2d26 25604:8ff6a4ac812a
  1070                              JCExpression cond,
  1070                              JCExpression cond,
  1071                              List<JCExpressionStatement> step,
  1071                              List<JCExpressionStatement> step,
  1072                              boolean testFirst) {
  1072                              boolean testFirst) {
  1073             Env<GenContext> loopEnv = env.dup(loop, new GenContext());
  1073             Env<GenContext> loopEnv = env.dup(loop, new GenContext());
  1074             int startpc = code.entryPoint();
  1074             int startpc = code.entryPoint();
  1075             boolean recalculateState = false;
  1075             if (testFirst) {
  1076             if (testFirst) { //while or for loop
       
  1077                 CondItem c;
  1076                 CondItem c;
  1078                 if (cond != null) {
  1077                 if (cond != null) {
  1079                     code.statBegin(cond.pos);
  1078                     code.statBegin(cond.pos);
  1080                     c = genCond(TreeInfo.skipParens(cond), CRT_FLOW_CONTROLLER);
  1079                     c = genCond(TreeInfo.skipParens(cond), CRT_FLOW_CONTROLLER);
  1081                 } else {
  1080                 } else {
  1082                     c = items.makeCondItem(goto_);
  1081                     c = items.makeCondItem(goto_);
  1083                 }
  1082                 }
  1084                 Chain loopDone = c.jumpFalse();
  1083                 Chain loopDone = c.jumpFalse();
  1085                 if (loopDone == null) {
       
  1086                     recalculateState = true;
       
  1087                 }
       
  1088                 code.resolve(c.trueJumps);
  1084                 code.resolve(c.trueJumps);
  1089                 genStat(body, loopEnv, CRT_STATEMENT | CRT_FLOW_TARGET);
  1085                 genStat(body, loopEnv, CRT_STATEMENT | CRT_FLOW_TARGET);
  1090                 if (varDebugInfo) {
  1086                 if (varDebugInfo) {
  1091                     checkLoopLocalVarRangeEnding(loop, body,
  1087                     checkLoopLocalVarRangeEnding(loop, body,
  1092                             LoopLocalVarRangeEndingPoint.BEFORE_STEPS);
  1088                             LoopLocalVarRangeEndingPoint.BEFORE_STEPS);
  1118                 } else {
  1114                 } else {
  1119                     c = items.makeCondItem(goto_);
  1115                     c = items.makeCondItem(goto_);
  1120                 }
  1116                 }
  1121                 code.resolve(c.jumpTrue(), startpc);
  1117                 code.resolve(c.jumpTrue(), startpc);
  1122                 code.resolve(c.falseJumps);
  1118                 code.resolve(c.falseJumps);
  1123             }
       
  1124             if (recalculateState && loopEnv.info.exit != null) {
       
  1125                 loopEnv.info.exit.state.defined = code.state.defined.dup();
       
  1126             }
  1119             }
  1127             code.resolve(loopEnv.info.exit);
  1120             code.resolve(loopEnv.info.exit);
  1128         }
  1121         }
  1129 
  1122 
  1130         private enum LoopLocalVarRangeEndingPoint {
  1123         private enum LoopLocalVarRangeEndingPoint {