Skip to content

Commit 02729f2

Browse files
authored
fix(es/minifier): Abort property hoisting on eval (#8957)
**Description:** - Repro: https://github.com/kdy1/repro-next-46887-2 **Related issue:** - vercel/next.js#46887 (comment)
1 parent f681924 commit 02729f2

File tree

3 files changed

+79
-0
lines changed

3 files changed

+79
-0
lines changed

crates/swc_ecma_minifier/src/compress/optimize/props.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ impl Optimizer<'_> {
4444
return None;
4545
}
4646

47+
if !self.may_add_ident() {
48+
return None;
49+
}
50+
4751
// If a variable is initialized multiple time, we currently don't do anything
4852
// smart.
4953
let usage = self.data.vars.get(&name.to_id())?;
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
var Za = {
2+
set: Qi,
3+
get: Qg,
4+
enforce: function (e1) {
5+
return Ri(e1) ? Qg(e1) : Qi(e1, {});
6+
},
7+
getterFor: function (e1) {
8+
return function (t) {
9+
var n;
10+
if (!ha(t) || (n = Qg(t)).type !== e1) throw TypeError("Incompatible receiver, " + e1 + " required");
11+
return n;
12+
};
13+
}
14+
}
15+
16+
export function exposed() {
17+
try {
18+
var a = eval("quire".replace(/^/, "re"))(c);
19+
if (a && (a.length || Object.keys(a).length)) return a;
20+
} catch (e1) { }
21+
return null;
22+
}
23+
24+
export default (function (e) {
25+
var t = Za.get,
26+
n = Za.enforce,
27+
r = String(String).split("String");
28+
(e.exports = function (e, t, i, o) {
29+
var a = !!o && !!o.unsafe,
30+
s = !!o && !!o.enumerable;
31+
if (o = !!o && !!o.noTargetGet, "function" == typeof i) {
32+
"string" != typeof t || Q(i, "name") || Na(i, "name", t);
33+
var u = n(i);
34+
u.source || (u.source = r.join("string" == typeof t ? t : ""))
35+
}
36+
e === y ? s ? e[t] = i : Oi(t, i) : (a ? !o && e[t] && (s = !0) : delete e[t], s ? e[t] = i : Na(e, t, i))
37+
})(Function.prototype, "toString", (function () {
38+
return "function" == typeof this && t(this).source || Pi(this)
39+
}))
40+
})
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
var Za = {
2+
set: Qi,
3+
get: Qg,
4+
enforce: function(e1) {
5+
return Ri(e1) ? Qg(e1) : Qi(e1, {});
6+
},
7+
getterFor: function(e1) {
8+
return function(t) {
9+
var n;
10+
if (!ha(t) || (n = Qg(t)).type !== e1) throw TypeError("Incompatible receiver, " + e1 + " required");
11+
return n;
12+
};
13+
}
14+
};
15+
export function exposed() {
16+
try {
17+
var a = eval("quire".replace(/^/, "re"))(c);
18+
if (a && (a.length || Object.keys(a).length)) return a;
19+
} catch (e1) {}
20+
return null;
21+
}
22+
export default function(e) {
23+
var t = Za.get, n = Za.enforce, r = String(String).split("String");
24+
(e.exports = function(e, t, i, o) {
25+
var a = !!o && !!o.unsafe, s = !!o && !!o.enumerable;
26+
if (o = !!o && !!o.noTargetGet, "function" == typeof i) {
27+
"string" != typeof t || Q(i, "name") || Na(i, "name", t);
28+
var u = n(i);
29+
u.source || (u.source = r.join("string" == typeof t ? t : ""));
30+
}
31+
e === y ? s ? e[t] = i : Oi(t, i) : (a ? !o && e[t] && (s = !0) : delete e[t], s ? e[t] = i : Na(e, t, i));
32+
})(Function.prototype, "toString", function() {
33+
return "function" == typeof this && t(this).source || Pi(this);
34+
});
35+
}

0 commit comments

Comments
 (0)