@@ -2051,7 +2051,7 @@ Compressor.prototype.compress = function(node) {
|
||||
if (node instanceof AST_BlockScope
|
||||
&& !(node instanceof AST_Scope)
|
||||
&& !(node.variables && node.variables.all(function(def) {
|
||||
return !lvalues.has(def.name);
|
||||
return !enclosed.has(def.name) && !lvalues.has(def.name);
|
||||
}))) {
|
||||
var replace = can_replace;
|
||||
can_replace = false;
|
||||
@@ -2149,6 +2149,7 @@ Compressor.prototype.compress = function(node) {
|
||||
var read_toplevel = false;
|
||||
var modify_toplevel = false;
|
||||
// Locate symbols which may execute code outside of scanning range
|
||||
var enclosed = new Dictionary();
|
||||
var well_defined = true;
|
||||
var lvalues = get_lvalues(candidate);
|
||||
var lhs_local = is_lhs_local(lhs);
|
||||
@@ -3010,6 +3011,9 @@ Compressor.prototype.compress = function(node) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
node.enclosed.forEach(function(def) {
|
||||
if (def.scope !== node) enclosed.set(def.name, true);
|
||||
});
|
||||
return true;
|
||||
} else if (find_arguments && node instanceof AST_Sub) {
|
||||
scope.each_argname(function(argname) {
|
||||
|
||||
@@ -1752,3 +1752,38 @@ issue_5254: {
|
||||
"bar",
|
||||
]
|
||||
}
|
||||
|
||||
issue_5260: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
var a = "foo", o;
|
||||
while (console.log("bar"));
|
||||
o = {
|
||||
baz: function(b) {
|
||||
console.log(a, b);
|
||||
},
|
||||
};
|
||||
for (const a in o)
|
||||
o[a](a);
|
||||
}
|
||||
expect: {
|
||||
"use strict";
|
||||
var a = "foo", o;
|
||||
while (console.log("bar"));
|
||||
o = {
|
||||
baz: function(b) {
|
||||
console.log(a, b);
|
||||
},
|
||||
};
|
||||
for (const a in o)
|
||||
o[a](a);
|
||||
}
|
||||
expect_stdout: [
|
||||
"bar",
|
||||
"foo baz",
|
||||
]
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
@@ -1906,3 +1906,38 @@ issue_5254: {
|
||||
]
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_5260: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
var a = "foo", o;
|
||||
while (console.log("bar"));
|
||||
o = {
|
||||
baz: function(b) {
|
||||
console.log(a, b);
|
||||
},
|
||||
};
|
||||
for (let a in o)
|
||||
o[a](a);
|
||||
}
|
||||
expect: {
|
||||
"use strict";
|
||||
var a = "foo", o;
|
||||
while (console.log("bar"));
|
||||
o = {
|
||||
baz: function(b) {
|
||||
console.log(a, b);
|
||||
},
|
||||
};
|
||||
for (let a in o)
|
||||
o[a](a);
|
||||
}
|
||||
expect_stdout: [
|
||||
"bar",
|
||||
"foo baz",
|
||||
]
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user