Source code

Revision control

Copy as Markdown

Other Tools

// Test for `foo(...arguments)` spread calls with a cross-realm ArgumentsObject.
function testArgs(a, b, c) {
return `${a} ${b} ${c}`;
}
function test() {
var g = newGlobal();
// Replace g.%ArrayIteratorPrototype%.next.
g.evaluate(`
let arrIterProto = Object.getPrototypeOf([][Symbol.iterator]());
let count = 0;
arrIterProto.next = function() {
if (count > 2) {
count = 0;
return {done: true, value: 0};
}
return {done: false, value:count++ * 5} };
`);
for (var i = 0; i < 30; i++) {
var myRealmArgs = () => (function() { return arguments; })(1, 2, 3);
var crossRealmArgs = () => g.evaluate(`(function() { return arguments; })(1, 2, 3)`);
assertEq(testArgs(...myRealmArgs()), "1 2 3");
assertEq(testArgs(...crossRealmArgs()), "0 5 10");
var mixed = (i & 1) ? myRealmArgs() : crossRealmArgs();
assertEq(testArgs(...mixed), (i & 1) ? "1 2 3" : "0 5 10");
}
}
test();