fix KT-5645: 'continue' inside 'do...while' statement works as goto to the beginning of the loop (not checking loop condition)

#KT-5645 Fixed
This commit is contained in:
Michael Nedzelsky
2014-08-26 16:47:22 +04:00
committed by Svetlana Isakova
parent 3d7c22f242
commit 25a0854dbd
7 changed files with 60 additions and 6 deletions
@@ -52,6 +52,8 @@ public interface JetControlFlowBuilder {
Label getEntryPoint(@NotNull JetElement labelElement);
@NotNull
Label getExitPoint(@NotNull JetElement labelElement);
@NotNull
Label getConditionEntryPoint(@NotNull JetElement labelElement);
// Declarations
void declareParameter(@NotNull JetParameter parameter);
@@ -183,6 +183,12 @@ public abstract class JetControlFlowBuilderAdapter implements JetControlFlowBuil
return getDelegateBuilder().getExitPoint(labelElement);
}
@NotNull
@Override
public Label getConditionEntryPoint(@NotNull JetElement labelElement) {
return getDelegateBuilder().getConditionEntryPoint(labelElement);
}
@Override
public LoopInfo enterLoop(@NotNull JetExpression expression, @Nullable Label loopExitPoint, Label conditionEntryPoint) {
return getDelegateBuilder().enterLoop(expression, loopExitPoint, conditionEntryPoint);
@@ -953,7 +953,11 @@ public class JetControlFlowProcessor {
JetElement loop = getCorrespondingLoop(expression);
if (loop != null) {
checkJumpDoesNotCrossFunctionBoundary(expression, loop);
builder.jump(builder.getEntryPoint(loop), expression);
if (loop instanceof JetDoWhileExpression) {
builder.jump(builder.getConditionEntryPoint(loop), expression);
} else {
builder.jump(builder.getEntryPoint(loop), expression);
}
}
}
@@ -200,6 +200,14 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
return elementToBlockInfo.get(labelElement).getEntryPoint();
}
@NotNull
@Override
public Label getConditionEntryPoint(@NotNull JetElement labelElement) {
BreakableBlockInfo blockInfo = elementToBlockInfo.get(labelElement);
assert blockInfo instanceof LoopInfo : "expected LoopInfo for " + labelElement.getText() ;
return ((LoopInfo)blockInfo).getConditionEntryPoint();
}
@NotNull
@Override
public Label getExitPoint(@NotNull JetElement labelElement) {