From 0e41411c75fb450e6c2c72691a913c2b699ea625 Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Tue, 2 Sep 2014 17:31:32 +0400 Subject: [PATCH] JS backend: fix TranslationUtils.isCacheNeeded --- .../test/semantics/EvaluationOrderTest.java | 4 ++ .../translate/utils/TranslationUtils.java | 2 +- .../cases/whenJsLiteralWithSideEffect.kt | 38 +++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 js/js.translator/testData/expression/evaluationOrder/cases/whenJsLiteralWithSideEffect.kt diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/EvaluationOrderTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/EvaluationOrderTest.java index 54c22e45367..3663a413e10 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/EvaluationOrderTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/EvaluationOrderTest.java @@ -112,4 +112,8 @@ public class EvaluationOrderTest extends AbstractExpressionTest { public void testOrOrWithBreakContinueReturn() throws Exception { checkFooBoxIsOk(); } + + public void testWhenJsLiteralWithSideEffect() throws Exception { + checkFooBoxIsOk(); + } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java index 7dc8f4ca5b0..6986d508c38 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java @@ -397,7 +397,7 @@ public final class TranslationUtils { } public static boolean isCacheNeeded(@NotNull JsExpression expression) { - return !(expression instanceof JsLiteral) && + return !(expression instanceof JsLiteral.JsValueLiteral) && (!(expression instanceof JsNameRef) || ((JsNameRef) expression).getQualifier() != null); } diff --git a/js/js.translator/testData/expression/evaluationOrder/cases/whenJsLiteralWithSideEffect.kt b/js/js.translator/testData/expression/evaluationOrder/cases/whenJsLiteralWithSideEffect.kt new file mode 100644 index 00000000000..4bbe17395ff --- /dev/null +++ b/js/js.translator/testData/expression/evaluationOrder/cases/whenJsLiteralWithSideEffect.kt @@ -0,0 +1,38 @@ +package foo + +var global: String = "" + +fun bar(s: String): Int { + global += s + return 1 +} +fun testWhen() { + global = "" + when(array(bar("A"),2,3)) { + array(1) -> println("1") + array(2) -> println("2") + else -> println("else") + } + assertEquals("A", global) + +} + +fun testIntrinsic() { + global = "" + val x = array(bar("A")) == try { array(bar("B")) } finally {} + assertEquals("AB", global) +} + +fun testElvis() { + global = "" + var x = array(bar("A")) ?: 10 + assertEquals("A", global) +} + +fun box(): String { + testWhen() + testIntrinsic() + testElvis() + + return "OK" +}