// This test verifies that we don't crash in FTL generated code due to lack of a store barrier | |
// for a put-by-val when we don't know when the value was allocated. | |
class MyNumber | |
{ | |
constructor(v) | |
{ | |
this._v = v; | |
} | |
plusOne() | |
{ | |
return this._v + 1; | |
} | |
} | |
noDFG(MyNumber.plusOne); | |
let count = 0; | |
let bogus = null; | |
function bar() | |
{ | |
count++; | |
if (!(count % 100)) | |
fullGC(); | |
return new MyNumber(count); | |
} | |
noDFG(bar); | |
noInline(bar); | |
function foo(index, arg) | |
{ | |
var result = [arg[0]]; | |
if (arg.length > 1) | |
result[1] = bar(); | |
return result; | |
} | |
noInline(foo); | |
function test() | |
{ | |
for (let i = 0; i < 50000; i++) | |
{ | |
let a = [1, i]; | |
let x = foo(i, a); | |
if (!(count % 100)) | |
edenGC(); | |
for (let j = 0; j < 100; j++) | |
bogus = new MyNumber(-1); | |
if ((count + 1) != x[1].plusOne()) | |
throw("Wrong value for count"); | |
} | |
} | |
test(); |