if (!abort) {
if (stat.init) stat.init = cons_seq(stat.init);
else {
- stat.init = prev.body.drop_side_effect_free(compressor);
+ stat.init = prev.body;
n--;
}
}
OPT(AST_For, function(self, compressor){
if (!compressor.option("loops")) return self;
+ if (compressor.option("side_effects") && self.init) {
+ self.init = self.init.drop_side_effect_free(compressor);
+ }
if (self.condition) {
var cond = self.condition.evaluate(compressor);
if (!(cond instanceof AST_Node)) {
if (!compressor.option("switches")) return self;
var branch;
var value = self.expression.evaluate(compressor);
- if (value !== self.expression) {
- var expression = make_node_from_constant(value, self.expression).transform(compressor);
- self.expression = best_of_expression(expression, self.expression);
+ if (!(value instanceof AST_Node)) {
+ var orig = self.expression;
+ self.expression = make_node_from_constant(value, orig);
+ self.expression = best_of_expression(self.expression.transform(compressor), orig);
}
if (!compressor.option("dead_code")) return self;
+ if (value instanceof AST_Node) {
+ value = self.expression.tail_node().evaluate(compressor);
+ }
var decl = [];
var body = [];
var default_branch;
} else {
eliminate_branch(branch, body[body.length - 1]);
}
- } else if (value !== self.expression) {
+ } else if (!(value instanceof AST_Node)) {
var exp = branch.expression.evaluate(compressor);
if (exp === value) {
exact_match = branch;
}
expect_exact: 'for(function(){"foo"in{}};0;);'
}
+
+init_side_effects: {
+ options = {
+ loops: true,
+ side_effects: true,
+ };
+ input: {
+ for (function() {}(), i = 0; i < 5; i++) console.log(i);
+ for (function() {}(); i < 10; i++) console.log(i);
+ }
+ expect: {
+ for (i = 0; i < 5; i++) console.log(i);
+ for (; i < 10; i++) console.log(i);
+ }
+ expect_stdout: true
+}
input: {
(function() {})();
for (i = 0; i < 5; i++) console.log(i);
-
(function() {})();
- for (; i < 5; i++) console.log(i);
+ for (; i < 10; i++) console.log(i);
}
expect: {
for (!function() {}(), i = 0; i < 5; i++) console.log(i);
- for (function() {}(); i < 5; i++) console.log(i);
+ for (!function() {}(); i < 10; i++) console.log(i);
}
expect_stdout: true
}