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