From a27f5c8fee68e58372bf1028003018082b63990c Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Fri, 15 Jul 2016 17:27:03 +0300 Subject: [PATCH] JS: add TranslationContext.cacheExpressionIfNeeded and use it where possible --- .../kotlin/js/translate/callTranslator/CallInfo.kt | 8 +------- .../js/translate/context/TranslationContext.java | 5 +++++ .../kotlin/js/translate/expression/LoopTranslator.kt | 8 +------- .../operation/BinaryOperationTranslator.java | 11 ++--------- .../translate/reference/AccessTranslationUtils.java | 6 ++---- 5 files changed, 11 insertions(+), 27 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallInfo.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallInfo.kt index 52a1217e2ab..490b80a9471 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallInfo.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallInfo.kt @@ -83,13 +83,7 @@ fun TranslationContext.getCallInfo( val argumentsInfo = CallArgumentTranslator.translate(resolvedCall, explicitReceivers.extensionOrDispatchReceiver, this, argsBlock) val explicitReceiversCorrected = if (!argsBlock.isEmpty && explicitReceivers.extensionOrDispatchReceiver != null) { - val receiverOrThisRef = - if (TranslationUtils.isCacheNeeded(explicitReceivers.extensionOrDispatchReceiver)) { - defineTemporary(explicitReceivers.extensionOrDispatchReceiver) - } - else { - explicitReceivers.extensionOrDispatchReceiver - } + val receiverOrThisRef = cacheExpressionIfNeeded(explicitReceivers.extensionOrDispatchReceiver) var receiverRef = explicitReceivers.extensionReceiver if (receiverRef != null) { receiverRef = defineTemporary(explicitReceivers.extensionReceiver!!) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java index 624f59b6d57..9002b608767 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java @@ -246,6 +246,11 @@ public class TranslationContext { return var.reference(); } + @NotNull + public JsExpression cacheExpressionIfNeeded(@NotNull JsExpression expression) { + return TranslationUtils.isCacheNeeded(expression) ? defineTemporary(expression) : expression; + } + @NotNull public TemporaryConstVariable getOrDeclareTemporaryConstVariable(@NotNull JsExpression expression) { TemporaryConstVariable tempVar = expressionToTempConstVariableCache.get(expression); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LoopTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LoopTranslator.kt index b874b362d56..4b0cbbd05ec 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LoopTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LoopTranslator.kt @@ -140,13 +140,7 @@ fun translateForExpression(expression: KtForExpression, context: TranslationCont val leftExpression = TranslationUtils.translateLeftExpression(context, loopRange, startBlock) val endBlock = JsBlock() val rightExpression = TranslationUtils.translateRightExpression(context, loopRange, endBlock) - val rangeStart = - if (TranslationUtils.isCacheNeeded(leftExpression)) { - context.defineTemporary(leftExpression) - } - else { - leftExpression - } + val rangeStart = context.cacheExpressionIfNeeded(leftExpression) context.addStatementsToCurrentBlockFrom(startBlock) context.addStatementsToCurrentBlockFrom(endBlock) val rangeEnd = context.defineTemporary(rightExpression) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java index 60d1984d4df..b4eb7673314 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java @@ -134,12 +134,7 @@ public final class BinaryOperationTranslator extends AbstractTranslator { JsExpression result; JsIf ifStatement; if (BindingContextUtilsKt.isUsedAsExpression(expression, context().bindingContext())) { - if (TranslationUtils.isCacheNeeded(leftExpression)) { - result = context().defineTemporary(leftExpression); - } - else { - result = leftExpression; - } + result = context().cacheExpressionIfNeeded(leftExpression); JsExpression testExpression = TranslationUtils.isNullCheck(result); rightBlock.getStatements().add(JsAstUtils.assignment(result, rightExpression).makeStmt()); ifStatement = JsAstUtils.newJsIf(testExpression, rightBlock); @@ -169,9 +164,7 @@ public final class BinaryOperationTranslator extends AbstractTranslator { return intrinsic.apply(expression, leftExpression, rightExpression, context()); } - if (TranslationUtils.isCacheNeeded(leftExpression)) { - leftExpression = context().defineTemporary(leftExpression); - } + leftExpression = context().cacheExpressionIfNeeded(leftExpression); context().addStatementsToCurrentBlockFrom(rightBlock); return intrinsic.apply(expression, leftExpression, rightExpression, context()); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/AccessTranslationUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/AccessTranslationUtils.java index 5e8d50e7a35..508bcdd93a6 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/AccessTranslationUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/AccessTranslationUtils.java @@ -61,10 +61,8 @@ public final class AccessTranslationUtils { if (forceOrderOfEvaluation) { Map indexesMap = new LinkedHashMap(); for(KtExpression indexExpression : expression.getIndexExpressions()) { - JsExpression jsIndexExpression = Translation.translateAsExpression(indexExpression, context); - if (TranslationUtils.isCacheNeeded(jsIndexExpression)) { - jsIndexExpression = context.defineTemporary(jsIndexExpression); - } + JsExpression jsIndexExpression = context.cacheExpressionIfNeeded( + Translation.translateAsExpression(indexExpression, context)); indexesMap.put(indexExpression, jsIndexExpression); } accessArrayContext = context.innerContextWithAliasesForExpressions(indexesMap);