function assert(b) { | |
if (!b) | |
throw new Error; | |
} | |
let outer = 42; | |
function foo(r, s) { | |
let y = outer; | |
r.test(s); | |
return y + outer; | |
} | |
noInline(foo); | |
for (let i = 0; i < 10000; ++i) { | |
let r = /foo/g; | |
regexLastIndex = {}; | |
regexLastIndex.toString = function() { | |
outer = 1; | |
return "1"; | |
}; | |
r.lastIndex = regexLastIndex; | |
let result = foo(r, "bar"); | |
assert(result === 43); | |
outer = 42; | |
} | |
function bar(r, s) { | |
let y = outer; | |
r.exec(s); | |
return y + outer; | |
} | |
noInline(bar); | |
for (let i = 0; i < 10000; ++i) { | |
let r = /foo/g; | |
regexLastIndex = {}; | |
regexLastIndex.toString = function() { | |
outer = 1; | |
return "1"; | |
}; | |
r.lastIndex = regexLastIndex; | |
let result = bar(r, "bar"); | |
assert(result === 43); | |
outer = 42; | |
} |