| let y = 42; |
| function makePolyProtoInstance() { |
| function foo() { |
| class C { |
| constructor() { this.x = 20; } |
| }; |
| C.prototype.y = y; |
| return new C; |
| } |
| |
| for (let i = 0; i < 5; ++i) |
| foo(); |
| return foo(); |
| } |
| |
| let polyProtoInstance = makePolyProtoInstance(); |
| String.prototype.__proto__ = polyProtoInstance; |
| Symbol.prototype.__proto__ = polyProtoInstance; |
| let strings = [ |
| "foo", |
| Symbol("foo"), |
| "bar", |
| Symbol("bar"), |
| ]; |
| |
| function assert(b) { |
| if (!b) |
| throw new Error("Bad asssertion") |
| } |
| noInline(assert); |
| |
| function validate(s) { |
| assert(s.x === 20); |
| assert(s.y === y); |
| assert(s.nonExistentProperty === undefined); |
| assert(typeof s.hasOwnProperty === "function"); |
| assert(s.hasOwnProperty === Object.prototype.hasOwnProperty); |
| } |
| noInline(validate); |
| |
| for (let i = 0; i < 1000; ++i) { |
| for (let s of strings) { |
| validate(s); |
| } |
| } |
| |
| y = 27; |
| polyProtoInstance.__proto__ = {z:400, y: y}; |
| for (let i = 0; i < 1000; ++i) { |
| for (let s of strings) { |
| validate(s); |
| } |
| } |