Compare commits

...

5 Commits

Author SHA1 Message Date
Mihai Bazon
cf409800be it's safe to negate expression in !EXP only in boolean context
#kendo
2012-11-01 15:49:05 +02:00
Mihai Bazon
18270dd9f3 added unsafe_comps for negating <= with >
since it has the potential to break code, let's keep it disabled by default
2012-11-01 15:14:56 +02:00
Mihai Bazon
d4c25c571b fix compressing UnaryPrefix
only try negating the expression if the operator is `!`

#kendo
2012-11-01 13:35:08 +02:00
Mihai Bazon
5248b79506 v2.1.5 2012-10-30 14:51:05 +02:00
Mihai Bazon
abe0ebbf02 don't move expressions containing the binary in operator into the for initializer
(opera can't parse it)

close #25
2012-10-30 14:50:47 +02:00
3 changed files with 55 additions and 11 deletions

View File

@@ -53,6 +53,7 @@ function Compressor(options, false_by_default) {
dead_code : !false_by_default,
drop_debugger : !false_by_default,
unsafe : !false_by_default,
unsafe_comps : false,
conditionals : !false_by_default,
comparisons : !false_by_default,
evaluate : !false_by_default,
@@ -427,12 +428,23 @@ merge(Compressor.prototype, {
var ret = [], prev = null;
statements.forEach(function(stat){
if (prev) {
if (stat instanceof AST_For && stat.init && !(stat.init instanceof AST_Definitions)) {
stat.init = cons_seq(stat.init);
}
else if (stat instanceof AST_For && !stat.init) {
stat.init = prev.body;
ret.pop();
if (stat instanceof AST_For) {
var opera = {};
try {
prev.body.walk(new TreeWalker(function(node){
if (node instanceof AST_Binary && node.operator == "in")
throw opera;
}));
if (stat.init && !(stat.init instanceof AST_Definitions)) {
stat.init = cons_seq(stat.init);
}
else if (!stat.init) {
stat.init = prev.body;
ret.pop();
}
} catch(ex) {
if (ex !== opera) throw ex;
}
}
else if (stat instanceof AST_If) {
stat.condition = cons_seq(stat.condition);
@@ -692,7 +704,7 @@ merge(Compressor.prototype, {
});
def(AST_Binary, function(compressor){
var self = this.clone(), op = this.operator;
if (compressor.option("comparisons") && compressor.option("unsafe")) {
if (compressor.option("unsafe_comps")) {
switch (op) {
case "<=" : self.operator = ">" ; return self;
case "<" : self.operator = ">=" ; return self;
@@ -1434,9 +1446,9 @@ merge(Compressor.prototype, {
compressor.warn("Boolean expression always true [{file}:{line},{col}]", self.start);
return make_node(AST_True, self);
}
}
if (e instanceof AST_Binary) {
self = best_of(self, e.negate(compressor));
if (e instanceof AST_Binary && self.operator == "!") {
self = best_of(self, e.negate(compressor));
}
}
return self.evaluate(compressor)[0];
});

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.1.4",
"version": "2.1.5",
"engines": { "node" : ">=0.4.0" },
"maintainers": [{
"name": "Mihai Bazon",

View File

@@ -127,3 +127,35 @@ lift_sequences_4: {
x = baz;
}
}
for_sequences: {
options = { sequences: true };
input: {
// 1
foo();
bar();
for (; false;);
// 2
foo();
bar();
for (x = 5; false;);
// 3
x = (foo in bar);
for (; false;);
// 4
x = (foo in bar);
for (y = 5; false;);
}
expect: {
// 1
for (foo(), bar(); false;);
// 2
for (foo(), bar(), x = 5; false;);
// 3
x = (foo in bar);
for (; false;);
// 4
x = (foo in bar);
for (y = 5; false;);
}
}