aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2017-03-08 03:31:51 +0800
committerGitHub <noreply@github.com>2017-03-08 03:31:51 +0800
commitbd6dee52abd607244d89f606a729e811a9b0b478 (patch)
treefc9cc388d3f8785f4616e1744156d6b90219169a
parent144052ca491144c65adc9d081b17ce100e3de59d (diff)
downloadtracifyjs-bd6dee52abd607244d89f606a729e811a9b0b478.tar.gz
tracifyjs-bd6dee52abd607244d89f606a729e811a9b0b478.zip
fix return from recursive IIFE (#1570)
`side-effects` did not account for IIFEs being able to reference itself thus making its return value potentially significant
-rw-r--r--lib/compress.js3
-rw-r--r--test/compress/issue-1569.js19
2 files changed, 21 insertions, 1 deletions
diff --git a/lib/compress.js b/lib/compress.js
index 8bbbc3f6..85b457e3 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -2100,7 +2100,8 @@ merge(Compressor.prototype, {
def(AST_This, return_null);
def(AST_Call, function(compressor, first_in_statement){
if (!this.has_pure_annotation(compressor) && compressor.pure_funcs(this)) {
- if (this.expression instanceof AST_Function) {
+ if (this.expression instanceof AST_Function
+ && (!this.expression.name || !this.expression.name.definition().references.length)) {
var node = this.clone();
node.expression = node.expression.process_expression(false);
return node;
diff --git a/test/compress/issue-1569.js b/test/compress/issue-1569.js
new file mode 100644
index 00000000..5f0bca34
--- /dev/null
+++ b/test/compress/issue-1569.js
@@ -0,0 +1,19 @@
+inner_reference: {
+ options = {
+ side_effects: true,
+ }
+ input: {
+ !function f(a) {
+ return a && f(a - 1) + a;
+ }(42);
+ !function g(a) {
+ return a;
+ }(42);
+ }
+ expect: {
+ !function f(a) {
+ return a && f(a - 1) + a;
+ }(42);
+ !void 0;
+ }
+}