JS: fix bug in temporary variable eliminator
The problem was in considering `a` as trivial in following case: ``` var a = b; ``` However, that's wrong assumption, since `b` can be temporary variable itself which is further substituted by a non-trivial expression.
This commit is contained in:
+1
-1
@@ -615,7 +615,7 @@ internal class TemporaryVariableElimination(private val function: JsFunction) {
|
|||||||
is JsNameRef -> {
|
is JsNameRef -> {
|
||||||
val qualifier = expr.qualifier
|
val qualifier = expr.qualifier
|
||||||
if (expr.sideEffects == SideEffectKind.PURE && (qualifier == null || isTrivial(qualifier))) {
|
if (expr.sideEffects == SideEffectKind.PURE && (qualifier == null || isTrivial(qualifier))) {
|
||||||
true
|
expr.name !in temporary
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
val name = expr.name
|
val name = expr.name
|
||||||
|
|||||||
@@ -4484,6 +4484,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("temporaryVarNonTrivial.kt")
|
||||||
|
public void testTemporaryVarNonTrivial() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineEvaluationOrder/temporaryVarNonTrivial.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("ternaryConditional.kt")
|
@TestMetadata("ternaryConditional.kt")
|
||||||
public void testTernaryConditional() throws Exception {
|
public void testTernaryConditional() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineEvaluationOrder/ternaryConditional.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineEvaluationOrder/ternaryConditional.kt");
|
||||||
|
|||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
// EXPECTED_REACHABLE_NODES: 1002
|
||||||
|
var log = ""
|
||||||
|
|
||||||
|
fun bar(): A {
|
||||||
|
log += "foo;"
|
||||||
|
return A()
|
||||||
|
}
|
||||||
|
|
||||||
|
class A {
|
||||||
|
fun f() {
|
||||||
|
log += "f;"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun g() {
|
||||||
|
log += "g;"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <T> with(x: T, a: T.() -> Unit) = x.a()
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
with(bar()) {
|
||||||
|
f()
|
||||||
|
g()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (log != "foo;f;g;") return "fail: $log"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user