| function assert(b, m) { |
| if (!b) |
| throw new Error("Bad:" + m); |
| } |
| |
| function makePolyProtoObject() { |
| function foo() { |
| class C { |
| constructor() { |
| this._field = 42; |
| } |
| }; |
| return new C; |
| } |
| for (let i = 0; i < 15; ++i) |
| foo(); |
| return foo(); |
| } |
| |
| let global; |
| |
| function performSet(o) { |
| o.p = 20; |
| } |
| |
| let start = Date.now(); |
| for (let i = 0; i < 1000; ++i) { |
| let obj = makePolyProtoObject(); |
| obj.__proto__ = null; |
| performSet(obj); |
| assert(Object.hasOwnProperty.call(obj, "p")); |
| assert(obj.p === 20); |
| |
| } |
| |
| for (let i = 0; i < 1000; ++i) { |
| let obj = makePolyProtoObject(); |
| obj.__proto__ = { set p(x) { global = x; } }; |
| performSet(obj); |
| assert(!obj.hasOwnProperty("p")); |
| assert(global === 20); |
| global = null; |
| } |
| |
| for (let i = 0; i < 1000; ++i) { |
| let obj = makePolyProtoObject(); |
| performSet(obj); |
| assert(obj.hasOwnProperty("p")); |
| assert(obj.p === 20); |
| } |
| if (false) |
| print(Date.now() - start); |