// The main purpose of this test is to ensure that | |
// we will re-use no longer in use CallSiteIndices for | |
// inline cache stubs. See relevant code in destructor | |
// which calls: | |
// DFG::CommonData::removeCallSiteIndex(.) | |
// CodeBlock::removeExceptionHandlerForCallSite(.) | |
// Which add old call site indices to a free list. | |
function assert(b) { | |
if (!b) | |
throw new Error("bad value"); | |
} | |
noInline(assert); | |
var arr = [] | |
function allocate() { | |
for (var i = 0; i < 10000; i++) | |
arr.push({}); | |
} | |
function hello() { return 20; } | |
noInline(hello); | |
let __jaz = {}; | |
function jazzy() { | |
return __jaz; | |
} | |
noInline(jazzy); | |
function foo(o) { | |
let baz = hello(); | |
let jaz = jazzy(); | |
let v; | |
try { | |
v = o.f; | |
v = o.f; | |
v = o.f; | |
} catch(e) { | |
assert(baz === 20); | |
assert(jaz === __jaz); | |
assert(v === 2); // Really flagCount. | |
} | |
return v; | |
} | |
noInline(foo); | |
var objChain = {f: 40}; | |
var fakeOut = {x: 30, f: 100}; | |
for (let i = 0; i < 1000; i++) | |
foo(i % 2 ? objChain : fakeOut); | |
var i; | |
var flag = "flag"; | |
var flagCount = 0; | |
objChain = { | |
get f() { | |
if (flagCount === 2) | |
throw new Error("I'm testing you."); | |
if (i === flag) | |
flagCount++; | |
return flagCount; | |
} | |
}; | |
for (i = 0; i < 100; i++) { | |
allocate(); | |
if (i === 99) | |
i = flag; | |
foo(objChain); | |
} | |
fakeOut = {x: 30, get f() { return 100}}; | |
for (i = 0; i < 100; i++) { | |
allocate(); | |
if (i === 99) | |
i = flag; | |
foo(fakeOut); | |
} | |
var o = { | |
get f() { | |
return flagCount; | |
}, | |
x: 100 | |
}; | |
for (i = 0; i < 100; i++) | |
foo(o); |