@@ -535,9 +535,6 @@ impl<'a> PeepholeOptimizations {
535
535
return ;
536
536
}
537
537
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
-
541
538
// Parse statement: `r[a - offset] = arguments[a];`
542
539
let body_assign_expr = {
543
540
let assign = match & mut for_stmt. body {
@@ -661,6 +658,12 @@ impl<'a> PeepholeOptimizations {
661
658
return ;
662
659
}
663
660
661
+ // make sure `arguments` points to the arguments object
662
+ // this is checked after the structure checks above because this check is slower than the structure checks
663
+ if ctx. ancestor_scopes ( ) . all ( |s| !ctx. scoping ( ) . scope_flags ( s) . is_function ( ) ) {
664
+ return ;
665
+ }
666
+
664
667
let mut idx = 0usize ;
665
668
666
669
// Check `e = arguments.length`
@@ -2271,96 +2274,109 @@ mod test {
2271
2274
#[ test]
2272
2275
fn test_rewrite_arguments_copy_loop ( ) {
2273
2276
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)" ,
2277
+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a]; console.log(r) } " ,
2278
+ "function _() { var r = [...arguments]; console.log(r) } " ,
2276
2279
) ;
2277
2280
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)" ,
2281
+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) { r[a] = arguments[a]; } console.log(r) } " ,
2282
+ "function _() { var r = [...arguments]; console.log(r) } " ,
2280
2283
) ;
2281
2284
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)" ,
2285
+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) { r[a] = arguments[a] } console.log(r) } " ,
2286
+ "function _() { var r = [...arguments]; console.log(r) } " ,
2284
2287
) ;
2285
2288
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)" ,
2289
+ "function _() { for (var e = arguments.length, r = new Array(e), a = 0; a < e; a++) r[a] = arguments[a]; console.log(r) } " ,
2290
+ "function _() { var r = [...arguments]; console.log(r) } " ,
2288
2291
) ;
2289
2292
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)" ,
2293
+ "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) } " ,
2294
+ "function _() { var r = [...arguments].slice(1); console.log(r) } " ,
2292
2295
) ;
2293
2296
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)" ,
2297
+ "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) } " ,
2298
+ "function _() { var r = [...arguments].slice(2); console.log(r) } " ,
2296
2299
) ;
2297
2300
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)" ,
2301
+ "function _() { for (var e = arguments.length, r = [], a = 0; a < e; a++) r[a] = arguments[a]; console.log(r) } " ,
2302
+ "function _() { var r = [...arguments]; console.log(r) } " ,
2300
2303
) ;
2301
2304
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)" ,
2305
+ "function _() { for (var r = [], a = 0; a < arguments.length; a++) r[a] = arguments[a]; console.log(r) } " ,
2306
+ "function _() { var r = [...arguments]; console.log(r) } " ,
2304
2307
) ;
2305
2308
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)" ,
2309
+ "function _() { for (var r = [], a = 1; a < arguments.length; a++) r[a - 1] = arguments[a]; console.log(r) } " ,
2310
+ "function _() { var r = [...arguments].slice(1); console.log(r) } " ,
2308
2311
) ;
2309
2312
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)" ,
2313
+ "function _() { for (var r = [], a = 2; a < arguments.length; a++) r[a - 2] = arguments[a]; console.log(r) } " ,
2314
+ "function _() { var r = [...arguments].slice(2); console.log(r) } " ,
2312
2315
) ;
2313
2316
test (
2314
- "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a];" ,
2315
- "" ,
2317
+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a]; } " ,
2318
+ "function _() {} " ,
2316
2319
) ;
2317
2320
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
- "" ,
2321
+ "function _() { for (var e = arguments.length, r = Array(e > 1 ? e - 1 : 0), a = 1; a < e; a++) r[a - 1] = arguments[a] } " ,
2322
+ "function _() {} " ,
2320
2323
) ;
2321
2324
test_same (
2322
- "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) console.log(r[a]);" ,
2325
+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) console.log(r[a]); } " ,
2323
2326
) ;
2324
2327
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))" ,
2328
+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) { r[a] = arguments[a]; console.log(r); } }" ,
2329
+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) (r[a] = arguments[a], console.log(r)) } " ,
2327
2330
) ;
2328
2331
test_same (
2329
- "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] += arguments[a];" ,
2332
+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] += arguments[a]; } " ,
2330
2333
) ;
2331
2334
test_same (
2332
- "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a + 1] = arguments[a];" ,
2335
+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a + 1] = arguments[a]; } " ,
2333
2336
) ;
2334
2337
test_same (
2335
- "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a - 0.5] = arguments[a];" ,
2338
+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a - 0.5] = arguments[a]; } " ,
2336
2339
) ;
2337
2340
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];" ,
2341
+ "function _() { var arguments; for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a]; }" ,
2342
+ "function _() { for (var arguments, e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a]; }" ,
2343
+ ) ;
2344
+ test_same (
2345
+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = foo[a]; }" ,
2340
2346
) ;
2341
- test_same ( "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = foo[a];" ) ;
2342
2347
test_same (
2343
- "for (var e = arguments.length, r = Array(e), a = 0; a < e; e--) r[a] = arguments[a];" ,
2348
+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; e--) r[a] = arguments[a]; } " ,
2344
2349
) ;
2345
2350
test_same (
2346
- "for (var e = arguments.length, r = Array(e), a = 0; a < e; r++) r[a] = arguments[a];" ,
2351
+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; r++) r[a] = arguments[a]; } " ,
2347
2352
) ;
2348
2353
test_same (
2349
- "for (var e = arguments.length, r = Array(e), a = 0; a < r; r++) r[a] = arguments[a];" ,
2354
+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < r; r++) r[a] = arguments[a]; } " ,
2350
2355
) ;
2351
2356
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];" ,
2357
+ "function _() { var arguments; for (var r = [], a = 0; a < arguments.length; a++) r[a] = arguments[a]; } " ,
2358
+ "function _() { for (var arguments, r = [], a = 0; a < arguments.length; a++) r[a] = arguments[a]; } " ,
2354
2359
) ;
2355
2360
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];" ,
2361
+ "function _() { for (var e = arguments.length, r = Array(e > 1 ? e - 2 : 0), a = 2; a < e; a++) r[a - 2] = arguments[a]; } " ,
2357
2362
) ;
2358
2363
2359
2364
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)" ,
2365
+ "function _() { for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a]; console.log(r) } " ,
2361
2366
SourceType :: cjs ( ) ,
2362
2367
& default_options ( ) ,
2363
2368
) ;
2369
+
2370
+ test_same (
2371
+ "for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a]; console.log(r)" ,
2372
+ ) ;
2373
+ test_same (
2374
+ "{ let _; for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a]; console.log(r) }" ,
2375
+ ) ;
2376
+ test (
2377
+ "function _() { { let _; for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = arguments[a]; console.log(r) } }" ,
2378
+ "function _() { { let _; var r = [...arguments]; console.log(r) } }" ,
2379
+ ) ;
2364
2380
}
2365
2381
2366
2382
#[ test]
0 commit comments