retain (1,eval) as is when it's the expression of an AST_Call
authorMihai Bazon <mihai@bazon.net>
Sat, 17 Nov 2012 10:05:31 +0000 (12:05 +0200)
committerMihai Bazon <mihai@bazon.net>
Sat, 17 Nov 2012 10:05:31 +0000 (12:05 +0200)
otherwise we change the meaning of eval from global to lexical.

lib/compress.js

index 66375be..7c4c910 100644 (file)
@@ -1549,8 +1549,19 @@ merge(Compressor.prototype, {
     OPT(AST_Seq, function(self, compressor){
         if (!compressor.option("side_effects"))
             return self;
-        if (!self.car.has_side_effects())
-            return self.cdr;
+        if (!self.car.has_side_effects()) {
+            // 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)) {
+                return self.cdr;
+            }
+        }
         if (compressor.option("cascade")) {
             if (self.car instanceof AST_Assign
                 && !self.car.left.has_side_effects()