blob: 3c3552ef007799bbe43cef363b14ba0fbee77c63 [file] [log] [blame]
var testValue = 'test-value';
class A {
constructor() {
this.value = testValue;
}
}
class B extends A {
constructor(tdz) {
if (tdz)
this.id = 'id';
eval('super()');
}
}
var b = new B(false);
if (b.value !== testValue)
throw new Error("wrong value");
noInline(B);
let checkTDZ = function (klass, i) {
var exception;
try {
new klass(true);
} catch (e) {
exception = e;
if (!(e instanceof ReferenceError))
throw "Exception thrown in iteration " + i + " was not a reference error";
}
if (!exception)
throw "Exception not thrown for an unitialized this at iteration " + i;
}
for (var i = 0; i < 1e4; ++i) {
checkTDZ(B);
}
class C extends A {
constructor(tdz) {
if (tdz)
this.id = 'id';
eval("eval('super()')");
}
}
var c = new C(false);
if (c.value !== testValue)
throw new Error("wrong value");
for (var i = 0; i < 1e4; ++i) {
checkTDZ(C);
}
class D extends A {
constructor(tdz) {
if (tdz)
this.id = 'id';
eval("eval(\"eval('super()')\")");
}
}
var d = new D(false);
if (d.value !== testValue)
throw new Error("wrong value");
for (var i = 0; i < 1e4; ++i) {
checkTDZ(D);
}
var getEval = function (count) {
var newCount = count - 1;
return newCount === 0
? 'super()'
: 'eval(getEval(' + newCount + '))';
};
class E extends A {
constructor(tdz) {
if (tdz)
this.id = 'id';
eval(getEval(10));
}
}
var e = new E(false);
if (e.value !== testValue)
throw new Error("wrong value");
for (var i = 0; i < 1000; ++i) {
checkTDZ(E);
}