Skip to content

Commit f1ea902

Browse files
committed
feat(minifier): only apply arguments copy loop transformation in functions
1 parent b4889d5 commit f1ea902

File tree

2 files changed

+60
-47
lines changed

2 files changed

+60
-47
lines changed

crates/oxc_minifier/docs/ASSUMPTIONS.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,13 @@ eval('var x = 1');
9898
new Function('return x');
9999
```
100100

101-
### No access to a variable named `arguments` outside functions
101+
### No side effects from accessing to a global variable named `arguments`
102102

103-
`arguments` variables are only accessed inside functions. We intend to change this assumption to optional in the future.
103+
Accessing a global variable named `arguments` does not have a side effect. We intend to change this assumption to optional in the future.
104104

105105
```javascript
106106
// The minifier assumes this never happens:
107-
console.log(arguments);
107+
console.log(arguments); // ReferenceError: arguments is not defined
108108
```
109109

110110
## Optional Assumptions

crates/oxc_minifier/src/peephole/substitute_alternate_syntax.rs

Lines changed: 57 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)