Merge branch 'master' into harmony

This commit is contained in:
Richard van Velzen
2016-05-24 17:56:20 +02:00
3 changed files with 273 additions and 8 deletions

View File

@@ -183,9 +183,18 @@ merge(Compressor.prototype, {
value: val
}).optimize(compressor);
case "number":
return make_node(isNaN(val) ? AST_NaN : AST_Number, orig, {
value: val
}).optimize(compressor);
if (isNaN(val)) {
return make_node(AST_NaN, orig);
}
if ((1 / val) < 0) {
return make_node(AST_UnaryPrefix, orig, {
operator: "-",
expression: make_node(AST_Number, null, { value: -val })
});
}
return make_node(AST_Number, orig, { value: val }).optimize(compressor);
case "boolean":
return make_node(val ? AST_True : AST_False, orig).optimize(compressor);
case "undefined":
@@ -542,6 +551,7 @@ merge(Compressor.prototype, {
function handle_if_return(statements, compressor) {
var self = compressor.self();
var multiple_if_returns = has_multiple_if_returns(statements);
var in_lambda = self instanceof AST_Lambda;
var ret = [];
loop: for (var i = statements.length; --i >= 0;) {
@@ -579,7 +589,8 @@ merge(Compressor.prototype, {
}
//---
// if (foo()) return x; [ return ; ] ==> return foo() ? x : undefined;
if ((ret.length == 0 || ret[0] instanceof AST_Return) && stat.body.value && !stat.alternative && in_lambda) {
if (multiple_if_returns && (ret.length == 0 || ret[0] instanceof AST_Return)
&& stat.body.value && !stat.alternative && in_lambda) {
CHANGED = true;
stat = stat.clone();
stat.alternative = ret[0] || make_node(AST_Return, stat, {
@@ -671,6 +682,17 @@ merge(Compressor.prototype, {
}
}
return ret;
function has_multiple_if_returns(statements) {
var n = 0;
for (var i = statements.length; --i >= 0;) {
var stat = statements[i];
if (stat instanceof AST_If && stat.body instanceof AST_Return) {
if (++n > 1) return true;
}
}
return false;
}
};
function eliminate_dead_code(statements, compressor) {
@@ -1051,10 +1073,7 @@ merge(Compressor.prototype, {
return typeof e;
case "void": return void ev(e, compressor);
case "~": return ~ev(e, compressor);
case "-":
e = ev(e, compressor);
if (e === 0) throw def;
return -e;
case "-": return -ev(e, compressor);
case "+": return +ev(e, compressor);
}
throw def;