From 6b09b4c2b694b1d25cb70c927f4170774d2fd306 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Wed, 22 Apr 2015 16:44:47 +0300 Subject: [PATCH] JS: do not create variable for result, if inline call is only return subexpression --- .../kotlin/js/inline/FunctionInlineMutator.kt | 5 ++++ .../InlineSizeReductionTestGenerated.java | 6 ++++ .../cases/returnInlineCall.kt | 30 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 js/js.translator/testData/inlineSizeReduction/cases/returnInlineCall.kt diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionInlineMutator.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionInlineMutator.kt index f3970cae2d7..9dfd215cd5a 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionInlineMutator.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionInlineMutator.kt @@ -94,6 +94,11 @@ class FunctionInlineMutator private (private val call: JsInvocation, private val } private fun processReturns() { + if (currentStatement is JsReturn && currentStatement.getExpression() === call) { + inliningContext.statementContext.removeMe() + return + } + val returnCount = collectInstances(javaClass(), body).size() if (returnCount == 0) { // TODO return Unit (KT-5647) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/InlineSizeReductionTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/InlineSizeReductionTestGenerated.java index ce3cbc0da58..2ef384a2a07 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/InlineSizeReductionTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/InlineSizeReductionTestGenerated.java @@ -41,6 +41,12 @@ public class InlineSizeReductionTestGenerated extends AbstractInlineSizeReductio doTest(fileName); } + @TestMetadata("returnInlineCall.kt") + public void testReturnInlineCall() throws Exception { + String fileName = JetTestUtils.navigationMetadata("js/js.translator/testData/inlineSizeReduction/cases/returnInlineCall.kt"); + doTest(fileName); + } + @TestMetadata("simpleReturnFunction.kt") public void testSimpleReturnFunction() throws Exception { String fileName = JetTestUtils.navigationMetadata("js/js.translator/testData/inlineSizeReduction/cases/simpleReturnFunction.kt"); diff --git a/js/js.translator/testData/inlineSizeReduction/cases/returnInlineCall.kt b/js/js.translator/testData/inlineSizeReduction/cases/returnInlineCall.kt new file mode 100644 index 00000000000..94cfb2dcc30 --- /dev/null +++ b/js/js.translator/testData/inlineSizeReduction/cases/returnInlineCall.kt @@ -0,0 +1,30 @@ +package foo + +// CHECK_CONTAINS_NO_CALLS: test +// CHECK_VARS_COUNT: function=test count=0 + +inline fun sign(x: Int): Int { + if (x < 0) return -1 + + if (x == 0) return 0 + + return 1 +} + +fun test(x: Int, y: Int): Int { + if (x != 0) { + return sign(x) + } + + return sign(y) +} + +fun box(): String { + assertEquals(-1, test(-2, 2)) + assertEquals(1, test(2, -2)) + assertEquals(-1, test(0, -2)) + assertEquals(1, test(0, 2)) + assertEquals(0, test(0, 0)) + + return "OK" +} \ No newline at end of file