avoid arguments and eval in reduce_vars (#1924)

fixes #1922
This commit is contained in:
Alex Lam S.L
2017-05-12 12:34:55 +08:00
committed by GitHub
parent 547f41beba
commit ac73c5d421
2 changed files with 63 additions and 10 deletions

View File

@@ -354,10 +354,14 @@ merge(Compressor.prototype, {
// So existing transformation rules can work on them. // So existing transformation rules can work on them.
node.argnames.forEach(function(arg, i) { node.argnames.forEach(function(arg, i) {
var d = arg.definition(); var d = arg.definition();
d.fixed = function() { if (!node.uses_arguments && d.fixed === undefined) {
return iife.args[i] || make_node(AST_Undefined, iife); d.fixed = function() {
}; return iife.args[i] || make_node(AST_Undefined, iife);
mark(d, true); };
mark(d, true);
} else {
d.fixed = false;
}
}); });
} }
descend(); descend();
@@ -491,7 +495,9 @@ merge(Compressor.prototype, {
function reset_def(def) { function reset_def(def) {
def.escaped = false; def.escaped = false;
if (!def.global || def.orig[0] instanceof AST_SymbolConst || compressor.toplevel(def)) { if (def.scope.uses_eval) {
def.fixed = false;
} else if (!def.global || def.orig[0] instanceof AST_SymbolConst || compressor.toplevel(def)) {
def.fixed = undefined; def.fixed = undefined;
} else { } else {
def.fixed = false; def.fixed = false;

View File

@@ -41,20 +41,20 @@ reduce_vars: {
var A = 1; var A = 1;
(function() { (function() {
console.log(-3); console.log(-3);
console.log(-4); console.log(A - 5);
})(); })();
(function f1() { (function f1() {
var a = 2; var a = 2;
console.log(-3); console.log(a - 5);
eval("console.log(a);"); eval("console.log(a);");
})(); })();
(function f2(eval) { (function f2(eval) {
var a = 2; var a = 2;
console.log(-3); console.log(a - 5);
eval("console.log(a);"); eval("console.log(a);");
})(eval); })(eval);
"yes"; "yes";
console.log(2); console.log(A + 1);
} }
expect_stdout: true expect_stdout: true
} }
@@ -1749,7 +1749,10 @@ redefine_arguments_3: {
console.log(function() { console.log(function() {
var arguments; var arguments;
return typeof arguments; return typeof arguments;
}(), "number", "undefined"); }(), "number", function(x) {
var arguments = x;
return typeof arguments;
}());
} }
expect_stdout: "object number undefined" expect_stdout: "object number undefined"
} }
@@ -2461,3 +2464,47 @@ issue_1865: {
} }
expect_stdout: true expect_stdout: true
} }
issue_1922_1: {
options = {
evaluate: true,
reduce_vars: true,
unused: true,
}
input: {
console.log(function(a) {
arguments[0] = 2;
return a;
}(1));
}
expect: {
console.log(function(a) {
arguments[0] = 2;
return a;
}(1));
}
expect_stdout: "2"
}
issue_1922_2: {
options = {
evaluate: true,
reduce_vars: true,
unused: true,
}
input: {
console.log(function() {
var a;
eval("a = 1");
return a;
}(1));
}
expect: {
console.log(function() {
var a;
eval("a = 1");
return a;
}(1));
}
expect_stdout: "1"
}