X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/2d39b0e377c0896910ee49ae70082ba665faf986..ed1e77d3adeb83d26fd1dfb16dd84cabdcefd250:/tests/controlFlowProfiler/brace-location.js diff --git a/tests/controlFlowProfiler/brace-location.js b/tests/controlFlowProfiler/brace-location.js new file mode 100644 index 0000000..8663cb8 --- /dev/null +++ b/tests/controlFlowProfiler/brace-location.js @@ -0,0 +1,159 @@ +load("./driver/driver.js"); + +function foo() {} +function bar() {} +function baz() {} + +function testIf(x) { + if (x < 10) { foo(); } else if (x < 20) { bar(); } else { baz() } +} +testIf(9); +// Note, the check will be against the basic block that contains the first matched character. +// So in this following case, the block that contains the '{'. +checkBasicBlock(testIf, "{ foo", ShouldHaveExecuted); +// In this case, it will test the basic block that contains the ' ' character. +checkBasicBlock(testIf, " foo", ShouldHaveExecuted); +checkBasicBlock(testIf, "} else if", ShouldHaveExecuted); +checkBasicBlock(testIf, "else if", ShouldNotHaveExecuted); +checkBasicBlock(testIf, "{ bar", ShouldNotHaveExecuted); +checkBasicBlock(testIf, " bar", ShouldNotHaveExecuted); +checkBasicBlock(testIf, "else {", ShouldNotHaveExecuted); +checkBasicBlock(testIf, "{ baz", ShouldNotHaveExecuted); +checkBasicBlock(testIf, " baz", ShouldNotHaveExecuted); +testIf(21); +checkBasicBlock(testIf, "else if (x < 20)", ShouldHaveExecuted); +checkBasicBlock(testIf, "{ bar", ShouldNotHaveExecuted); +checkBasicBlock(testIf, " bar", ShouldNotHaveExecuted); +checkBasicBlock(testIf, "else {", ShouldHaveExecuted); +checkBasicBlock(testIf, "{ baz", ShouldHaveExecuted); +checkBasicBlock(testIf, " baz", ShouldHaveExecuted); +testIf(11); +checkBasicBlock(testIf, "{ bar", ShouldHaveExecuted); +checkBasicBlock(testIf, " bar", ShouldHaveExecuted); + +function testForRegular(x) { + for (var i = 0; i < x; i++) { foo(); } bar(); +} +testForRegular(0); +checkBasicBlock(testForRegular, "{ foo", ShouldNotHaveExecuted); +checkBasicBlock(testForRegular, "} bar", ShouldNotHaveExecuted); +checkBasicBlock(testForRegular, " bar", ShouldHaveExecuted); +testForRegular(1); +checkBasicBlock(testForRegular, "{ foo", ShouldHaveExecuted); +checkBasicBlock(testForRegular, "} bar", ShouldHaveExecuted); + +function testForIn(x) { + for (var i in x) { foo(); } bar(); +} +testForIn({}); +checkBasicBlock(testForIn, "{ foo", ShouldNotHaveExecuted); +checkBasicBlock(testForIn, "} bar", ShouldNotHaveExecuted); +checkBasicBlock(testForIn, " bar", ShouldHaveExecuted); +testForIn({foo: 20}); +checkBasicBlock(testForIn, "{ foo", ShouldHaveExecuted); +checkBasicBlock(testForIn, "} bar", ShouldHaveExecuted); + +function testForOf(x) { + for (var i of x) { foo(); } bar(); +} +testForOf([]); +checkBasicBlock(testForOf, "{ foo", ShouldNotHaveExecuted); +checkBasicBlock(testForOf, " foo", ShouldNotHaveExecuted); +checkBasicBlock(testForOf, "} bar", ShouldNotHaveExecuted); +checkBasicBlock(testForOf, " bar", ShouldHaveExecuted); +testForOf([20]); +checkBasicBlock(testForOf, "{ foo", ShouldHaveExecuted); +checkBasicBlock(testForOf, "} bar", ShouldHaveExecuted); + +function testWhile(x) { + var i = 0; while (i++ < x) { foo(); } bar(); +} +testWhile(0); +checkBasicBlock(testWhile, "{ foo", ShouldNotHaveExecuted); +checkBasicBlock(testWhile, " foo", ShouldNotHaveExecuted); +checkBasicBlock(testWhile, "} bar", ShouldNotHaveExecuted); +checkBasicBlock(testWhile, " bar", ShouldHaveExecuted); +testWhile(1); +checkBasicBlock(testWhile, "{ foo", ShouldHaveExecuted); +checkBasicBlock(testWhile, "} bar", ShouldHaveExecuted); + + +// No braces tests. + +function testIfNoBraces(x) { + if (x < 10) foo(); else if (x < 20) bar(); else baz(); +} +testIfNoBraces(9); +checkBasicBlock(testIfNoBraces, "foo", ShouldHaveExecuted); +checkBasicBlock(testIfNoBraces, " foo", ShouldHaveExecuted); +checkBasicBlock(testIfNoBraces, "; else if", ShouldHaveExecuted); +checkBasicBlock(testIfNoBraces, " else if", ShouldNotHaveExecuted); +checkBasicBlock(testIfNoBraces, " bar", ShouldNotHaveExecuted); +checkBasicBlock(testIfNoBraces, "bar", ShouldNotHaveExecuted); +checkBasicBlock(testIfNoBraces, "else baz", ShouldNotHaveExecuted); +checkBasicBlock(testIfNoBraces, "baz", ShouldNotHaveExecuted); +testIfNoBraces(21); +checkBasicBlock(testIfNoBraces, "else baz", ShouldHaveExecuted); +checkBasicBlock(testIfNoBraces, "baz", ShouldHaveExecuted); +checkBasicBlock(testIfNoBraces, "; else baz", ShouldNotHaveExecuted); +checkBasicBlock(testIfNoBraces, "else if (x < 20)", ShouldHaveExecuted); +// Note that the whitespace preceding bar is part of the previous basic block. +// An if statement's if-true basic block text offset begins at the start offset +// of the if-true block, in this case, just the expression "bar()". +checkBasicBlock(testIfNoBraces, " bar", ShouldHaveExecuted); +checkBasicBlock(testIfNoBraces, "bar", ShouldNotHaveExecuted); +testIfNoBraces(11); +checkBasicBlock(testIfNoBraces, " bar", ShouldHaveExecuted); +checkBasicBlock(testIfNoBraces, "bar", ShouldHaveExecuted); + +function testForRegularNoBraces(x) { + for (var i = 0; i < x; i++) foo(); bar(); +} +testForRegularNoBraces(0); +checkBasicBlock(testForRegularNoBraces, " foo", ShouldHaveExecuted); +checkBasicBlock(testForRegularNoBraces, "foo", ShouldNotHaveExecuted); +checkBasicBlock(testForRegularNoBraces, "; bar", ShouldNotHaveExecuted); +checkBasicBlock(testForRegularNoBraces, " bar", ShouldHaveExecuted); +testForRegularNoBraces(1); +checkBasicBlock(testForRegularNoBraces, " foo", ShouldHaveExecuted); +checkBasicBlock(testForRegularNoBraces, "foo", ShouldHaveExecuted); +checkBasicBlock(testForRegularNoBraces, " bar", ShouldHaveExecuted); + +function testForInNoBraces(x) { + for (var i in x) foo(); bar(); +} +testForInNoBraces({}); +checkBasicBlock(testForInNoBraces, " foo", ShouldHaveExecuted); +checkBasicBlock(testForInNoBraces, "foo", ShouldNotHaveExecuted); +checkBasicBlock(testForInNoBraces, "; bar", ShouldNotHaveExecuted); +checkBasicBlock(testForInNoBraces, " bar", ShouldHaveExecuted); +testForInNoBraces({foo: 20}); +checkBasicBlock(testForInNoBraces, " foo", ShouldHaveExecuted); +checkBasicBlock(testForInNoBraces, "foo", ShouldHaveExecuted); +checkBasicBlock(testForInNoBraces, "; bar", ShouldHaveExecuted); + +function testForOfNoBraces(x) { + for (var i of x) foo(); bar(); +} +testForOfNoBraces([]); +checkBasicBlock(testForOfNoBraces, " foo", ShouldHaveExecuted); +checkBasicBlock(testForOfNoBraces, "foo", ShouldNotHaveExecuted); +checkBasicBlock(testForOfNoBraces, "; bar", ShouldNotHaveExecuted); +checkBasicBlock(testForOfNoBraces, " bar", ShouldHaveExecuted); +testForOfNoBraces([20]); +checkBasicBlock(testForOfNoBraces, " foo", ShouldHaveExecuted); +checkBasicBlock(testForOfNoBraces, "foo", ShouldHaveExecuted); +checkBasicBlock(testForOfNoBraces, "; bar", ShouldHaveExecuted); + +function testWhileNoBraces(x) { + var i = 0; while (i++ < x) foo(); bar(); +} +testWhileNoBraces(0); +checkBasicBlock(testWhileNoBraces, " foo", ShouldHaveExecuted); +checkBasicBlock(testWhileNoBraces, "foo", ShouldNotHaveExecuted); +checkBasicBlock(testWhileNoBraces, "; bar", ShouldNotHaveExecuted); +checkBasicBlock(testWhileNoBraces, " bar", ShouldHaveExecuted); +testWhileNoBraces(1); +checkBasicBlock(testWhileNoBraces, " foo", ShouldHaveExecuted); +checkBasicBlock(testWhileNoBraces, "foo", ShouldHaveExecuted); +checkBasicBlock(testWhileNoBraces, "; bar", ShouldHaveExecuted);