fix corner case in unsafe_regexp (#3609)
This commit is contained in:
@@ -362,6 +362,7 @@ merge(Compressor.prototype, {
|
||||
function reset_def(tw, compressor, def) {
|
||||
def.assignments = 0;
|
||||
def.chained = false;
|
||||
def.cross_loop = false;
|
||||
def.direct_access = false;
|
||||
def.escaped = [];
|
||||
def.fixed = !def.scope.pinned()
|
||||
@@ -765,6 +766,9 @@ merge(Compressor.prototype, {
|
||||
d.fixed = false;
|
||||
}
|
||||
}
|
||||
if (d.fixed && tw.loop_ids[d.id] !== tw.in_loop) {
|
||||
d.cross_loop = true;
|
||||
}
|
||||
mark_escaped(tw, d, this.scope, this, value, 0, 1);
|
||||
}
|
||||
var parent;
|
||||
@@ -6494,14 +6498,13 @@ merge(Compressor.prototype, {
|
||||
if (fixed && def.should_replace === undefined) {
|
||||
var init;
|
||||
if (fixed instanceof AST_This) {
|
||||
if (!(def.orig[0] instanceof AST_SymbolFunarg) && all(def.references, function(ref) {
|
||||
return def.scope === ref.scope;
|
||||
})) {
|
||||
if (!(def.orig[0] instanceof AST_SymbolFunarg) && same_scope(def)) {
|
||||
init = fixed;
|
||||
}
|
||||
} else {
|
||||
var ev = fixed.evaluate(compressor);
|
||||
if (ev !== fixed && (compressor.option("unsafe_regexp") || !(ev instanceof RegExp))) {
|
||||
if (ev !== fixed && (!(ev instanceof RegExp)
|
||||
|| compressor.option("unsafe_regexp") && !def.cross_loop && same_scope(def))) {
|
||||
init = make_node_from_constant(ev, fixed);
|
||||
}
|
||||
}
|
||||
@@ -6538,6 +6541,13 @@ merge(Compressor.prototype, {
|
||||
}
|
||||
return self;
|
||||
|
||||
function same_scope(def) {
|
||||
var scope = def.scope.resolve();
|
||||
return all(def.references, function(ref) {
|
||||
return scope === ref.scope.resolve();
|
||||
});
|
||||
}
|
||||
|
||||
function has_symbol_ref(value) {
|
||||
var found;
|
||||
value.walk(new TreeWalker(function(node) {
|
||||
|
||||
Reference in New Issue
Block a user