While loop implementation && first loop test
This commit is contained in:
committed by
Dmitry Petrov
parent
979f2231a1
commit
bcf2b410ba
@@ -126,6 +126,23 @@ class FunctionGenerator(val function: IrFunction) {
|
|||||||
return whenExit
|
return whenExit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitWhileLoop(loop: IrWhileLoop, data: Boolean): IrElement? {
|
||||||
|
if (data) {
|
||||||
|
builder.add(loop)
|
||||||
|
}
|
||||||
|
val entry = MergeCfgElement(loop, "While entry")
|
||||||
|
builder.jump(entry)
|
||||||
|
val condition = loop.condition
|
||||||
|
condition.process(includeSelf = false)
|
||||||
|
builder.jump(condition)
|
||||||
|
val body = loop.body
|
||||||
|
if (!body?.process().isNothing()) {
|
||||||
|
builder.jump(entry)
|
||||||
|
}
|
||||||
|
builder.move(condition)
|
||||||
|
return condition
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitElement(element: IrElement, data: Boolean): IrElement? {
|
override fun visitElement(element: IrElement, data: Boolean): IrElement? {
|
||||||
TODO("not implemented")
|
TODO("not implemented")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun factorial(i: Int): Int {
|
||||||
|
var result = 1
|
||||||
|
for (j in 2..i) {
|
||||||
|
result *= j
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
+40
@@ -0,0 +1,40 @@
|
|||||||
|
// FILE: /factorial.kt
|
||||||
|
// FUN: factorial
|
||||||
|
BB 0
|
||||||
|
CONTENT
|
||||||
|
1 FUN public fun factorial(i: kotlin.Int): kotlin.Int
|
||||||
|
2 CONST Int type=kotlin.Int value='1'
|
||||||
|
3 VAR var result: kotlin.Int
|
||||||
|
4 CALL 'iterator(): IntIterator' type=kotlin.collections.IntIterator origin=FOR_LOOP_ITERATOR
|
||||||
|
5 VAR IR_TEMPORARY_VARIABLE val tmp0_iterator: kotlin.collections.IntIterator
|
||||||
|
6 WHILE label=null origin=FOR_LOOP_INNER_WHILE
|
||||||
|
OUTGOING -> BB 1
|
||||||
|
While entry: WHILE label=null origin=FOR_LOOP_INNER_WHILE
|
||||||
|
BB 1
|
||||||
|
INCOMING <- BB 0, 2
|
||||||
|
While entry: WHILE label=null origin=FOR_LOOP_INNER_WHILE
|
||||||
|
CONTENT
|
||||||
|
OUTGOING -> BB 2, 3
|
||||||
|
CALL 'hasNext(): Boolean' type=kotlin.Boolean origin=FOR_LOOP_HAS_NEXT
|
||||||
|
BB 2
|
||||||
|
INCOMING <- BB 1
|
||||||
|
CALL 'hasNext(): Boolean' type=kotlin.Boolean origin=FOR_LOOP_HAS_NEXT
|
||||||
|
CONTENT
|
||||||
|
1 CALL 'next(): Int' type=kotlin.Int origin=FOR_LOOP_NEXT
|
||||||
|
2 VAR val j: kotlin.Int
|
||||||
|
3 SET_VAR 'result: Int' type=kotlin.Unit origin=MULTEQ
|
||||||
|
OUTGOING -> BB 1
|
||||||
|
While entry: WHILE label=null origin=FOR_LOOP_INNER_WHILE
|
||||||
|
BB 3
|
||||||
|
INCOMING <- BB 1
|
||||||
|
CALL 'hasNext(): Boolean' type=kotlin.Boolean origin=FOR_LOOP_HAS_NEXT
|
||||||
|
CONTENT
|
||||||
|
1 GET_VAR 'result: Int' type=kotlin.Int origin=null
|
||||||
|
2 RETURN type=kotlin.Nothing from='factorial(Int): Int'
|
||||||
|
OUTGOING -> NONE
|
||||||
|
Function exit: FUN public fun factorial(i: kotlin.Int): kotlin.Int
|
||||||
|
|
||||||
|
// END FUN: factorial
|
||||||
|
|
||||||
|
// END FILE: /factorial.kt
|
||||||
|
|
||||||
@@ -71,6 +71,21 @@ public class IrCfgTestCaseGenerated extends AbstractIrCfgTestCase {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("compiler/testData/ir/irCfg/loop")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class Loop extends AbstractIrCfgTestCase {
|
||||||
|
public void testAllFilesPresentInLoop() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/ir/irCfg/loop"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("factorial.kt")
|
||||||
|
public void testFactorial() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irCfg/loop/factorial.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/ir/irCfg/when")
|
@TestMetadata("compiler/testData/ir/irCfg/when")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
Reference in New Issue
Block a user