From 6768e6578f0e39389fc6499ddf2b7282e3621d7c Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Tue, 26 Nov 2019 01:51:04 +0800 Subject: [PATCH] inline functions with directives more effectively (#3604) --- lib/compress.js | 12 ++++++++++-- test/compress/functions.js | 26 ++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index c195c423..79bf99b2 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -2724,6 +2724,14 @@ merge(Compressor.prototype, { }); } + AST_Lambda.DEFMETHOD("first_statement", function() { + var body = this.body; + for (var i = 0; i < body.length; i++) { + var stat = body[i]; + if (!(stat instanceof AST_Directive)) return stat; + } + }); + function try_evaluate(compressor, node) { var ev = node.evaluate(compressor); if (ev === node) return node; @@ -3098,7 +3106,7 @@ merge(Compressor.prototype, { if (fn instanceof AST_Lambda) { if (fn.evaluating) return this; if (fn.name && fn.name.definition().recursive_refs > 0) return this; - var stat = fn.body[0]; + var stat = fn.first_statement(); if (!(stat instanceof AST_Return)) return this; var args = eval_args(this.args); if (!args) return this; @@ -5363,7 +5371,7 @@ merge(Compressor.prototype, { } } } - var stat = is_func && fn.body[0]; + var stat = is_func && fn.first_statement(); var can_inline = compressor.option("inline") && !self.is_expr_pure(compressor); if (exp === fn && can_inline && stat instanceof AST_Return) { var value = stat.value; diff --git a/test/compress/functions.js b/test/compress/functions.js index 2af14a62..4f3139b1 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -3568,3 +3568,29 @@ pr_3592_2: { } expect_stdout: "PASS" } + +inline_use_strict: { + options = { + evaluate: true, + inline: true, + reduce_vars: true, + sequences: true, + side_effects: true, + unused: true, + } + input: { + console.log(function() { + "use strict"; + return function() { + "use strict"; + var a = "foo"; + a += "bar"; + return a; + }; + }()()); + } + expect: { + console.log("foobar"); + } + expect_stdout: "foobar" +} -- 2.34.1