Merge branch 'master' into harmony

This commit is contained in:
Anthony Van de Gejuchte
2016-07-02 01:50:18 +02:00
committed by Richard van Velzen
21 changed files with 481 additions and 113 deletions

View File

@@ -72,13 +72,15 @@ function Compressor(options, false_by_default) {
pure_getters : false,
pure_funcs : null,
negate_iife : !false_by_default,
screw_ie8 : false,
screw_ie8 : true,
drop_console : false,
angular : false,
warnings : true,
global_defs : {},
passes : 1,
}, true);
var sequences = this.options["sequences"];
this.sequences_limit = sequences == 1 ? 200 : sequences | 0;
this.warnings_produced = {};
};
@@ -190,7 +192,7 @@ merge(Compressor.prototype, {
if ((1 / val) < 0) {
return make_node(AST_UnaryPrefix, orig, {
operator: "-",
expression: make_node(AST_Number, null, { value: -val })
expression: make_node(AST_Number, orig, { value: -val })
});
}
@@ -274,7 +276,7 @@ merge(Compressor.prototype, {
if (compressor.option("if_return")) {
statements = handle_if_return(statements, compressor);
}
if (compressor.option("sequences")) {
if (compressor.sequences_limit > 0) {
statements = sequencesize(statements, compressor);
}
if (compressor.option("join_vars")) {
@@ -737,7 +739,7 @@ merge(Compressor.prototype, {
seq = [];
};
statements.forEach(function(stat){
if (stat instanceof AST_SimpleStatement && seqLength(seq) < 2000) {
if (stat instanceof AST_SimpleStatement && seqLength(seq) < compressor.sequences_limit) {
seq.push(stat.body);
} else {
push_seq();
@@ -1079,32 +1081,38 @@ merge(Compressor.prototype, {
throw def;
});
def(AST_Binary, function(c){
var left = this.left, right = this.right;
var left = this.left, right = this.right, result;
switch (this.operator) {
case "&&" : return ev(left, c) && ev(right, c);
case "||" : return ev(left, c) || ev(right, c);
case "|" : return ev(left, c) | ev(right, c);
case "&" : return ev(left, c) & ev(right, c);
case "^" : return ev(left, c) ^ ev(right, c);
case "+" : return ev(left, c) + ev(right, c);
case "*" : return ev(left, c) * ev(right, c);
case "**" : return Math.pow(ev(left, c), ev(right, c));
case "/" : return ev(left, c) / ev(right, c);
case "%" : return ev(left, c) % ev(right, c);
case "-" : return ev(left, c) - ev(right, c);
case "<<" : return ev(left, c) << ev(right, c);
case ">>" : return ev(left, c) >> ev(right, c);
case ">>>" : return ev(left, c) >>> ev(right, c);
case "==" : return ev(left, c) == ev(right, c);
case "===" : return ev(left, c) === ev(right, c);
case "!=" : return ev(left, c) != ev(right, c);
case "!==" : return ev(left, c) !== ev(right, c);
case "<" : return ev(left, c) < ev(right, c);
case "<=" : return ev(left, c) <= ev(right, c);
case ">" : return ev(left, c) > ev(right, c);
case ">=" : return ev(left, c) >= ev(right, c);
case "&&" : result = ev(left, c) && ev(right, c); break;
case "||" : result = ev(left, c) || ev(right, c); break;
case "|" : result = ev(left, c) | ev(right, c); break;
case "&" : result = ev(left, c) & ev(right, c); break;
case "^" : result = ev(left, c) ^ ev(right, c); break;
case "+" : result = ev(left, c) + ev(right, c); break;
case "*" : result = ev(left, c) * ev(right, c); break;
case "**" : result = Math.pow(ev(left, c), ev(right, c)); break;
case "/" : result = ev(left, c) / ev(right, c); break;
case "%" : result = ev(left, c) % ev(right, c); break;
case "-" : result = ev(left, c) - ev(right, c); break;
case "<<" : result = ev(left, c) << ev(right, c); break;
case ">>" : result = ev(left, c) >> ev(right, c); break;
case ">>>" : result = ev(left, c) >>> ev(right, c); break;
case "==" : result = ev(left, c) == ev(right, c); break;
case "===" : result = ev(left, c) === ev(right, c); break;
case "!=" : result = ev(left, c) != ev(right, c); break;
case "!==" : result = ev(left, c) !== ev(right, c); break;
case "<" : result = ev(left, c) < ev(right, c); break;
case "<=" : result = ev(left, c) <= ev(right, c); break;
case ">" : result = ev(left, c) > ev(right, c); break;
case ">=" : result = ev(left, c) >= ev(right, c); break;
default:
throw def;
}
throw def;
if (isNaN(result) && c.find_parent(AST_With)) {
// leave original expression as is
throw def;
}
return result;
});
def(AST_Conditional, function(compressor){
return ev(this.condition, compressor)
@@ -2678,13 +2686,16 @@ merge(Compressor.prototype, {
if (defines && HOP(defines, self.name)) {
return make_node_from_constant(compressor, defines[self.name], self);
}
switch (self.name) {
case "undefined":
return make_node(AST_Undefined, self);
case "NaN":
return make_node(AST_NaN, self).transform(compressor);
case "Infinity":
return make_node(AST_Infinity, self).transform(compressor);
// testing against !self.scope.uses_with first is an optimization
if (!self.scope.uses_with || !compressor.find_parent(AST_With)) {
switch (self.name) {
case "undefined":
return make_node(AST_Undefined, self);
case "NaN":
return make_node(AST_NaN, self).transform(compressor);
case "Infinity":
return make_node(AST_Infinity, self).transform(compressor);
}
}
}
return self;
@@ -2816,7 +2827,7 @@ merge(Compressor.prototype, {
if (consequent.is_constant(compressor)
&& alternative.is_constant(compressor)
&& consequent.equivalent_to(alternative)) {
var consequent_value = consequent.constant_value();
var consequent_value = consequent.constant_value(compressor);
if (self.condition.has_side_effects(compressor)) {
return AST_Seq.from_array([self.condition, make_node_from_constant(compressor, consequent_value, self)]);
} else {