From f46209b7e5ecb33d9596fb946975be5f65c0b727 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Thu, 22 Apr 2021 23:58:14 +0100 Subject: [PATCH] enhance `unsafe` `side_effects` (#4862) closes #4861 --- lib/compress.js | 8 ++++++-- test/compress/side_effects.js | 30 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 8ec9ab887c..fea4459bd1 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1638,7 +1638,7 @@ merge(Compressor.prototype, { return node instanceof AST_SymbolRef && node.definition().undeclared; } - 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"); + var global_names = makePredicate("Array Boolean clearInterval clearTimeout console Date decodeURI decodeURIComponent encodeURI encodeURIComponent Error escape eval EvalError Function isFinite isNaN JSON Map Math Number parseFloat parseInt RangeError ReferenceError RegExp Object Set setInterval setTimeout String SyntaxError TypeError unescape URIError WeakMap WeakSet"); AST_SymbolRef.DEFMETHOD("is_declared", function(compressor) { return this.defined || !this.definition().undeclared @@ -4800,10 +4800,14 @@ merge(Compressor.prototype, { }); var global_pure_fns = makePredicate("Boolean decodeURI decodeURIComponent Date encodeURI encodeURIComponent Error escape EvalError isFinite isNaN Number Object parseFloat parseInt RangeError ReferenceError String SyntaxError TypeError unescape URIError"); + var global_pure_constructors = makePredicate("Map Set WeakMap WeakSet"); AST_Call.DEFMETHOD("is_expr_pure", function(compressor) { if (compressor.option("unsafe")) { var expr = this.expression; - if (is_undeclared_ref(expr) && global_pure_fns[expr.name]) return true; + if (is_undeclared_ref(expr)) { + if (global_pure_fns[expr.name]) return true; + if (this instanceof AST_New && global_pure_constructors[expr.name]) return true; + } if (expr instanceof AST_Dot && is_undeclared_ref(expr.expression)) { var static_fn = static_fns[expr.expression.name]; return static_fn && (static_fn[expr.property] diff --git a/test/compress/side_effects.js b/test/compress/side_effects.js index 0e6a7442b9..63a6270367 100644 --- a/test/compress/side_effects.js +++ b/test/compress/side_effects.js @@ -198,6 +198,36 @@ global_fns: { ] } +global_constructors: { + options = { + side_effects: true, + unsafe: true, + } + input: { + Map; + new Map(console.log("foo")); + Set; + new Set(console.log("bar")); + WeakMap; + new WeakMap(console.log("baz")); + WeakSet; + new WeakSet(console.log("moo")); + } + expect: { + console.log("foo"); + console.log("bar"); + console.log("baz"); + console.log("moo"); + } + expect_stdout: [ + "foo", + "bar", + "baz", + "moo", + ] + node_version: ">=0.12" +} + unsafe_builtin_1: { options = { side_effects: true,