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:
committed by
Svetlana Isakova
parent
3d7c22f242
commit
25a0854dbd
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+8
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user