function shouldBe(actual, expected) { | |
if (actual !== expected) | |
throw new Error('bad value: ' + actual); | |
} | |
function inner(value) { | |
switch (value + "Statement") { | |
case "ExpressionStatement": | |
return 0; | |
case "BreakStatement": | |
return 1; | |
case "ThrowStatement": | |
return 2; | |
case "IfStatement": | |
return 3; | |
case "WhileStatement": | |
return 4; | |
case "DoWhileStatement": | |
return 5; | |
case "ForStatement": | |
return 6; | |
default: | |
return 7; | |
} | |
} | |
function outer(value) { | |
switch (value) { | |
case "Expression": | |
return 0 + inner(value); | |
case "Break": | |
return 1 + inner(value); | |
case "Throw": | |
return 2 + inner(value); | |
case "If": | |
return 3 + inner(value); | |
case "While": | |
return 4 + inner(value); | |
case "DoWhile": | |
return 5 + inner(value); | |
case "For": | |
return 6 + inner(value); | |
default: | |
return 7 + inner(value); | |
} | |
} | |
noInline(outer); | |
for (var i = 0; i < 3e5; ++i) { | |
shouldBe(outer("Do" + "While"), 10); | |
shouldBe(outer("F" + "or"), 12); | |
shouldBe(outer(""), 14); | |
shouldBe(outer("TEST"), 14); | |
} |