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