add `Date` and other known globals to `unsafe` compress option (#2302)
authorkzc <kzc@users.noreply.github.com>
Wed, 6 Sep 2017 18:44:26 +0000 (14:44 -0400)
committerAlex Lam S.L <alexlamsl@gmail.com>
Wed, 6 Sep 2017 18:44:26 +0000 (02:44 +0800)
lib/compress.js
test/compress/dead-code.js

index 6e766fb..3da7a31 100644 (file)
@@ -693,7 +693,7 @@ merge(Compressor.prototype, {
         return node instanceof AST_SymbolRef && node.definition().undeclared;
     }
 
-    var global_names = makePredicate("Array Boolean console Error Function Math Number RegExp Object String");
+    var global_names = makePredicate("Array Boolean clearInterval clearTimeout console Date decodeURI decodeURIComponent encodeURI encodeURIComponent Error escape eval EvalError Function isFinite isNaN JSON Math Number parseFloat parseInt RangeError ReferenceError RegExp Object setInterval setTimeout String SyntaxError TypeError unescape URIError");
     AST_SymbolRef.DEFMETHOD("is_declared", function(compressor) {
         return !this.definition().undeclared
             || compressor.option("unsafe") && global_names(this.name);
index abf5297..aea0e54 100644 (file)
@@ -241,18 +241,54 @@ issue_2233_1: {
         Array.isArray;
         Boolean;
         console.log;
+        Date;
+        decodeURI;
+        decodeURIComponent;
+        encodeURI;
+        encodeURIComponent;
         Error.name;
+        escape;
+        eval;
+        EvalError;
         Function.length;
+        isFinite;
+        isNaN;
+        JSON;
         Math.random;
         Number.isNaN;
+        parseFloat;
+        parseInt;
         RegExp;
         Object.defineProperty;
         String.fromCharCode;
+        RangeError;
+        ReferenceError;
+        SyntaxError;
+        TypeError;
+        unescape;
+        URIError;
     }
     expect: {}
     expect_stdout: true
 }
 
+global_timeout_and_interval_symbols: {
+    options = {
+        pure_getters: "strict",
+        side_effects: true,
+        unsafe: true,
+    }
+    input: {
+        // These global symbols do not exist in the test sandbox
+        // and must be tested separately.
+        clearInterval;
+        clearTimeout;
+        setInterval;
+        setTimeout;
+    }
+    expect: {}
+}
+
 issue_2233_2: {
     options = {
         pure_getters: "strict",