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