From 5967b6637fd093dae1cd729f2377a1a8e0d94fb2 Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Tue, 2 Sep 2014 16:45:21 +0400 Subject: [PATCH] JS backend: fix translation for || and && (create new tmp variable if needed) --- .../translate/operation/BinaryOperationTranslator.java | 10 ++++++++-- .../evaluationOrder/cases/orOrWithSideEffect.kt | 2 ++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java index f8c3c998c2d..85c47ac78b5 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java @@ -166,8 +166,14 @@ public final class BinaryOperationTranslator extends AbstractTranslator { return new JsBinaryOperation(operator, leftExpression, rightExpression); } - assert rightExpression instanceof JsNameRef : "expected JsNameRef, but " + expression.getText(); - JsNameRef result = (JsNameRef) rightExpression; // Reuse tmp variable + JsNameRef result; + if (rightExpression instanceof JsNameRef) { + result = (JsNameRef) rightExpression; // Reuse tmp variable + } else { + TemporaryVariable resultVar = context().declareTemporary(rightExpression); + result = resultVar.reference(); + rightBlock.getStatements().add(resultVar.assignmentExpression().makeStmt()); + } JsIf ifStatement; if (token.equals(JetTokens.ANDAND)) { diff --git a/js/js.translator/testData/expression/evaluationOrder/cases/orOrWithSideEffect.kt b/js/js.translator/testData/expression/evaluationOrder/cases/orOrWithSideEffect.kt index 340ffd2081a..f2194e0c3d1 100644 --- a/js/js.translator/testData/expression/evaluationOrder/cases/orOrWithSideEffect.kt +++ b/js/js.translator/testData/expression/evaluationOrder/cases/orOrWithSideEffect.kt @@ -8,6 +8,8 @@ fun bar(s: String, value: Boolean): Boolean { } fun box(): String { + val a = if (true || if(bar("A", false)) {2} else {3} == 0) { } + assertEquals("", global) // Simple || Simple global = ""