JS: add TranslationContext.cacheExpressionIfNeeded and use it where possible

This commit is contained in:
Alexey Andreev
2016-07-15 17:27:03 +03:00
parent b5f9287bfa
commit a27f5c8fee
5 changed files with 11 additions and 27 deletions
@@ -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!!)
@@ -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);
@@ -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)
@@ -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());
@@ -61,10 +61,8 @@ public final class AccessTranslationUtils {
if (forceOrderOfEvaluation) {
Map<KtExpression, JsExpression> indexesMap = new LinkedHashMap<KtExpression, JsExpression>();
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);