JS: improve switch elimination
This commit is contained in:
@@ -75,11 +75,13 @@ internal class EmptyStatementElimination(private val root: JsStatement) {
|
|||||||
for (case in x.cases) {
|
for (case in x.cases) {
|
||||||
processStatements(case.statements)
|
processStatements(case.statements)
|
||||||
}
|
}
|
||||||
if (x.cases.lastOrNull() is JsDefault &&
|
if (x.cases.lastOrNull() is JsDefault && x.cases.dropLast(1).all { it.statements.isEmpty() }
|
||||||
x.cases.dropLast(1).all { it.statements.isEmpty() }) {
|
|| x.cases.all { it.statements.isEmpty() }
|
||||||
|
) {
|
||||||
hasChanges = true
|
hasChanges = true
|
||||||
val conditionStatement = JsAstUtils.asSyntheticStatement(x.expression)
|
val replacement = mutableListOf(JsAstUtils.asSyntheticStatement(x.expression))
|
||||||
ctx.replaceMe(JsBlock(listOf(conditionStatement) + x.cases.last().statements))
|
x.cases.lastOrNull()?.apply { replacement.addAll(statements) }
|
||||||
|
ctx.replaceMe(JsBlock(replacement))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
@@ -24,4 +24,6 @@ class EmptyStatementEliminationTest : BasicOptimizerTest("empty-statement-elimin
|
|||||||
@Test fun ifWithEmptyThenAndNoElse() = box()
|
@Test fun ifWithEmptyThenAndNoElse() = box()
|
||||||
|
|
||||||
@Test fun emptyBlockEliminated() = box()
|
@Test fun emptyBlockEliminated() = box()
|
||||||
|
|
||||||
|
@Test fun switchElimination() = box()
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+53
@@ -0,0 +1,53 @@
|
|||||||
|
var log = '';
|
||||||
|
|
||||||
|
function test1(v) {
|
||||||
|
switch (v) {
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
log += 'A';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
log += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function test2(v) {
|
||||||
|
loop: while(--v) {
|
||||||
|
switch (v) {
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
log += 'B';
|
||||||
|
break loop
|
||||||
|
}
|
||||||
|
log += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function test3(v) {
|
||||||
|
}
|
||||||
|
|
||||||
|
function test4(v) {
|
||||||
|
log += 'D';
|
||||||
|
log += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
function test5(v) {
|
||||||
|
loop: while (--v) {
|
||||||
|
log += 'E';
|
||||||
|
break loop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function test6(v) {
|
||||||
|
log += 'F' + v;
|
||||||
|
}
|
||||||
|
|
||||||
|
function box() {
|
||||||
|
test1(1);
|
||||||
|
test1(3);
|
||||||
|
test2(4);
|
||||||
|
test4(3);
|
||||||
|
test5(3);
|
||||||
|
test6(6);
|
||||||
|
|
||||||
|
return log === 'A112BD4EF6' ? 'OK' : 'fail: ' + log;
|
||||||
|
}
|
||||||
Vendored
+68
@@ -0,0 +1,68 @@
|
|||||||
|
var log = '';
|
||||||
|
|
||||||
|
function test1(v) {
|
||||||
|
switch (v) {
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
log += 'A';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
log += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function test2(v) {
|
||||||
|
loop: while(--v) {
|
||||||
|
switch (v) {
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
log += 'B';
|
||||||
|
break loop
|
||||||
|
}
|
||||||
|
log += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function test3(v) {
|
||||||
|
switch (v) {
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function test4(v) {
|
||||||
|
switch (v) {
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
default:
|
||||||
|
log += 'D';
|
||||||
|
}
|
||||||
|
log += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
function test5(v) {
|
||||||
|
loop: while(--v) {
|
||||||
|
switch (v) {
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
default:
|
||||||
|
log += 'E';
|
||||||
|
break loop
|
||||||
|
}
|
||||||
|
log += 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function test6(v) {
|
||||||
|
switch (log += 'F' + v) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
function box() {
|
||||||
|
test1(1);
|
||||||
|
test1(3);
|
||||||
|
test2(4);
|
||||||
|
test4(3);
|
||||||
|
test5(3);
|
||||||
|
test6(6);
|
||||||
|
|
||||||
|
return log === 'A112BD4EF6' ? 'OK' : 'fail: ' + log;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user