JS: lambda constructor cannot have sideEffect

This commit is contained in:
Alexey Tsvetkov
2015-04-08 19:24:39 +03:00
parent 97a1a13235
commit 27a1861263
2 changed files with 50 additions and 1 deletions
@@ -31,6 +31,7 @@ public fun JsExpression.canHaveOwnSideEffect(): Boolean =
is JsArrayLiteral,
is JsNameRef -> false
is JsBinaryOperation -> getOperator().isAssignment()
is JsInvocation -> !isFunctionCreatorInvocation(this)
else -> true
}
@@ -43,6 +44,5 @@ public fun JsExpression.shouldHaveOwnAlias(): Boolean =
is JsConditional,
is JsBinaryOperation,
is JsArrayLiteral -> true
is JsInvocation -> !isFunctionCreatorInvocation(this)
else -> canHaveOwnSideEffect()
}
@@ -0,0 +1,49 @@
package foo
/* This tests checks, that lambda fabric invocation is not extracted.
An example:
fun foo() {
val status = "OK"
run { println(status) }
}
It's compiled to something like:
function foo() {
var status = "OK";
run(foo$(status));
}
function foo$(status) {
return function() {
console.log(status);
};
}
Thus, we need to be sure, that foo$() is not extracted to some temporary var.
*/
// CHECK_NOT_CALLED: max
// CHECK_NOT_CALLED: box$f
// CHECK_NOT_CALLED: box$f_0
inline fun max(getA: ()->Int, b: Int): Int {
val a = getA()
log("max($a, $b)")
if (a > b) return a
return b
}
fun box(): String {
val one = 1
val two = 2
val three = 3
val test = max({ fizz(one) }, max({ fizz(two) }, buzz(three)))
assertEquals(3, test)
assertEquals("buzz(3);fizz(2);max(2, 3);fizz(1);max(1, 3);", pullLog())
return "OK"
}