| |
| class A { |
| constructor() { } |
| } |
| |
| class B extends A { |
| constructor() { |
| this; |
| super(); |
| } |
| } |
| |
| noInline(B); |
| |
| function assert(b) { |
| if (!b) |
| throw new Error("Assertion failure"); |
| } |
| noInline(assert); |
| |
| function shouldThrowTDZ(func) { |
| var hasThrown = false; |
| try { |
| func(); |
| } catch(e) { |
| if (e.name.indexOf("ReferenceError") !== -1) |
| hasThrown = true; |
| } |
| assert(hasThrown); |
| } |
| noInline(shouldThrowTDZ); |
| |
| function truth() { return true; } |
| noInline(truth); |
| |
| for (var i = 0; i < 100; ++i) { |
| var exception; |
| try { |
| new B(); |
| } 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; |
| } |
| |
| |
| |
| ;(function() { |
| function foo() { |
| return A; |
| class A { } |
| } |
| function bar() { |
| shouldThrowTDZ(function() { return A; }); |
| class A { } |
| } |
| function baz() { |
| class C { static m() { return "m"; } } |
| if (truth()) { |
| class B extends C { } |
| assert(B.m() === "m"); |
| } |
| class B extends A { } |
| class A { } |
| } |
| function taz() { |
| function f(x) { return x; } |
| class C extends f(C) { } |
| } |
| |
| for (var i = 0; i < 100; i++) { |
| shouldThrowTDZ(foo); |
| bar(); |
| shouldThrowTDZ(baz); |
| shouldThrowTDZ(taz); |
| } |
| })(); |