/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
const GeneratorFunction =
function*(){}.constructor;
// Test subclassing %GeneratorFunction% works correctly.
class MyGenerator
extends GeneratorFunction {}
var fn =
new MyGenerator();
assertEq(fn
instanceof MyGenerator,
true);
assertEq(fn
instanceof GeneratorFunction,
true);
assertEq(Object.getPrototypeOf(fn), MyGenerator.prototype);
fn = Reflect.construct(MyGenerator, []);
assertEq(fn
instanceof MyGenerator,
true);
assertEq(fn
instanceof GeneratorFunction,
true);
assertEq(Object.getPrototypeOf(fn), MyGenerator.prototype);
fn = Reflect.construct(MyGenerator, [], MyGenerator);
assertEq(fn
instanceof MyGenerator,
true);
assertEq(fn
instanceof GeneratorFunction,
true);
assertEq(Object.getPrototypeOf(fn), MyGenerator.prototype);
fn = Reflect.construct(MyGenerator, [], GeneratorFunction);
assertEq(fn
instanceof MyGenerator,
false);
assertEq(fn
instanceof GeneratorFunction,
true);
assertEq(Object.getPrototypeOf(fn), GeneratorFunction.prototype);
// Set a different constructor as NewTarget.
fn = Reflect.construct(MyGenerator, [], Array);
assertEq(fn
instanceof MyGenerator,
false);
assertEq(fn
instanceof GeneratorFunction,
false);
assertEq(Object.getPrototypeOf(fn), Array.prototype);
fn = Reflect.construct(GeneratorFunction, [], Array);
assertEq(fn
instanceof GeneratorFunction,
false);
assertEq(Object.getPrototypeOf(fn), Array.prototype);
// The prototype defaults to %GeneratorFunctionPrototype% if null.
function NewTargetNullPrototype() {}
NewTargetNullPrototype.prototype =
null;
fn = Reflect.construct(GeneratorFunction, [], NewTargetNullPrototype);
assertEq(fn
instanceof GeneratorFunction,
true);
assertEq(Object.getPrototypeOf(fn), GeneratorFunction.prototype);
fn = Reflect.construct(MyGenerator, [], NewTargetNullPrototype);
assertEq(fn
instanceof MyGenerator,
false);
assertEq(fn
instanceof GeneratorFunction,
true);
assertEq(Object.getPrototypeOf(fn), GeneratorFunction.prototype);
// "prototype" property is retrieved exactly once.
var trapLog = [], getLog = [];
var ProxiedConstructor =
new Proxy(GeneratorFunction,
new Proxy({
get(target, propertyKey, receiver) {
getLog.push(propertyKey);
return Reflect.get(target, propertyKey, receiver);
}
}, {
get(target, propertyKey, receiver) {
trapLog.push(propertyKey);
return Reflect.get(target, propertyKey, receiver);
}
}));
fn = Reflect.construct(GeneratorFunction, [], ProxiedConstructor);
assertEqArray(trapLog, [
"get"]);
assertEqArray(getLog, [
"prototype"]);
assertEq(fn
instanceof GeneratorFunction,
true);
assertEq(Object.getPrototypeOf(fn), GeneratorFunction.prototype);
if (
typeof reportCompare ===
"function")
reportCompare(0, 0);