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); |