Skip to content

Commit b2b2037

Browse files
committed
feat(minifier): only apply arguments copy loop transformation in functions (#13952)
Made the arguments copy loop transformation to only apply inside functions to reduce the assumptions held.
1 parent fa76365 commit b2b2037

File tree

2 files changed

+62
-46
lines changed

2 files changed

+62
-46
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: 59 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -535,9 +535,6 @@ impl<'a> PeepholeOptimizations {
535535
return;
536536
}
537537

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-
541538
// Parse statement: `r[a - offset] = arguments[a];`
542539
let body_assign_expr = {
543540
let assign = match &mut for_stmt.body {
@@ -661,6 +658,12 @@ impl<'a> PeepholeOptimizations {
661658
return;
662659
}
663660

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+
664667
let mut idx = 0usize;
665668

666669
// Check `e = arguments.length`
@@ -2271,96 +2274,109 @@ mod test {
22712274
#[test]
22722275
fn test_rewrite_arguments_copy_loop() {
22732276
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) }",
22762279
);
22772280
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) }",
22802283
);
22812284
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) }",
22842287
);
22852288
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) }",
22882291
);
22892292
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) }",
22922295
);
22932296
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) }",
22962299
);
22972300
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) }",
23002303
);
23012304
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) }",
23042307
);
23052308
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) }",
23082311
);
23092312
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) }",
23122315
);
23132316
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 _() {}",
23162319
);
23172320
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 _() {}",
23202323
);
23212324
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]); }",
23232326
);
23242327
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)) }",
23272330
);
23282331
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]; }",
23302333
);
23312334
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]; }",
23332336
);
23342337
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]; }",
23362339
);
23372340
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]; }",
23402346
);
2341-
test_same("for (var e = arguments.length, r = Array(e), a = 0; a < e; a++) r[a] = foo[a];");
23422347
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]; }",
23442349
);
23452350
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]; }",
23472352
);
23482353
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]; }",
23502355
);
23512356
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]; }",
23542359
);
23552360
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]; }",
23572362
);
23582363

23592364
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) }",
23612366
SourceType::cjs(),
23622367
&default_options(),
23632368
);
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+
);
23642380
}
23652381

23662382
#[test]

0 commit comments

Comments
 (0)