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 argumentsInfo = CallArgumentTranslator.translate(resolvedCall, explicitReceivers.extensionOrDispatchReceiver, this, argsBlock)
|
||||||
val explicitReceiversCorrected =
|
val explicitReceiversCorrected =
|
||||||
if (!argsBlock.isEmpty && explicitReceivers.extensionOrDispatchReceiver != null) {
|
if (!argsBlock.isEmpty && explicitReceivers.extensionOrDispatchReceiver != null) {
|
||||||
val receiverOrThisRef =
|
val receiverOrThisRef = cacheExpressionIfNeeded(explicitReceivers.extensionOrDispatchReceiver)
|
||||||
if (TranslationUtils.isCacheNeeded(explicitReceivers.extensionOrDispatchReceiver)) {
|
|
||||||
defineTemporary(explicitReceivers.extensionOrDispatchReceiver)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
explicitReceivers.extensionOrDispatchReceiver
|
|
||||||
}
|
|
||||||
var receiverRef = explicitReceivers.extensionReceiver
|
var receiverRef = explicitReceivers.extensionReceiver
|
||||||
if (receiverRef != null) {
|
if (receiverRef != null) {
|
||||||
receiverRef = defineTemporary(explicitReceivers.extensionReceiver!!)
|
receiverRef = defineTemporary(explicitReceivers.extensionReceiver!!)
|
||||||
|
|||||||
@@ -246,6 +246,11 @@ public class TranslationContext {
|
|||||||
return var.reference();
|
return var.reference();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public JsExpression cacheExpressionIfNeeded(@NotNull JsExpression expression) {
|
||||||
|
return TranslationUtils.isCacheNeeded(expression) ? defineTemporary(expression) : expression;
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public TemporaryConstVariable getOrDeclareTemporaryConstVariable(@NotNull JsExpression expression) {
|
public TemporaryConstVariable getOrDeclareTemporaryConstVariable(@NotNull JsExpression expression) {
|
||||||
TemporaryConstVariable tempVar = expressionToTempConstVariableCache.get(expression);
|
TemporaryConstVariable tempVar = expressionToTempConstVariableCache.get(expression);
|
||||||
|
|||||||
@@ -140,13 +140,7 @@ fun translateForExpression(expression: KtForExpression, context: TranslationCont
|
|||||||
val leftExpression = TranslationUtils.translateLeftExpression(context, loopRange, startBlock)
|
val leftExpression = TranslationUtils.translateLeftExpression(context, loopRange, startBlock)
|
||||||
val endBlock = JsBlock()
|
val endBlock = JsBlock()
|
||||||
val rightExpression = TranslationUtils.translateRightExpression(context, loopRange, endBlock)
|
val rightExpression = TranslationUtils.translateRightExpression(context, loopRange, endBlock)
|
||||||
val rangeStart =
|
val rangeStart = context.cacheExpressionIfNeeded(leftExpression)
|
||||||
if (TranslationUtils.isCacheNeeded(leftExpression)) {
|
|
||||||
context.defineTemporary(leftExpression)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
leftExpression
|
|
||||||
}
|
|
||||||
context.addStatementsToCurrentBlockFrom(startBlock)
|
context.addStatementsToCurrentBlockFrom(startBlock)
|
||||||
context.addStatementsToCurrentBlockFrom(endBlock)
|
context.addStatementsToCurrentBlockFrom(endBlock)
|
||||||
val rangeEnd = context.defineTemporary(rightExpression)
|
val rangeEnd = context.defineTemporary(rightExpression)
|
||||||
|
|||||||
+2
-9
@@ -134,12 +134,7 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
|
|||||||
JsExpression result;
|
JsExpression result;
|
||||||
JsIf ifStatement;
|
JsIf ifStatement;
|
||||||
if (BindingContextUtilsKt.isUsedAsExpression(expression, context().bindingContext())) {
|
if (BindingContextUtilsKt.isUsedAsExpression(expression, context().bindingContext())) {
|
||||||
if (TranslationUtils.isCacheNeeded(leftExpression)) {
|
result = context().cacheExpressionIfNeeded(leftExpression);
|
||||||
result = context().defineTemporary(leftExpression);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
result = leftExpression;
|
|
||||||
}
|
|
||||||
JsExpression testExpression = TranslationUtils.isNullCheck(result);
|
JsExpression testExpression = TranslationUtils.isNullCheck(result);
|
||||||
rightBlock.getStatements().add(JsAstUtils.assignment(result, rightExpression).makeStmt());
|
rightBlock.getStatements().add(JsAstUtils.assignment(result, rightExpression).makeStmt());
|
||||||
ifStatement = JsAstUtils.newJsIf(testExpression, rightBlock);
|
ifStatement = JsAstUtils.newJsIf(testExpression, rightBlock);
|
||||||
@@ -169,9 +164,7 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
|
|||||||
return intrinsic.apply(expression, leftExpression, rightExpression, context());
|
return intrinsic.apply(expression, leftExpression, rightExpression, context());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TranslationUtils.isCacheNeeded(leftExpression)) {
|
leftExpression = context().cacheExpressionIfNeeded(leftExpression);
|
||||||
leftExpression = context().defineTemporary(leftExpression);
|
|
||||||
}
|
|
||||||
context().addStatementsToCurrentBlockFrom(rightBlock);
|
context().addStatementsToCurrentBlockFrom(rightBlock);
|
||||||
|
|
||||||
return intrinsic.apply(expression, leftExpression, rightExpression, context());
|
return intrinsic.apply(expression, leftExpression, rightExpression, context());
|
||||||
|
|||||||
+2
-4
@@ -61,10 +61,8 @@ public final class AccessTranslationUtils {
|
|||||||
if (forceOrderOfEvaluation) {
|
if (forceOrderOfEvaluation) {
|
||||||
Map<KtExpression, JsExpression> indexesMap = new LinkedHashMap<KtExpression, JsExpression>();
|
Map<KtExpression, JsExpression> indexesMap = new LinkedHashMap<KtExpression, JsExpression>();
|
||||||
for(KtExpression indexExpression : expression.getIndexExpressions()) {
|
for(KtExpression indexExpression : expression.getIndexExpressions()) {
|
||||||
JsExpression jsIndexExpression = Translation.translateAsExpression(indexExpression, context);
|
JsExpression jsIndexExpression = context.cacheExpressionIfNeeded(
|
||||||
if (TranslationUtils.isCacheNeeded(jsIndexExpression)) {
|
Translation.translateAsExpression(indexExpression, context));
|
||||||
jsIndexExpression = context.defineTemporary(jsIndexExpression);
|
|
||||||
}
|
|
||||||
indexesMap.put(indexExpression, jsIndexExpression);
|
indexesMap.put(indexExpression, jsIndexExpression);
|
||||||
}
|
}
|
||||||
accessArrayContext = context.innerContextWithAliasesForExpressions(indexesMap);
|
accessArrayContext = context.innerContextWithAliasesForExpressions(indexesMap);
|
||||||
|
|||||||
Reference in New Issue
Block a user