| function assert(b, m) { |
| if (!b) |
| throw new Error("Bad:" + m); |
| } |
| |
| let called = false; |
| function makePolyProtoObject() { |
| function foo() { |
| class C { |
| constructor() |
| { |
| this._p = null; |
| } |
| |
| set p(x) |
| { |
| called = true; |
| this._p = x; |
| } |
| get p() |
| { |
| return this._p; |
| } |
| }; |
| return new C; |
| } |
| for (let i = 0; i < 15; ++i) { |
| assert(foo().p === null); |
| } |
| return foo(); |
| } |
| |
| function performSet(o) { |
| o.p = 20; |
| } |
| |
| let items = []; |
| for (let i = 0; i < 20; ++i) { |
| items.push(makePolyProtoObject()); |
| } |
| |
| function performSet(x, i) { |
| x.p = i; |
| } |
| |
| let start = Date.now(); |
| for (let i = 0; i < 100000; ++i) { |
| for (let i = 0; i < items.length; ++i) { |
| let o = items[i]; |
| performSet(o, i); |
| assert(o._p === i); |
| assert(called === true); |
| called = false; |
| } |
| } |
| |
| items.forEach(o => { |
| Reflect.setPrototypeOf(o, null); |
| }); |
| |
| for (let i = 0; i < 100000; ++i) { |
| for (let i = 0; i < items.length; ++i) { |
| let o = items[i]; |
| performSet(o, i); |
| assert(o.p === i); |
| assert(called === false); |
| } |
| } |
| |
| if (false) |
| print(Date.now() - start); |