Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| --fast-warmup; --no-threads
// Suspending while the JS_IS_CONSTRUCTING magic value is on the stack.
var numPlainObjects = 0;
function Plain(x, y) {
this.z = x + y;
numPlainObjects++;
}
class Base {
constructor(x, y) {
this.z = x + y;
}
}
class Derived extends Base {
constructor(x, y) {
super(x, y);
}
}
function* newDataView() {
return new DataView(yield 0, yield 1);
}
function* newDataViewSpread() {
return new DataView(...[yield 0, yield 1]);
}
function* newPlain() {
return new Plain(yield 0, yield 1);
}
function* inner(x) {
return yield x;
}
function* newPlainDelegate() {
return new Plain(yield* inner(0), yield* inner(1));
}
function* newDerived() {
return new Derived(yield 0, yield 1);
}
var buffer = new ArrayBuffer(8);
function testNext(f, arg1, arg2, check) {
for (var i = 0; i < 100; i++) {
var gen = f();
var first = gen.next();
assertEq(first.value, 0);
assertEq(first.done, false);
var second = gen.next(arg1);
assertEq(second.value, 1);
assertEq(second.done, false);
var result = gen.next(arg2);
assertEq(result.done, true);
check(result.value);
}
}
testNext(newDataView, buffer, 2, v => {
assertEq(v instanceof DataView, true);
assertEq(v.buffer, buffer);
assertEq(v.byteOffset, 2);
});
testNext(newDataViewSpread, buffer, 3, v => {
assertEq(v instanceof DataView, true);
assertEq(v.buffer, buffer);
assertEq(v.byteOffset, 3);
});
testNext(newPlain, 3, 4, v => {
assertEq(v instanceof Plain, true);
assertEq(v.z, 7);
});
testNext(newPlainDelegate, 3, 6, v => {
assertEq(v instanceof Plain, true);
assertEq(v.z, 9);
});
testNext(newDerived, -3, 7, v => {
assertEq(v instanceof Derived, true);
assertEq(v.z, 4);
});
function testReturn(f) {
for (var i = 0; i < 100; i++) {
var gen = f();
assertEq(gen.next().value, 0);
assertEq(gen.next().value, 1);
var result = gen.return(42);
assertEq(result.value, 42);
assertEq(result.done, true);
assertEq(gen.next().done, true);
}
}
testReturn(newDataView);
testReturn(newDataViewSpread);
testReturn(newPlain);
testReturn(newPlainDelegate);
testReturn(newDerived);
// testReturn forces a return before the constructor is called.
assertEq(numPlainObjects, 200);