Merge branch 'master' into harmony-v2.8.11
This commit is contained in:
@@ -286,6 +286,9 @@ merge(Compressor.prototype, {
|
|||||||
if (node instanceof AST_Function
|
if (node instanceof AST_Function
|
||||||
&& (iife = tw.parent()) instanceof AST_Call
|
&& (iife = tw.parent()) instanceof AST_Call
|
||||||
&& iife.expression === node) {
|
&& iife.expression === node) {
|
||||||
|
// Virtually turn IIFE parameters into variable definitions:
|
||||||
|
// (function(a,b) {...})(c,d) => (function() {var a=c,b=d; ...})()
|
||||||
|
// 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 = iife.args[i] || make_node(AST_Undefined, iife);
|
d.fixed = iife.args[i] || make_node(AST_Undefined, iife);
|
||||||
@@ -1900,32 +1903,32 @@ merge(Compressor.prototype, {
|
|||||||
node.name = null;
|
node.name = null;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Lambda && !(node instanceof AST_Accessor)) {
|
if (node instanceof AST_Lambda && !(node instanceof AST_Accessor)) {
|
||||||
if (!compressor.option("keep_fargs")) {
|
var trim = !compressor.option("keep_fargs");
|
||||||
for (var a = node.argnames, i = a.length; --i >= 0;) {
|
for (var a = node.argnames, i = a.length; --i >= 0;) {
|
||||||
if (a[i] instanceof AST_Destructuring) {
|
var sym = a[i];
|
||||||
// Do not drop destructuring arguments.
|
if (sym instanceof AST_Expansion) {
|
||||||
// They constitute a type assertion, so dropping
|
sym = sym.symbol;
|
||||||
// them would stop that TypeError which would happen
|
}
|
||||||
// if someone called it with an incorrectly formatted
|
// Do not drop destructuring arguments.
|
||||||
// parameter.
|
// They constitute a type assertion, so dropping
|
||||||
break;
|
// them would stop that TypeError which would happen
|
||||||
} else {
|
// if someone called it with an incorrectly formatted
|
||||||
var sym = a[i];
|
// parameter.
|
||||||
if (sym instanceof AST_Expansion) {
|
if (!(sym instanceof AST_Destructuring) && !(sym.definition().id in in_use_ids)) {
|
||||||
sym = sym.symbol;
|
sym.__unused = true;
|
||||||
}
|
if (trim) {
|
||||||
if (!(sym.definition().id in in_use_ids)) {
|
a.pop();
|
||||||
a.pop();
|
compressor.warn("Dropping unused function argument {name} [{file}:{line},{col}]", {
|
||||||
compressor.warn("Dropping unused function argument {name} [{file}:{line},{col}]", {
|
name : sym.name,
|
||||||
name : sym.name,
|
file : sym.start.file,
|
||||||
file : sym.start.file,
|
line : sym.start.line,
|
||||||
line : sym.start.line,
|
col : sym.start.col
|
||||||
col : sym.start.col
|
});
|
||||||
});
|
|
||||||
}
|
|
||||||
else break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
trim = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((node instanceof AST_Defun || node instanceof AST_DefClass) && node !== self) {
|
if ((node instanceof AST_Defun || node instanceof AST_DefClass) && node !== self) {
|
||||||
@@ -2741,6 +2744,9 @@ merge(Compressor.prototype, {
|
|||||||
exp = def.fixed;
|
exp = def.fixed;
|
||||||
if (compressor.option("unused")
|
if (compressor.option("unused")
|
||||||
&& def.references.length == 1
|
&& def.references.length == 1
|
||||||
|
&& !(def.scope.uses_arguments
|
||||||
|
&& def.orig[0] instanceof AST_SymbolFunarg)
|
||||||
|
&& !def.scope.uses_eval
|
||||||
&& compressor.find_parent(AST_Scope) === def.scope) {
|
&& compressor.find_parent(AST_Scope) === def.scope) {
|
||||||
self.expression = exp;
|
self.expression = exp;
|
||||||
}
|
}
|
||||||
@@ -2749,16 +2755,26 @@ merge(Compressor.prototype, {
|
|||||||
if (compressor.option("unused")
|
if (compressor.option("unused")
|
||||||
&& exp instanceof AST_Function
|
&& exp instanceof AST_Function
|
||||||
&& !exp.uses_arguments
|
&& !exp.uses_arguments
|
||||||
&& !exp.uses_eval
|
&& !exp.uses_eval) {
|
||||||
&& self.args.length > exp.argnames.length) {
|
var pos = 0, last = 0;
|
||||||
var end = exp.argnames.length;
|
for (var i = 0, len = self.args.length; i < len; i++) {
|
||||||
for (var i = end, len = self.args.length; i < len; i++) {
|
var trim = i >= exp.argnames.length;
|
||||||
var node = self.args[i].drop_side_effect_free(compressor);
|
if (trim || exp.argnames[i].__unused) {
|
||||||
if (node) {
|
var node = self.args[i].drop_side_effect_free(compressor);
|
||||||
self.args[end++] = node;
|
if (node) {
|
||||||
|
self.args[pos++] = node;
|
||||||
|
} else if (!trim) {
|
||||||
|
self.args[pos++] = make_node(AST_Number, self.args[i], {
|
||||||
|
value: 0
|
||||||
|
});
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.args[pos++] = self.args[i];
|
||||||
}
|
}
|
||||||
|
last = pos;
|
||||||
}
|
}
|
||||||
self.args.length = end;
|
self.args.length = last;
|
||||||
}
|
}
|
||||||
if (compressor.option("unsafe")) {
|
if (compressor.option("unsafe")) {
|
||||||
if (exp instanceof AST_SymbolRef && exp.undeclared()) {
|
if (exp instanceof AST_SymbolRef && exp.undeclared()) {
|
||||||
|
|||||||
@@ -278,9 +278,10 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
self.walk(new TreeWalker(function(node, descend) {
|
self.walk(new TreeWalker(function(node, descend) {
|
||||||
if (node instanceof AST_SymbolCatch) {
|
if (node instanceof AST_SymbolCatch) {
|
||||||
var name = node.name;
|
var name = node.name;
|
||||||
|
var refs = node.thedef.references;
|
||||||
var scope = node.thedef.scope.parent_scope;
|
var scope = node.thedef.scope.parent_scope;
|
||||||
var def = scope.find_variable(name) || self.globals.get(name) || scope.def_variable(node);
|
var def = scope.find_variable(name) || self.globals.get(name) || scope.def_variable(node);
|
||||||
node.thedef.references.forEach(function(ref) {
|
refs.forEach(function(ref) {
|
||||||
ref.thedef = def;
|
ref.thedef = def;
|
||||||
ref.reference(options);
|
ref.reference(options);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
"homepage": "http://lisperator.net/uglifyjs",
|
"homepage": "http://lisperator.net/uglifyjs",
|
||||||
"author": "Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)",
|
"author": "Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)",
|
||||||
"license": "BSD-2-Clause",
|
"license": "BSD-2-Clause",
|
||||||
"version": "2.8.10",
|
"version": "2.8.11",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.8.0"
|
"node": ">=0.8.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -842,3 +842,33 @@ assign_chain: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_1583: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function m(t) {
|
||||||
|
(function(e) {
|
||||||
|
t = e();
|
||||||
|
})(function() {
|
||||||
|
return (function(a) {
|
||||||
|
return a;
|
||||||
|
})(function(a) {});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function m(t) {
|
||||||
|
(function(e) {
|
||||||
|
t = (function() {
|
||||||
|
return (function(a) {
|
||||||
|
return a;
|
||||||
|
})(function(a) {});
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1144,3 +1144,111 @@ double_reference: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iife_arguments_1: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(x) {
|
||||||
|
console.log(x() === arguments[0]);
|
||||||
|
})(function f() {
|
||||||
|
return f;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(x) {
|
||||||
|
console.log(x() === arguments[0]);
|
||||||
|
})(function f() {
|
||||||
|
return f;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iife_arguments_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var x = function f() {
|
||||||
|
return f;
|
||||||
|
};
|
||||||
|
console.log(x() === arguments[0]);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
console.log(function f() {
|
||||||
|
return f;
|
||||||
|
}() === arguments[0]);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iife_eval_1: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(x) {
|
||||||
|
console.log(x() === eval("x"));
|
||||||
|
})(function f() {
|
||||||
|
return f;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(x) {
|
||||||
|
console.log(x() === eval("x"));
|
||||||
|
})(function f() {
|
||||||
|
return f;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iife_eval_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var x = function f() {
|
||||||
|
return f;
|
||||||
|
};
|
||||||
|
console.log(x() === eval("x"));
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
var x = function f() {
|
||||||
|
return f;
|
||||||
|
};
|
||||||
|
console.log(x() === eval("x"));
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iife_func_side_effects: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a, b, c) {
|
||||||
|
return b();
|
||||||
|
})(x(), function() {
|
||||||
|
return y();
|
||||||
|
}, z());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a, b, c) {
|
||||||
|
return function() {
|
||||||
|
return y();
|
||||||
|
}();
|
||||||
|
})(x(), 0, z());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -182,3 +182,39 @@ reduce_vars: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_1586_1: {
|
||||||
|
options = {
|
||||||
|
screw_ie8: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
screw_ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function f(){try{}catch(c){console.log(c.message)}}"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1586_2: {
|
||||||
|
options = {
|
||||||
|
screw_ie8: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
screw_ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function f(){try{}catch(c){console.log(c.message)}}"
|
||||||
|
}
|
||||||
|
|||||||
1
test/input/invalid/loop-no-body.js
Normal file
1
test/input/invalid/loop-no-body.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
for (var i = 0; i < 1; i++)
|
||||||
@@ -238,4 +238,17 @@ describe("bin/uglifyjs", function () {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
it("Should fail with a missing loop body", function(done) {
|
||||||
|
var command = uglifyjscmd + ' test/input/invalid/loop-no-body.js';
|
||||||
|
|
||||||
|
exec(command, function (err, stdout, stderr) {
|
||||||
|
assert.ok(err);
|
||||||
|
var lines = stderr.split(/\n/);
|
||||||
|
assert.strictEqual(lines[0], "Parse error at test/input/invalid/loop-no-body.js:2,0");
|
||||||
|
assert.strictEqual(lines[1], "for (var i = 0; i < 1; i++) ");
|
||||||
|
assert.strictEqual(lines[2], " ^");
|
||||||
|
assert.strictEqual(lines[3], "SyntaxError: Unexpected token: eof (undefined)");
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user