| 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) { |
| assert(foo().field === 42); |
| } |
| return foo(); |
| } |
| |
| function validate(o, b) { |
| assert("x" in o === b); |
| } |
| noInline(validate); |
| |
| let start = Date.now(); |
| |
| let objs = []; |
| for (let i = 0; i < 10; ++i) |
| objs.push(makePolyProtoObject()); |
| |
| objs.forEach(obj => Reflect.setPrototypeOf(obj, {x:20})); |
| |
| for (let i = 0; i < 10000; ++i) { |
| for (let obj of objs) |
| validate(obj, true); |
| } |
| |
| objs.forEach(obj => Reflect.setPrototypeOf(obj, {})); |
| for (let i = 0; i < 10000; ++i) { |
| for (let obj of objs) |
| validate(obj, false); |
| } |
| |
| |
| function validate2(o, b) { |
| assert("x" in o === b); |
| } |
| noInline(validate2); |
| |
| objs.forEach(obj => Reflect.setPrototypeOf(obj, null)); |
| for (let i = 0; i < 10000; ++i) { |
| for (let obj of objs) |
| validate2(obj, false); |
| } |
| |
| objs.forEach(obj => Reflect.setPrototypeOf(obj, {x:25})); |
| for (let i = 0; i < 10000; ++i) { |
| for (let obj of objs) |
| validate2(obj, true); |
| } |
| |
| if (false) |
| print(Date.now() - start); |