@@ -531,13 +531,13 @@ impl<'a> PeepholeOptimizations {
531531 }
532532
533533 // In non-strict mode, a different value may be reassigned to the `arguments` variable
534- if !ctx. current_scope_flags ( ) . is_strict_mode ( ) {
534+ if !ctx. current_scope_flags ( ) . is_strict_mode ( )
535+ // make sure `arguments` points to the arguments object
536+ || ctx. ancestor_scopes ( ) . all ( |s| !ctx. scoping ( ) . scope_flags ( s) . is_function ( ) )
537+ {
535538 return ;
536539 }
537540
538- // FIXME: this function treats `arguments` not inside a function scope as if they are inside it
539- // we should check in a different way than `ctx.is_global_reference`
540-
541541 // Parse statement: `r[a - offset] = arguments[a];`
542542 let body_assign_expr = {
543543 let assign = match & mut for_stmt. body {
@@ -2271,96 +2271,109 @@ mod test {
22712271 #[ test]
22722272 fn test_rewrite_arguments_copy_loop ( ) {
22732273 test (
2274- "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a]; console.log(r)" ,
2275- "var r = [...arguments]; console.log(r)" ,
2274+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a]; console.log(r) } " ,
2275+ "function _() { var r = [...arguments]; console.log(r) } " ,
22762276 ) ;
22772277 test (
2278- "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) { r[a] = arguments[a]; } console.log(r)" ,
2279- "var r = [...arguments]; console.log(r)" ,
2278+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) { r[a] = arguments[a]; } console.log(r) } " ,
2279+ "function _() { var r = [...arguments]; console.log(r) } " ,
22802280 ) ;
22812281 test (
2282- "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) { r[a] = arguments[a] } console.log(r)" ,
2283- "var r = [...arguments]; console.log(r)" ,
2282+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) { r[a] = arguments[a] } console.log(r) } " ,
2283+ "function _() { var r = [...arguments]; console.log(r) } " ,
22842284 ) ;
22852285 test (
2286- "for (var e = arguments.length, r = new Array(e), a = 0; a < e; a++) r[a] = arguments[a]; console.log(r)" ,
2287- "var r = [...arguments]; console.log(r)" ,
2286+ "function _() { for (var e = arguments.length, r = new Array(e), a = 0; a < e; a++) r[a] = arguments[a]; console.log(r) } " ,
2287+ "function _() { var r = [...arguments]; console.log(r) } " ,
22882288 ) ;
22892289 test (
2290- "for (var e = arguments.length, r = Array(e > 1 ? e - 1 : 0), a = 1; a < e; a++) r[a - 1] = arguments[a]; console.log(r)" ,
2291- "var r = [...arguments].slice(1); console.log(r)" ,
2290+ "function _() { for (var e = arguments.length, r = Array(e > 1 ? e - 1 : 0), a = 1; a < e; a++) r[a - 1] = arguments[a]; console.log(r) } " ,
2291+ "function _() { var r = [...arguments].slice(1); console.log(r) } " ,
22922292 ) ;
22932293 test (
2294- "for (var e = arguments.length, r = Array(e > 2 ? e - 2 : 0), a = 2; a < e; a++) r[a - 2] = arguments[a]; console.log(r)" ,
2295- "var r = [...arguments].slice(2); console.log(r)" ,
2294+ "function _() { for (var e = arguments.length, r = Array(e > 2 ? e - 2 : 0), a = 2; a < e; a++) r[a - 2] = arguments[a]; console.log(r) } " ,
2295+ "function _() { var r = [...arguments].slice(2); console.log(r) } " ,
22962296 ) ;
22972297 test (
2298- "for (var e = arguments.length, r = [], a = 0; a < e; a++) r[a] = arguments[a]; console.log(r)" ,
2299- "var r = [...arguments]; console.log(r)" ,
2298+ "function _() { for (var e = arguments.length, r = [], a = 0; a < e; a++) r[a] = arguments[a]; console.log(r) } " ,
2299+ "function _() { var r = [...arguments]; console.log(r) } " ,
23002300 ) ;
23012301 test (
2302- "for (var r = [], a = 0; a < arguments.length; a++) r[a] = arguments[a]; console.log(r)" ,
2303- "var r = [...arguments]; console.log(r)" ,
2302+ "function _() { for (var r = [], a = 0; a < arguments.length; a++) r[a] = arguments[a]; console.log(r) } " ,
2303+ "function _() { var r = [...arguments]; console.log(r) } " ,
23042304 ) ;
23052305 test (
2306- "for (var r = [], a = 1; a < arguments.length; a++) r[a - 1] = arguments[a]; console.log(r)" ,
2307- "var r = [...arguments].slice(1); console.log(r)" ,
2306+ "function _() { for (var r = [], a = 1; a < arguments.length; a++) r[a - 1] = arguments[a]; console.log(r) } " ,
2307+ "function _() { var r = [...arguments].slice(1); console.log(r) } " ,
23082308 ) ;
23092309 test (
2310- "for (var r = [], a = 2; a < arguments.length; a++) r[a - 2] = arguments[a]; console.log(r)" ,
2311- "var r = [...arguments].slice(2); console.log(r)" ,
2310+ "function _() { for (var r = [], a = 2; a < arguments.length; a++) r[a - 2] = arguments[a]; console.log(r) } " ,
2311+ "function _() { var r = [...arguments].slice(2); console.log(r) } " ,
23122312 ) ;
23132313 test (
2314- "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a];" ,
2315- "" ,
2314+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a]; } " ,
2315+ "function _() {} " ,
23162316 ) ;
23172317 test (
2318- "for (var e = arguments.length, r = Array(e > 1 ? e - 1 : 0), a = 1; a < e; a++) r[a - 1] = arguments[a]" ,
2319- "" ,
2318+ "function _() { for (var e = arguments.length, r = Array(e > 1 ? e - 1 : 0), a = 1; a < e; a++) r[a - 1] = arguments[a] } " ,
2319+ "function _() {} " ,
23202320 ) ;
23212321 test_same (
2322- "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) console.log(r[a]);" ,
2322+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) console.log(r[a]); } " ,
23232323 ) ;
23242324 test (
2325- "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) { r[a] = arguments[a]; console.log(r); }" ,
2326- "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) (r[a] = arguments[a], console.log(r))" ,
2325+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) { r[a] = arguments[a]; console.log(r); } }" ,
2326+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) (r[a] = arguments[a], console.log(r)) } " ,
23272327 ) ;
23282328 test_same (
2329- "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] += arguments[a];" ,
2329+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] += arguments[a]; } " ,
23302330 ) ;
23312331 test_same (
2332- "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a + 1] = arguments[a];" ,
2332+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a + 1] = arguments[a]; } " ,
23332333 ) ;
23342334 test_same (
2335- "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a - 0.5] = arguments[a];" ,
2335+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a - 0.5] = arguments[a]; } " ,
23362336 ) ;
23372337 test (
2338- "var arguments; for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a];" ,
2339- "for (var arguments, e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a];" ,
2338+ "function _() { var arguments; for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a]; }" ,
2339+ "function _() { for (var arguments, e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a]; }" ,
2340+ ) ;
2341+ test_same (
2342+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = foo[a]; }" ,
23402343 ) ;
2341- test_same ( "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = foo[a];" ) ;
23422344 test_same (
2343- "for (var e = arguments.length, r = Array(e), a = 0; a < e; e--) r[a] = arguments[a];" ,
2345+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; e--) r[a] = arguments[a]; } " ,
23442346 ) ;
23452347 test_same (
2346- "for (var e = arguments.length, r = Array(e), a = 0; a < e; r++) r[a] = arguments[a];" ,
2348+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; r++) r[a] = arguments[a]; } " ,
23472349 ) ;
23482350 test_same (
2349- "for (var e = arguments.length, r = Array(e), a = 0; a < r; r++) r[a] = arguments[a];" ,
2351+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < r; r++) r[a] = arguments[a]; } " ,
23502352 ) ;
23512353 test (
2352- "var arguments; for (var r = [], a = 0; a < arguments.length; a++) r[a] = arguments[a];" ,
2353- "for (var arguments, r = [], a = 0; a < arguments.length; a++) r[a] = arguments[a];" ,
2354+ "function _() { var arguments; for (var r = [], a = 0; a < arguments.length; a++) r[a] = arguments[a]; } " ,
2355+ "function _() { for (var arguments, r = [], a = 0; a < arguments.length; a++) r[a] = arguments[a]; } " ,
23542356 ) ;
23552357 test_same (
2356- "for (var e = arguments.length, r = Array(e > 1 ? e - 2 : 0), a = 2; a < e; a++) r[a - 2] = arguments[a];" ,
2358+ "function _() { for (var e = arguments.length, r = Array(e > 1 ? e - 2 : 0), a = 2; a < e; a++) r[a - 2] = arguments[a]; } " ,
23572359 ) ;
23582360
23592361 test_same_options_source_type (
2360- "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a]; console.log(r)" ,
2362+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a]; console.log(r) } " ,
23612363 SourceType :: cjs ( ) ,
23622364 & default_options ( ) ,
23632365 ) ;
2366+
2367+ test_same (
2368+ "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a]; console.log(r)" ,
2369+ ) ;
2370+ test_same (
2371+ "{ let _; for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a]; console.log(r) }" ,
2372+ ) ;
2373+ test (
2374+ "function _() { { let _; for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a]; console.log(r) } }" ,
2375+ "function _() { { let _; var r = [...arguments]; console.log(r) } }" ,
2376+ ) ;
23642377 }
23652378
23662379 #[ test]
0 commit comments