Refine returns codegen for suspend functions

This change should make the logic a bit more simple.
For all suspend functions/coroutines treat them in expression codegen
like they return boxed version of the original type.

Everything works fine then, except Unit type functions:
their bodies must be generated just like they're VOID and then load
Unit on stack manually.
This commit is contained in:
Denis Zharkov
2016-12-18 11:27:56 +03:00
parent 33ed98a0d3
commit 5dbc04abbb
13 changed files with 428 additions and 49 deletions
@@ -4966,6 +4966,39 @@ public class LightAnalysisModeCodegenTestGenerated extends AbstractLightAnalysis
doTest(fileName);
}
}
@TestMetadata("compiler/testData/codegen/box/coroutines/unitTypeReturn")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class UnitTypeReturn extends AbstractLightAnalysisModeCodegenTest {
public void testAllFilesPresentInUnitTypeReturn() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/coroutines/unitTypeReturn"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true);
}
@TestMetadata("coroutineNonLocalReturn.kt")
public void testCoroutineNonLocalReturn() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/unitTypeReturn/coroutineNonLocalReturn.kt");
doTest(fileName);
}
@TestMetadata("coroutineReturn.kt")
public void testCoroutineReturn() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/unitTypeReturn/coroutineReturn.kt");
doTest(fileName);
}
@TestMetadata("suspendNonLocalReturn.kt")
public void testSuspendNonLocalReturn() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/unitTypeReturn/suspendNonLocalReturn.kt");
doTest(fileName);
}
@TestMetadata("suspendReturn.kt")
public void testSuspendReturn() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/unitTypeReturn/suspendReturn.kt");
doTest(fileName);
}
}
}
@TestMetadata("compiler/testData/codegen/box/dataClasses")