mirror of
https://github.com/swc-project/swc.git
synced 2024-12-23 13:51:19 +03:00
fix(es/minifier): Fix infinite loops (#4250)
- We now don't mark changes due to `negate_cost` as a change.
This commit is contained in:
parent
ea871e2879
commit
350a19587e
@ -0,0 +1,7 @@
|
||||
{
|
||||
"jsc": {
|
||||
"minify": {
|
||||
"compress": true
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
foo({
|
||||
bar: function bar(data, baz) {
|
||||
if (
|
||||
!(baz ? data.quxA : data.quxB) &&
|
||||
!(baz ? data.corgeA : data.corgeB) &&
|
||||
(baz ? data.get("waldo") : data.waldo)
|
||||
) {
|
||||
pass();
|
||||
} else if (
|
||||
!(baz ? data.quxA : data.quxB) &&
|
||||
!(baz ? data.get("waldo") : data.waldo) &&
|
||||
(baz ? data.corgeA : data.corgeB)
|
||||
) {
|
||||
pass();
|
||||
}
|
||||
}
|
||||
});
|
@ -0,0 +1,5 @@
|
||||
foo({
|
||||
bar: function(data, baz) {
|
||||
!(!(baz ? data.quxA : data.quxB) && !(baz ? data.corgeA : data.corgeB) && (baz ? data.get("waldo") : data.waldo)) ? (baz ? data.quxA : data.quxB) || (baz ? data.get("waldo") : data.waldo) || (baz ? !data.corgeA : !data.corgeB) || pass() : pass();
|
||||
}
|
||||
});
|
@ -34,7 +34,6 @@ where
|
||||
}
|
||||
|
||||
if negate_cost(&stmt.test, true, false) < 0 {
|
||||
self.changed = true;
|
||||
tracing::debug!("if_return: Negating `cond` of an if statement which has cons and alt");
|
||||
let ctx = Ctx {
|
||||
in_bool_ctx: true,
|
||||
|
@ -48,7 +48,6 @@ impl Pure<'_> {
|
||||
return;
|
||||
}
|
||||
tracing::debug!("bools: Optimizing `!(a && b)` as `!a || !b`");
|
||||
self.changed = true;
|
||||
self.negate(arg, false, false);
|
||||
*e = *arg.take();
|
||||
}
|
||||
|
@ -129,7 +129,6 @@ impl Pure<'_> {
|
||||
return;
|
||||
}
|
||||
|
||||
self.changed = true;
|
||||
tracing::debug!("conditionals: `a ? foo : bar` => `!a ? bar : foo` (considered cost)");
|
||||
let start_str = dump(&*cond, false);
|
||||
|
||||
|
@ -0,0 +1,194 @@
|
||||
TestSnapshot {
|
||||
vars: [
|
||||
(
|
||||
(
|
||||
Atom('bar' type=inline),
|
||||
#2,
|
||||
),
|
||||
VarUsageInfo {
|
||||
inline_prevented: false,
|
||||
ref_count: 0,
|
||||
cond_init: false,
|
||||
declared: false,
|
||||
declared_count: 0,
|
||||
declared_as_fn_param: false,
|
||||
declared_as_fn_expr: true,
|
||||
assign_count: 0,
|
||||
mutation_by_call_count: 0,
|
||||
usage_count: 0,
|
||||
reassigned_with_assignment: false,
|
||||
reassigned_with_var_decl: false,
|
||||
mutated: false,
|
||||
has_property_access: false,
|
||||
has_property_mutation: false,
|
||||
accessed_props: {},
|
||||
exported: false,
|
||||
used_above_decl: false,
|
||||
is_fn_local: false,
|
||||
used_by_nested_fn: false,
|
||||
executed_multiple_time: false,
|
||||
used_in_cond: false,
|
||||
var_kind: None,
|
||||
var_initialized: false,
|
||||
declared_as_catch_param: false,
|
||||
no_side_effect_for_member_access: false,
|
||||
used_as_callee: false,
|
||||
used_as_arg: false,
|
||||
pure_fn: false,
|
||||
infects: [],
|
||||
},
|
||||
),
|
||||
(
|
||||
(
|
||||
Atom('baz' type=inline),
|
||||
#2,
|
||||
),
|
||||
VarUsageInfo {
|
||||
inline_prevented: false,
|
||||
ref_count: 6,
|
||||
cond_init: false,
|
||||
declared: true,
|
||||
declared_count: 1,
|
||||
declared_as_fn_param: true,
|
||||
declared_as_fn_expr: false,
|
||||
assign_count: 0,
|
||||
mutation_by_call_count: 6,
|
||||
usage_count: 6,
|
||||
reassigned_with_assignment: false,
|
||||
reassigned_with_var_decl: false,
|
||||
mutated: true,
|
||||
has_property_access: false,
|
||||
has_property_mutation: false,
|
||||
accessed_props: {},
|
||||
exported: false,
|
||||
used_above_decl: false,
|
||||
is_fn_local: true,
|
||||
used_by_nested_fn: true,
|
||||
executed_multiple_time: false,
|
||||
used_in_cond: true,
|
||||
var_kind: None,
|
||||
var_initialized: false,
|
||||
declared_as_catch_param: false,
|
||||
no_side_effect_for_member_access: false,
|
||||
used_as_callee: false,
|
||||
used_as_arg: false,
|
||||
pure_fn: false,
|
||||
infects: [],
|
||||
},
|
||||
),
|
||||
(
|
||||
(
|
||||
Atom('data' type=inline),
|
||||
#2,
|
||||
),
|
||||
VarUsageInfo {
|
||||
inline_prevented: false,
|
||||
ref_count: 12,
|
||||
cond_init: false,
|
||||
declared: true,
|
||||
declared_count: 1,
|
||||
declared_as_fn_param: true,
|
||||
declared_as_fn_expr: false,
|
||||
assign_count: 0,
|
||||
mutation_by_call_count: 0,
|
||||
usage_count: 12,
|
||||
reassigned_with_assignment: false,
|
||||
reassigned_with_var_decl: false,
|
||||
mutated: false,
|
||||
has_property_access: true,
|
||||
has_property_mutation: false,
|
||||
accessed_props: {},
|
||||
exported: false,
|
||||
used_above_decl: false,
|
||||
is_fn_local: true,
|
||||
used_by_nested_fn: true,
|
||||
executed_multiple_time: false,
|
||||
used_in_cond: true,
|
||||
var_kind: None,
|
||||
var_initialized: false,
|
||||
declared_as_catch_param: false,
|
||||
no_side_effect_for_member_access: false,
|
||||
used_as_callee: false,
|
||||
used_as_arg: false,
|
||||
pure_fn: false,
|
||||
infects: [],
|
||||
},
|
||||
),
|
||||
(
|
||||
(
|
||||
Atom('foo' type=inline),
|
||||
#1,
|
||||
),
|
||||
VarUsageInfo {
|
||||
inline_prevented: false,
|
||||
ref_count: 1,
|
||||
cond_init: false,
|
||||
declared: false,
|
||||
declared_count: 0,
|
||||
declared_as_fn_param: false,
|
||||
declared_as_fn_expr: false,
|
||||
assign_count: 0,
|
||||
mutation_by_call_count: 0,
|
||||
usage_count: 1,
|
||||
reassigned_with_assignment: false,
|
||||
reassigned_with_var_decl: false,
|
||||
mutated: false,
|
||||
has_property_access: false,
|
||||
has_property_mutation: false,
|
||||
accessed_props: {},
|
||||
exported: false,
|
||||
used_above_decl: true,
|
||||
is_fn_local: true,
|
||||
used_by_nested_fn: false,
|
||||
executed_multiple_time: false,
|
||||
used_in_cond: false,
|
||||
var_kind: None,
|
||||
var_initialized: false,
|
||||
declared_as_catch_param: false,
|
||||
no_side_effect_for_member_access: false,
|
||||
used_as_callee: true,
|
||||
used_as_arg: false,
|
||||
pure_fn: false,
|
||||
infects: [],
|
||||
},
|
||||
),
|
||||
(
|
||||
(
|
||||
Atom('pass' type=inline),
|
||||
#1,
|
||||
),
|
||||
VarUsageInfo {
|
||||
inline_prevented: false,
|
||||
ref_count: 2,
|
||||
cond_init: false,
|
||||
declared: false,
|
||||
declared_count: 0,
|
||||
declared_as_fn_param: false,
|
||||
declared_as_fn_expr: false,
|
||||
assign_count: 0,
|
||||
mutation_by_call_count: 2,
|
||||
usage_count: 2,
|
||||
reassigned_with_assignment: false,
|
||||
reassigned_with_var_decl: false,
|
||||
mutated: true,
|
||||
has_property_access: false,
|
||||
has_property_mutation: false,
|
||||
accessed_props: {},
|
||||
exported: false,
|
||||
used_above_decl: true,
|
||||
is_fn_local: true,
|
||||
used_by_nested_fn: true,
|
||||
executed_multiple_time: false,
|
||||
used_in_cond: true,
|
||||
var_kind: None,
|
||||
var_initialized: false,
|
||||
declared_as_catch_param: false,
|
||||
no_side_effect_for_member_access: false,
|
||||
used_as_callee: true,
|
||||
used_as_arg: false,
|
||||
pure_fn: false,
|
||||
infects: [],
|
||||
},
|
||||
),
|
||||
],
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
foo({
|
||||
bar: function bar(data, baz) {
|
||||
if (
|
||||
!(baz ? data.quxA : data.quxB) &&
|
||||
!(baz ? data.corgeA : data.corgeB) &&
|
||||
(baz ? data.get("waldo") : data.waldo)
|
||||
) {
|
||||
pass();
|
||||
} else if (
|
||||
!(baz ? data.quxA : data.quxB) &&
|
||||
!(baz ? data.get("waldo") : data.waldo) &&
|
||||
(baz ? data.corgeA : data.corgeB)
|
||||
) {
|
||||
pass();
|
||||
}
|
||||
}
|
||||
});
|
@ -0,0 +1,5 @@
|
||||
foo({
|
||||
bar: function(data, baz) {
|
||||
!(!(baz ? data.quxA : data.quxB) && !(baz ? data.corgeA : data.corgeB) && (baz ? data.get("waldo") : data.waldo)) ? (baz ? data.quxA : data.quxB) || (baz ? data.get("waldo") : data.waldo) || (baz ? !data.corgeA : !data.corgeB) || pass() : pass();
|
||||
}
|
||||
});
|
Loading…
Reference in New Issue
Block a user