bailout-env.js (957B)
1 function inner_env() { 2 let result = []; 3 4 let x = 0; 5 result.push(() => x); 6 7 var tmp = [1,2,3]; 8 for (let y in tmp) 9 result.push(() => tmp[y]) 10 11 for (let z = 4; z < 7; z++) 12 result.push(() => z) 13 14 return result; 15 } 16 17 function outer_env() { 18 let result = inner_env(); 19 20 var tmp = [7,8,9]; 21 for (let x in tmp) 22 result.push(() => tmp[x]) 23 24 return result; 25 } 26 27 function check_result(result, expectedLen) { 28 assertEq(result.length, expectedLen); 29 30 for (var i = 0; i < expectedLen; ++i) 31 assertEq(result[i], i); 32 } 33 34 // Wipeout jitcode 35 bailout(); 36 gc(); gc(); 37 38 // Test lexical environment bailouts 39 for (var i = 0; i < 100; ++i) 40 { 41 bailAfter(i); 42 43 var result = inner_env().map(fn => fn()); 44 check_result(result, 7); 45 } 46 47 // Test inlined lexical environment bailouts 48 for (var i = 0; i < 100; ++i) 49 { 50 bailAfter(i); 51 52 var result = outer_env().map(fn => fn()); 53 check_result(result, 10); 54 }