Don't change sequences that influence lexical binding in calls
authorRichard van Velzen <rvanvelzen@experty.com>
Tue, 25 Aug 2015 08:53:35 +0000 (10:53 +0200)
committerRichard van Velzen <rvanvelzen@experty.com>
Tue, 25 Aug 2015 08:53:35 +0000 (10:53 +0200)
Fixes #782

lib/compress.js
test/compress/issue-782.js [new file with mode: 0644]

index ac306fc..51dd66f 100644 (file)
@@ -1910,15 +1910,11 @@ merge(Compressor.prototype, {
         if (!compressor.option("side_effects"))
             return self;
         if (!self.car.has_side_effects(compressor)) {
-            // we shouldn't compress (1,eval)(something) to
-            // eval(something) because that changes the meaning of
-            // eval (becomes lexical instead of global).
-            var p;
-            if (!(self.cdr instanceof AST_SymbolRef
-                  && self.cdr.name == "eval"
-                  && self.cdr.undeclared()
-                  && (p = compressor.parent()) instanceof AST_Call
-                  && p.expression === self)) {
+            // we shouldn't compress (1,func)(something) to
+            // func(something) because that changes the meaning of
+            // the func (becomes lexical instead of global).
+            var p = compressor.parent();
+            if (!(p instanceof AST_Call && p.expression === self)) {
                 return self.cdr;
             }
         }
diff --git a/test/compress/issue-782.js b/test/compress/issue-782.js
new file mode 100644 (file)
index 0000000..cce15fd
--- /dev/null
@@ -0,0 +1,23 @@
+remove_redundant_sequence_items: {
+    options = { side_effects: true };
+    input: {
+        (0, 1, logThis)();
+        (0, 1, _decorators.logThis)();
+    }
+    expect: {
+        (0, logThis)();
+        (0, _decorators.logThis)();
+    }
+}
+
+dont_remove_lexical_binding_sequence: {
+    options = { side_effects: true };
+    input: {
+        (0, logThis)();
+        (0, _decorators.logThis)();
+    }
+    expect: {
+        (0, logThis)();
+        (0, _decorators.logThis)();
+    }
+}