partially implement KT-2310 (only cache call result)

This commit is contained in:
develar
2012-06-22 17:14:23 +04:00
parent 8d764af432
commit 2c3f3d2960
3 changed files with 16 additions and 4 deletions
@@ -53,8 +53,13 @@ public final class DynamicContext {
@NotNull
public TemporaryVariable declareTemporary(@NotNull JsExpression initExpression) {
return declareTemporary(initExpression, false);
}
@NotNull
public TemporaryVariable declareTemporary(@NotNull JsExpression initExpression, boolean initialize) {
JsName temporaryName = currentScope.declareTemporary();
JsVars temporaryDeclaration = newVar(temporaryName, /*no init expression in var statement*/ null);
JsVars temporaryDeclaration = newVar(temporaryName, initialize ? initExpression : null);
addVarDeclaration(jsBlock(), temporaryDeclaration);
return new TemporaryVariable(temporaryName, initExpression);
}
@@ -157,6 +157,11 @@ public final class TranslationContext {
return dynamicContext.declareTemporary(initExpression);
}
@NotNull
public TemporaryVariable declareTemporary(@NotNull JsExpression initExpression, boolean initialize) {
return dynamicContext.declareTemporary(initExpression, initialize);
}
@NotNull
public Namer namer() {
return staticContext.getNamer();
@@ -19,9 +19,11 @@ package org.jetbrains.k2js.translate.operation;
import com.google.dart.compiler.backend.js.ast.JsBinaryOperation;
import com.google.dart.compiler.backend.js.ast.JsConditional;
import com.google.dart.compiler.backend.js.ast.JsExpression;
import com.google.dart.compiler.backend.js.ast.JsNameRef;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetUnaryExpression;
import org.jetbrains.jet.lexer.JetTokens;
import org.jetbrains.k2js.translate.context.TemporaryVariable;
import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.reference.CallBuilder;
import org.jetbrains.k2js.translate.reference.CallType;
@@ -62,9 +64,9 @@ public final class UnaryOperationTranslator {
@NotNull
private static JsExpression translateExclExclOperator(@NotNull JetUnaryExpression expression, @NotNull TranslationContext context) {
JsExpression translatedExpression = translateAsExpression(getBaseExpression(expression), context);
JsBinaryOperation notNullCheck = notNullCheck(context, translatedExpression);
return new JsConditional(notNullCheck, translatedExpression, context.namer().throwNPEFunctionCall());
JsNameRef cachedValue = context.declareTemporary(translateAsExpression(getBaseExpression(expression), context), true).reference();
JsBinaryOperation notNullCheck = notNullCheck(context, cachedValue);
return new JsConditional(notNullCheck, cachedValue, context.namer().throwNPEFunctionCall());
}
@NotNull