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 { |