Skip to content

Commit b49317a

Browse files
authoredNov 6, 2024··
fix(es/minifier): Avoid generating reserved mangling names (#9710)
**Description:** Copy user defined `reserved` to `preserved_symbols`, so the generated name will be skipped by https://github.com/swc-project/swc/blob/56e83e2392c8ae89ce3854b36c64fed5e90f14c4/crates/swc_ecma_transforms_base/src/rename/analyzer/scope.rs#L296 **Related issue:** - Closes #9650
1 parent 499c803 commit b49317a

File tree

9 files changed

+123
-5
lines changed

9 files changed

+123
-5
lines changed
 

‎.changeset/spicy-otters-rule.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
swc_ecma_transforms_base: major
3+
---
4+
5+
fix(es/minifier): Avoid generating reserved mangling names

‎crates/swc_ecma_minifier/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ pub fn optimize(
230230
let _timer = timer!("mangle names");
231231
// TODO: base54.reset();
232232

233-
let preserved = idents_to_preserve(mangle.clone(), marks, &n);
233+
let preserved = idents_to_preserve(mangle, marks, &n);
234234

235235
let chars = CharFreq::compute(
236236
&n,
@@ -241,7 +241,7 @@ pub fn optimize(
241241

242242
mangle_names(
243243
&mut n,
244-
mangle.clone(),
244+
mangle,
245245
preserved,
246246
chars,
247247
extra.top_level_mark,

‎crates/swc_ecma_minifier/src/pass/mangle_names/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ mod private_name;
1818

1919
pub(crate) fn mangle_names(
2020
program: &mut Program,
21-
options: MangleOptions,
21+
options: &MangleOptions,
2222
preserved: FxHashSet<Id>,
2323
chars: Base54Chars,
2424
top_level_mark: Mark,
@@ -48,6 +48,7 @@ pub(crate) fn mangle_names(
4848
keep_class_names: options.keep_class_names,
4949
top_level_mark,
5050
ignore_eval: options.eval,
51+
preserved_symbols: options.reserved.iter().cloned().collect(),
5152
..Default::default()
5253
},
5354
ManglingRenamer {

‎crates/swc_ecma_minifier/src/pass/mangle_names/preserver.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};
77
use crate::option::MangleOptions;
88

99
/// Returns `(preserved, unresolved)`
10-
pub(crate) fn idents_to_preserve<N>(options: MangleOptions, marks: Marks, n: &N) -> FxHashSet<Id>
10+
pub(crate) fn idents_to_preserve<N>(options: &MangleOptions, marks: Marks, n: &N) -> FxHashSet<Id>
1111
where
1212
N: for<'a> VisitWith<Preserver<'a>>,
1313
{
1414
let mut v = Preserver {
15-
options: &options,
15+
options,
1616
preserved: Default::default(),
1717
should_preserve: false,
1818
in_top_level: false,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
export function logVariables(
2+
var1,
3+
var2,
4+
var3,
5+
var4,
6+
var5,
7+
var6,
8+
var7,
9+
var8,
10+
var9,
11+
var10,
12+
var11,
13+
var12,
14+
var13,
15+
var14,
16+
var15,
17+
var16,
18+
var17,
19+
var18,
20+
var19,
21+
var20,
22+
var21,
23+
var22,
24+
var23,
25+
var24,
26+
var25,
27+
var26,
28+
var27,
29+
var28,
30+
var29,
31+
var30,
32+
var101,
33+
var201,
34+
var301,
35+
var401,
36+
var501,
37+
var601,
38+
var701,
39+
var801,
40+
var901,
41+
var1001,
42+
var1101,
43+
var1201,
44+
var1301,
45+
var1401,
46+
var1501,
47+
var1601,
48+
var1701,
49+
var1801,
50+
var1901,
51+
var2001,
52+
var2101,
53+
var2201,
54+
var2301,
55+
var2401,
56+
var2501,
57+
var2601,
58+
var2701,
59+
var2801,
60+
var2901,
61+
var3001
62+
) {
63+
console.log(
64+
var1,
65+
var2,
66+
var3,
67+
var4,
68+
var5,
69+
var6,
70+
var7,
71+
var8,
72+
var9,
73+
var10,
74+
var11,
75+
var12,
76+
var13,
77+
var14,
78+
var15,
79+
var16,
80+
var17,
81+
var18,
82+
var19,
83+
var20,
84+
var21,
85+
var22,
86+
var23,
87+
var24,
88+
var25,
89+
var26,
90+
var27,
91+
var28,
92+
var29,
93+
var30
94+
);
95+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"reserved": ["$"]
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export function logVariables(o, l, e, n, a, c, g, i, r, s, t, b, f, p, u, x, V, d, h, j, k, m, q, v, w, y, z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, W, X, Y, Z, _, oo, ol, oe, on, oa, oc, og) {
2+
console.log(o, l, e, n, a, c, g, i, r, s, t, b, f, p, u, x, V, d, h, j, k, m, q, v, w, y, z, A, B, C);
3+
}

‎crates/swc_ecma_transforms_base/src/hygiene/mod.rs

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use rustc_hash::FxHashSet;
2+
use swc_atoms::Atom;
13
use swc_common::Mark;
24
use swc_ecma_ast::*;
35
use swc_ecma_utils::stack_size::maybe_grow_default;
@@ -24,6 +26,9 @@ pub struct Config {
2426

2527
/// Mangle even if vars are visible to `eval` or `with`.
2628
pub ignore_eval: bool,
29+
30+
/// Used for preventing mangler from renaming variables to reserved names.
31+
pub preserved_symbols: FxHashSet<Atom>,
2732
}
2833

2934
/// See [hygiene_with_config] for doc. Creates a `hygiene` pass with default

‎crates/swc_ecma_transforms_base/src/rename/mod.rs

+6
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,12 @@ where
176176
.extend(self.preserved.iter().map(|v| v.0.clone()));
177177
}
178178

179+
if !self.config.preserved_symbols.is_empty() {
180+
unresolved
181+
.to_mut()
182+
.extend(self.config.preserved_symbols.iter().cloned());
183+
}
184+
179185
if R::MANGLE {
180186
let cost = scope.rename_cost();
181187
scope.rename_in_mangle_mode(

0 commit comments

Comments
 (0)
Please sign in to comment.