From e03e13af432ef7e6b2c6091ca049168336beb8d2 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 23 Sep 2016 15:04:42 +0300 Subject: [PATCH] Do..while loop implementation and first test --- .../ir2cfg/generators/FunctionGenerator.kt | 17 ++++++ compiler/testData/ir/irCfg/loop/digitCount.kt | 11 ++++ .../testData/ir/irCfg/loop/digitCount.txt | 52 +++++++++++++++++++ .../kotlin/ir/IrCfgTestCaseGenerated.java | 6 +++ 4 files changed, 86 insertions(+) create mode 100644 compiler/testData/ir/irCfg/loop/digitCount.kt create mode 100644 compiler/testData/ir/irCfg/loop/digitCount.txt diff --git a/compiler/ir/ir.ir2cfg/src/org/jetbrains/kotlin/ir2cfg/generators/FunctionGenerator.kt b/compiler/ir/ir.ir2cfg/src/org/jetbrains/kotlin/ir2cfg/generators/FunctionGenerator.kt index b7f04b3a7f8..828606d2e4c 100644 --- a/compiler/ir/ir.ir2cfg/src/org/jetbrains/kotlin/ir2cfg/generators/FunctionGenerator.kt +++ b/compiler/ir/ir.ir2cfg/src/org/jetbrains/kotlin/ir2cfg/generators/FunctionGenerator.kt @@ -143,6 +143,23 @@ class FunctionGenerator(val function: IrFunction) { return condition } + override fun visitDoWhileLoop(loop: IrDoWhileLoop, data: Boolean): IrElement? { + if (data) { + builder.add(loop) + } + val entry = MergeCfgElement(loop, "Do..while entry") + builder.jump(entry) + val body = loop.body + val condition = loop.condition + if (body?.process() !is IrReturn) { + condition.process(includeSelf = false) + builder.jump(condition) + builder.jump(entry) + builder.move(condition) + } + return condition + } + override fun visitElement(element: IrElement, data: Boolean): IrElement? { TODO("not implemented") } diff --git a/compiler/testData/ir/irCfg/loop/digitCount.kt b/compiler/testData/ir/irCfg/loop/digitCount.kt new file mode 100644 index 00000000000..2220daf7e70 --- /dev/null +++ b/compiler/testData/ir/irCfg/loop/digitCount.kt @@ -0,0 +1,11 @@ +fun digitCountInNumber(n: Int, m: Int): Int { + var count = 0 + var number = n + do { + if (m == number % 10) { + count++ + } + number /= 10 + } while (number > 0) + return count +} diff --git a/compiler/testData/ir/irCfg/loop/digitCount.txt b/compiler/testData/ir/irCfg/loop/digitCount.txt new file mode 100644 index 00000000000..715df402be9 --- /dev/null +++ b/compiler/testData/ir/irCfg/loop/digitCount.txt @@ -0,0 +1,52 @@ +// FILE: /digitCount.kt +// FUN: digitCountInNumber +BB 0 +CONTENT + 1 FUN public fun digitCountInNumber(n: kotlin.Int, m: kotlin.Int): kotlin.Int + 2 CONST Int type=kotlin.Int value='0' + 3 VAR var count: kotlin.Int + 4 GET_VAR 'value-parameter n: Int' type=kotlin.Int origin=null + 5 VAR var number: kotlin.Int + 6 DO_WHILE label=null origin=DO_WHILE_LOOP +OUTGOING -> BB 1 + Do..while entry: DO_WHILE label=null origin=DO_WHILE_LOOP +BB 1 +INCOMING <- BB 0, 4 + Do..while entry: DO_WHILE label=null origin=DO_WHILE_LOOP +CONTENT + 1 WHEN type=kotlin.Unit origin=null +OUTGOING -> BB 2 + CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EQEQ +BB 2 +INCOMING <- BB 1 + CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EQEQ +CONTENT + 1 TYPE_OP origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit +OUTGOING -> BB 3 + When exit: WHEN type=kotlin.Unit origin=null +BB 3 +INCOMING <- BB 2 + When exit: WHEN type=kotlin.Unit origin=null +CONTENT + 1 SET_VAR 'number: Int' type=kotlin.Unit origin=DIVEQ +OUTGOING -> BB 4, 5 + CALL 'GT0(Int): Boolean' type=kotlin.Boolean origin=GT +BB 4 +INCOMING <- BB 3 + CALL 'GT0(Int): Boolean' type=kotlin.Boolean origin=GT +CONTENT +OUTGOING -> BB 1 + Do..while entry: DO_WHILE label=null origin=DO_WHILE_LOOP +BB 5 +INCOMING <- BB 3 + CALL 'GT0(Int): Boolean' type=kotlin.Boolean origin=GT +CONTENT + 1 GET_VAR 'count: Int' type=kotlin.Int origin=null + 2 RETURN type=kotlin.Nothing from='digitCountInNumber(Int, Int): Int' +OUTGOING -> NONE + Function exit: FUN public fun digitCountInNumber(n: kotlin.Int, m: kotlin.Int): kotlin.Int + +// END FUN: digitCountInNumber + +// END FILE: /digitCount.kt + diff --git a/compiler/tests/org/jetbrains/kotlin/ir/IrCfgTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/ir/IrCfgTestCaseGenerated.java index 7b804912345..10117ac6eae 100644 --- a/compiler/tests/org/jetbrains/kotlin/ir/IrCfgTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/ir/IrCfgTestCaseGenerated.java @@ -79,6 +79,12 @@ public class IrCfgTestCaseGenerated extends AbstractIrCfgTestCase { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/ir/irCfg/loop"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("digitCount.kt") + public void testDigitCount() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irCfg/loop/digitCount.kt"); + doTest(fileName); + } + @TestMetadata("factorial.kt") public void testFactorial() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irCfg/loop/factorial.kt");