Skip to content

Commit

Permalink
fix corner case in inline (#3837)
Browse files Browse the repository at this point in the history
fixes #3836
  • Loading branch information
alexlamsl authored May 1, 2020
1 parent 74801de commit 0794aaa
Show file tree
Hide file tree
Showing 2 changed files with 119 additions and 82 deletions.
26 changes: 20 additions & 6 deletions lib/compress.js
Original file line number Diff line number Diff line change
Expand Up @@ -4003,16 +4003,30 @@ merge(Compressor.prototype, {
})) break;
}
if (fn.contains_this()) break;
var j = fn.argnames.length;
if (j > 0 && compressor.option("inline") < 2) break;
if (j > self.argnames.length) break;
if (j < self.argnames.length && !compressor.drop_fargs(fn, call)) break;
while (--j >= 0) {
var len = fn.argnames.length;
if (len > 0 && compressor.option("inline") < 2) break;
if (len > self.argnames.length) break;
for (var j = 0; j < len; j++) {
var arg = call.args[j];
if (!(arg instanceof AST_SymbolRef)) break;
if (arg.definition() !== self.argnames[j].definition()) break;
}
if (j >= 0) break;
if (j < len) break;
for (; j < call.args.length; j++) {
if (call.args[j].has_side_effects(compressor)) break;
}
if (j < call.args.length) break;
if (len < self.argnames.length && !compressor.drop_fargs(self, compressor.parent())) {
if (!compressor.drop_fargs(fn, call)) break;
do {
var argname = make_node(AST_SymbolFunarg, fn, {
name: fn.make_var_name("argument_" + len),
scope: fn
});
fn.argnames.push(argname);
fn.enclosed.push(fn.def_variable(argname));
} while (++len < self.argnames.length);
}
return call.expression;
}
break;
Expand Down
175 changes: 99 additions & 76 deletions test/compress/functions.js
Original file line number Diff line number Diff line change
Expand Up @@ -4151,7 +4151,7 @@ issue_3821_2: {
expect_stdout: "PASS"
}

substitude: {
substitute: {
options = {
inline: true,
reduce_vars: true,
Expand Down Expand Up @@ -4189,8 +4189,7 @@ substitude: {
};
},
].forEach(function(g) {
console.log(g()(o));
console.log(g().call(o, o));
console.log(g()(o), g().call(o, o), g().length);
});
}
expect: {
Expand Down Expand Up @@ -4218,33 +4217,64 @@ substitude: {
};
},
].forEach(function(g) {
console.log(g()(o));
console.log(g().call(o, o));
console.log(g()(o), g().call(o, o), g().length);
});
}
expect_stdout: [
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS PASS 1",
"PASS PASS 1",
"PASS PASS 1",
"PASS PASS 1",
"PASS PASS 2",
]
}

substitute_add_farg: {
options = {
inline: true,
keep_fargs: "strict",
}
input: {
function f(g) {
console.log(g.length);
g(null, "FAIL");
}
f(function() {
return function(a, b) {
return function(c) {
do {
console.log("PASS");
} while (c);
}(a, b);
};
}());
}
expect: {
function f(g) {
console.log(g.length);
g(null, "FAIL");
}
f(function(c, argument_1) {
do {
console.log("PASS");
} while (c);
});
}
expect_stdout: [
"2",
"PASS",
]
}

substitude_arguments: {
substitute_arguments: {
options = {
inline: true,
reduce_vars: true,
toplevel: true,
}
input: {
var o = {};
function f() {
function f(a) {
return arguments[0] === o ? "PASS" : "FAIL";
}
[
Expand Down Expand Up @@ -4274,13 +4304,12 @@ substitude_arguments: {
};
},
].forEach(function(g) {
console.log(g()(o));
console.log(g().call(o, o));
console.log(g()(o), g().call(o, o), g().length);
});
}
expect: {
var o = {};
function f() {
function f(a) {
return arguments[0] === o ? "PASS" : "FAIL";
}
[
Expand Down Expand Up @@ -4310,25 +4339,19 @@ substitude_arguments: {
};
},
].forEach(function(g) {
console.log(g()(o));
console.log(g().call(o, o));
console.log(g()(o), g().call(o, o), g().length);
});
}
expect_stdout: [
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS PASS 1",
"PASS PASS 1",
"PASS PASS 1",
"PASS PASS 1",
"PASS PASS 2",
]
}

substitude_drop_fargs: {
substitute_drop_farg: {
options = {
inline: true,
keep_fargs: false,
Expand Down Expand Up @@ -4367,8 +4390,7 @@ substitude_drop_fargs: {
};
},
].forEach(function(g) {
console.log(g()(o));
console.log(g().call(o, o));
console.log(g()(o), g().call(o, o));
});
}
expect: {
Expand All @@ -4394,25 +4416,19 @@ substitude_drop_fargs: {
return f;
},
].forEach(function(g) {
console.log(g()(o));
console.log(g().call(o, o));
console.log(g()(o), g().call(o, o));
});
}
expect_stdout: [
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS PASS",
"PASS PASS",
"PASS PASS",
"PASS PASS",
"PASS PASS",
]
}

substitude_this: {
substitute_this: {
options = {
inline: true,
reduce_vars: true,
Expand Down Expand Up @@ -4450,8 +4466,7 @@ substitude_this: {
};
},
].forEach(function(g) {
console.log(g()(o));
console.log(g().call(o, o));
console.log(g()(o), g().call(o, o), g().length);
});
}
expect: {
Expand Down Expand Up @@ -4486,25 +4501,19 @@ substitude_this: {
};
},
].forEach(function(g) {
console.log(g()(o));
console.log(g().call(o, o));
console.log(g()(o), g().call(o, o), g().length);
});
}
expect_stdout: [
"false",
"true",
"false",
"false",
"false",
"false",
"false",
"false",
"false",
"false",
"false true 1",
"false false 1",
"false false 1",
"false false 1",
"false false 2",
]
}

substitude_use_strict: {
substitute_use_strict: {
options = {
inline: true,
reduce_vars: true,
Expand Down Expand Up @@ -4543,8 +4552,7 @@ substitude_use_strict: {
};
},
].forEach(function(g) {
console.log(g()(o));
console.log(g().call(o, o));
console.log(g()(o), g().call(o, o), g().length);
});
}
expect: {
Expand Down Expand Up @@ -4573,21 +4581,15 @@ substitude_use_strict: {
};
},
].forEach(function(g) {
console.log(g()(o));
console.log(g().call(o, o));
console.log(g()(o), g().call(o, o), g().length);
});
}
expect_stdout: [
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS",
"PASS PASS 1",
"PASS PASS 1",
"PASS PASS 1",
"PASS PASS 1",
"PASS PASS 2",
]
}

Expand Down Expand Up @@ -4637,3 +4639,24 @@ issue_3835: {
}
expect_stdout: true
}

issue_3836: {
options = {
inline: true,
}
input: {
(function() {
return function() {
for (var a in 0)
console.log(k);
}(console.log("PASS"));
})();
}
expect: {
(function() {
for (var a in 0)
console.log(k);
})(console.log("PASS"));
}
expect_stdout: "PASS"
}

0 comments on commit 0794aaa

Please sign in to comment.