| function foo() { |
| class A { |
| constructor() { |
| } |
| }; |
| return A; |
| } |
| let A = foo(); |
| let B = foo(); |
| |
| function makePolyProto(o) { |
| return o.x; |
| } |
| noInline(makePolyProto); |
| |
| for (let i = 0; i < 1000; ++i) { |
| makePolyProto(i % 2 ? new A : new B); |
| } |
| |
| function bar(b) { |
| let o = new A; |
| if (b) { |
| if (isFinalTier()) |
| OSRExit(); |
| return o; |
| } |
| } |
| noInline(bar); |
| |
| function baz(b) { |
| let o = new A; |
| if (b) |
| return o; |
| } |
| noInline(baz); |
| |
| for (let i = 0; i < 100000; ++i) { |
| let b = i % 10 === 0; |
| let r = bar(b); |
| if (b) { |
| if (r.__proto__ !== A.prototype) |
| throw new Error("Bad!"); |
| } |
| } |
| |
| for (let i = 0; i < 100000; ++i) { |
| let b = i % 10 === 0; |
| let r = baz(b); |
| if (b) { |
| if (r.__proto__ !== A.prototype) |
| throw new Error("Bad!"); |
| } |
| } |