Source code
Revision control
Copy as Markdown
Other Tools
// Test inlining bound fun_apply to inlinable natives.
function testNoBoundThis() {
var ArrayJoin = Function.prototype.apply.bind(Array.prototype.join);
var xs = [
[],
["a"],
["a", "b"],
["a", "b", "c"],
];
for (var i = 0; i < 100; ++i) {
var x = xs[i & 3];
assertEq(ArrayJoin(x), x.join());
assertEq(ArrayJoin(x, null), x.join());
assertEq(ArrayJoin(x, undefined), x.join());
// Not optimized cases.
assertEq(ArrayJoin(x, []), x.join());
assertEq(ArrayJoin(x, [""]), x.join(""));
}
}
testNoBoundThis();
function testBoundThis() {
var array = ["a", "b"];
var ArrayJoin = Function.prototype.apply.bind(Array.prototype.join, array);
for (var i = 0; i < 100; ++i) {
assertEq(ArrayJoin(), "a,b");
assertEq(ArrayJoin(null), "a,b");
assertEq(ArrayJoin(undefined), "a,b");
// Not optimized cases.
assertEq(ArrayJoin([]), "a,b");
assertEq(ArrayJoin([""]), "ab");
}
}
testBoundThis();
function testBoundThisAndArgs() {
var array = ["a", "b"];
var ArrayJoinNull = Function.prototype.apply.bind(Array.prototype.join, array, null);
var ArrayJoinUndefined = Function.prototype.apply.bind(Array.prototype.join, array, undefined);
var ArrayJoinEmptyArgs = Function.prototype.apply.bind(Array.prototype.join, array, []);
var ArrayJoinWithArgs = Function.prototype.apply.bind(Array.prototype.join, array, [""]);
for (var i = 0; i < 100; ++i) {
assertEq(ArrayJoinNull(), "a,b");
assertEq(ArrayJoinUndefined(), "a,b");
// Not optimized cases.
assertEq(ArrayJoinEmptyArgs(), "a,b");
assertEq(ArrayJoinWithArgs(), "ab");
}
}
testBoundThisAndArgs();
function testUndefinedGuard() {
var array = ["a", "b"];
var ArrayJoin = Function.prototype.apply.bind(Array.prototype.join);
var ArrayJoinBoundThis = Function.prototype.apply.bind(Array.prototype.join, array);
var args = [
null,
[""],
];
var expected = [
"a,b",
"ab",
];
for (var i = 0; i < 100; i++) {
var index = (i > 50)|0;
assertEq(ArrayJoin(array, args[index]), expected[index]);
assertEq(ArrayJoinBoundThis(args[index]), expected[index]);
}
}
testUndefinedGuard();
function testUndefinedBoundArgsGuard() {
var array = ["a", "b"];
var ArrayJoinBoundNull = Function.prototype.apply.bind(Array.prototype.join, array, null);
var ArrayJoinBoundUndefined = Function.prototype.apply.bind(Array.prototype.join, array, undefined);
var ArrayJoinBoundArgs = Function.prototype.apply.bind(Array.prototype.join, array, [""]);
var fns = [
[
ArrayJoinBoundNull,
ArrayJoinBoundArgs,
],
[
ArrayJoinBoundUndefined,
ArrayJoinBoundArgs,
],
];
var expected = [
"a,b",
"ab",
];
for (var i = 0; i < 100; i++) {
var index = (i > 50)|0;
assertEq(fns[0][index](), expected[index]);
assertEq(fns[1][index](), expected[index]);
}
}
testUndefinedBoundArgsGuard();