Source code
Revision control
Copy as Markdown
Other Tools
// |jit-test| --setpref=experimental.inline_simple_field_initializers=true
class Lazy {
constructor() { this.zeta = 1; }
alphaField = 0;
bravoField = 0;
}
assertEq(JSON.stringify(new Lazy()), '{"alphaField":0,"bravoField":0,"zeta":1}');
class Default { alphaField = 0; bravoField = 0; }
assertEq(JSON.stringify(new Default()), '{"alphaField":0,"bravoField":0}');
class Derived extends Default { charlieField = 0; }
assertEq(JSON.stringify(new Derived()),
'{"alphaField":0,"bravoField":0,"charlieField":0}');
class ArrowSuper extends Default {
charlieField = 0;
constructor() { const f = () => super(); f(); }
}
assertEq(JSON.stringify(new ArrowSuper()),
'{"alphaField":0,"bravoField":0,"charlieField":0}');
class Private { x = 0; #y = 0; get y() { return this.#y; } }
assertEq(new Private().y, 0);
// Private names that nothing else in the class reads.
class PrivateUnused { alphaField = 0; #bravo = 0; #charlie = 0; }
assertEq(JSON.stringify(new PrivateUnused()), '{"alphaField":0}');
class PrivateOnly {
#alpha = 0;
#bravo = 0;
static has(o) { return #alpha in o && #bravo in o; }
constructor() { this.z = 1; }
}
assertEq(PrivateOnly.has(new PrivateOnly()), true);
assertEq(PrivateOnly.has({}), false);
class PrivateDefault { #alpha = 0; static has(o) { return #alpha in o; } }
assertEq(PrivateDefault.has(new PrivateDefault()), true);
// A class with a private method has a private brand and isn't inlined.
class PrivateMethod { #alpha = 0; #m() { return 1; } get v() { return this.#m() + this.#alpha; } }
assertEq(new PrivateMethod().v, 1);
var key = "computed";
class Computed { alpha = 0; [key] = 0; }
assertEq(JSON.stringify(new Computed()), '{"alpha":0,"computed":0}');
class Index { 1 = 0; alpha = 0; }
assertEq(JSON.stringify(new Index()), '{"1":0,"alpha":0}');
class Many { a0=0;a1=0;a2=0;a3=0;a4=0;a5=0;a6=0;a7=0;a8=0;a9=0; }
assertEq(Object.keys(new Many()).length, 10);
// The functions and the class constructors are compiled lazily, then
// delazified when called.
let g = newGlobal({newCompartment: true});
g.evaluate(`
function makePublic() {
class C { alphaField = 0; bravoField = 0; }
return new C();
}
function makePrivate() {
class C { #alpha = 0; #bravo = 0; static has(o) { return #bravo in o; } }
return C.has(new C());
}
function makeExplicit() {
class C {
constructor() { this.zeta = 1; }
alphaField = 0;
bravoField = 0;
}
return new C();
}
`);
function checkDelazified() {
assertEq(JSON.stringify(g.makePublic()), '{"alphaField":0,"bravoField":0}');
assertEq(g.makePrivate(), true);
assertEq(JSON.stringify(g.makeExplicit()),
'{"alphaField":0,"bravoField":0,"zeta":1}');
}
checkDelazified();
finishgc();
startgc(0, 'shrinking');
checkDelazified();