JS: add TranslationContext.cacheExpressionIfNeeded and use it where possible
This commit is contained in:
@@ -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)
|
||||
|
||||
+2
-9
@@ -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());
|
||||
|
||||
+2
-4
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user