Compare commits

..

6 Commits

Author SHA1 Message Date
Mihai Bazon
73d082df2e v2.4.4 2013-11-27 14:24:26 +02:00
Mihai Bazon
50b8d7272c Fix faulty compression
`String(x + 5)` is not always the same as `x + "5"`.  Overlooked that. :-(

Close #350
2013-11-20 21:13:16 +02:00
Mihai Bazon
7d11b96f48 Only descend twice after drop_unused if it's the same node type.
Fix #345
2013-11-08 11:57:17 +02:00
Mihai Bazon
eab99a1c3d Better fix for #343
We can in fact lift sequences, but only if the operation is assignment and
the left-hand side has no side effects nor property access -- that should
guarantee that whatever we place before it cannot affect the sense of the
assignment.

Dropped contrived test case (too hard to support it now), added a more
meaningful one.
2013-11-06 10:48:48 +02:00
Mihai Bazon
19e2fb134d v2.4.3 2013-11-06 10:21:29 +02:00
Mihai Bazon
f4919e3a25 Do not lift sequence from right-hand side of binary operation. Fix #343 2013-11-06 10:18:28 +02:00
4 changed files with 21 additions and 22 deletions

View File

@@ -85,13 +85,14 @@ merge(Compressor.prototype, {
},
before: function(node, descend, in_list) {
if (node._squeezed) return node;
var was_scope = false;
if (node instanceof AST_Scope) {
//node.drop_unused(this);
node = node.hoist_declarations(this);
was_scope = true;
}
descend(node, this);
node = node.optimize(this);
if (node instanceof AST_Scope) {
if (was_scope && node instanceof AST_Scope) {
node.drop_unused(this);
descend(node, this);
}
@@ -1865,6 +1866,14 @@ merge(Compressor.prototype, {
return self.evaluate(compressor)[0];
});
function has_side_effects_or_prop_access(node, compressor) {
var save_pure_getters = compressor.option("pure_getters");
compressor.options.pure_getters = false;
var ret = node.has_side_effects(compressor);
compressor.options.pure_getters = save_pure_getters;
return ret;
}
AST_Binary.DEFMETHOD("lift_sequences", function(compressor){
if (compressor.option("sequences")) {
if (this.left instanceof AST_Seq) {
@@ -1876,8 +1885,8 @@ merge(Compressor.prototype, {
return seq;
}
if (this.right instanceof AST_Seq
&& !(this.operator == "||" || this.operator == "&&")
&& !this.left.has_side_effects(compressor)) {
&& this instanceof AST_Assign
&& !has_side_effects_or_prop_access(this.left, compressor)) {
var seq = this.right;
var x = seq.to_array();
this.right = x.pop();
@@ -2022,16 +2031,6 @@ merge(Compressor.prototype, {
&& self.right.getValue() === "" && self.left instanceof AST_Binary
&& self.left.operator == "+" && self.left.is_string(compressor)) {
return self.left;
} else if (self.operator == "+" && self.right instanceof AST_String
&& self.right.getValue() === "" && self.left instanceof AST_Binary
&& self.left.operator == "+" && self.left.right instanceof AST_Number) {
return make_node(AST_Binary, self, {
left: self.left.left,
operator: "+",
right: make_node(AST_String, self.right, {
value: String(self.left.right.value)
})
});
}
if (compressor.option("evaluate")) {
if (self.operator == "+") {

View File

@@ -3,7 +3,7 @@
"description": "JavaScript parser, mangler/compressor and beautifier toolkit",
"homepage": "http://lisperator.net/uglifyjs",
"main": "tools/node.js",
"version": "2.4.2",
"version": "2.4.4",
"engines": { "node" : ">=0.4.0" },
"maintainers": [{
"name": "Mihai Bazon",

View File

@@ -54,15 +54,13 @@ strings_concat: {
input: {
f(
String(x + 'str'),
String('str' + x),
String(x + 5)
String('str' + x)
);
}
expect: {
f(
x + 'str',
'str' + x,
x + '5'
'str' + x
);
}
}
}

View File

@@ -101,10 +101,12 @@ lift_sequences_1: {
lift_sequences_2: {
options = { sequences: true, evaluate: true };
input: {
q = 1 + (foo(), bar(), 5) + 7 * (5 / (3 - (a(), (QW=ER), c(), 2))) - (x(), y(), 5);
foo.x = (foo = {}, 10);
bar = (bar = {}, 10);
}
expect: {
foo(), bar(), a(), QW = ER, c(), x(), y(), q = 36
foo.x = (foo = {}, 10),
bar = {}, bar = 10;
}
}