From 10ca578ee57a0630c2b59d3da9b2c6e5ec6d476a Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Wed, 3 Mar 2021 01:18:02 +0000 Subject: [PATCH] fix corner case in `inline` (#4726) fixes #4725 --- lib/ast.js | 2 ++ lib/compress.js | 6 ++++- test/compress/classes.js | 54 ++++++++++++++++++++++++++++++++++++++ test/compress/functions.js | 54 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 115 insertions(+), 1 deletion(-) diff --git a/lib/ast.js b/lib/ast.js index b035b5c7..e46fb2e3 100644 --- a/lib/ast.js +++ b/lib/ast.js @@ -1684,6 +1684,8 @@ var AST_ObjectMethod = DEFNODE("ObjectMethod", null, { $documentation: "A key(){} object property", _validate: function() { if (!(this.value instanceof AST_LambdaExpression)) throw new Error("value must be AST_LambdaExpression"); + if (is_arrow(this.value)) throw new Error("value cannot be AST_Arrow or AST_AsyncArrow"); + if (this.value.name != null) throw new Error("name of class method's lambda must be null"); }, }, AST_ObjectKeyVal); diff --git a/lib/compress.js b/lib/compress.js index 55ff50be..1b22d861 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -5210,6 +5210,7 @@ merge(Compressor.prototype, { OPT(AST_Function, function(self, compressor) { drop_rest_farg(self, compressor); self.body = tighten_body(self.body, compressor); + var parent = compressor.parent(); if (compressor.option("inline")) for (var i = 0; i < self.body.length; i++) { var stat = self.body[i]; if (stat instanceof AST_Directive) continue; @@ -5231,6 +5232,9 @@ merge(Compressor.prototype, { return def.scope !== self; })) break; } + if (fn.name + && (parent instanceof AST_ClassMethod || parent instanceof AST_ObjectMethod) + && parent.value === compressor.self()) break; if (fn.contains_this()) break; var len = fn.argnames.length; if (len > 0 && compressor.option("inline") < 2) break; @@ -5251,7 +5255,7 @@ merge(Compressor.prototype, { if (call.args[j].has_side_effects(compressor)) break; } if (j < call.args.length) break; - if (len < self.argnames.length && !compressor.drop_fargs(self, compressor.parent())) { + if (len < self.argnames.length && !compressor.drop_fargs(self, parent)) { if (!compressor.drop_fargs(fn, call)) break; do { fn.argnames.push(fn.make_var(AST_SymbolFunarg, fn, "argument_" + len)); diff --git a/test/compress/classes.js b/test/compress/classes.js index f073acd4..82c6f30e 100644 --- a/test/compress/classes.js +++ b/test/compress/classes.js @@ -1172,3 +1172,57 @@ issue_4722_3: { expect_stdout: "PASS" node_version: ">=10" } + +issue_4725_1: { + options = { + inline: true, + } + input: { + "use strict"; + console.log(typeof new class { + f() { + return function g() { + return g; + }(); + } + }().f()); + } + expect: { + "use strict"; + console.log(typeof new class { + f() { + return function g() { + return g; + }(); + } + }().f()); + } + expect_stdout: "function" + node_version: ">=4" +} + +issue_4725_2: { + options = { + inline: true, + } + input: { + "use strict"; + new class { + f() { + return function() { + while (console.log("PASS")); + }(); + } + }().f(); + } + expect: { + "use strict"; + new class { + f() { + while (console.log("PASS")); + } + }().f(); + } + expect_stdout: "PASS" + node_version: ">=4" +} diff --git a/test/compress/functions.js b/test/compress/functions.js index 44e41dff..98dfc4d8 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -5698,3 +5698,57 @@ block_scope_4_compress: { } expect_stdout: "function" } + +issue_4725_1: { + options = { + inline: true, + } + input: { + var o = { + f() { + return function g() { + return g; + }(); + } + }; + console.log(typeof o.f()); + } + expect: { + var o = { + f() { + return function g() { + return g; + }(); + } + }; + console.log(typeof o.f()); + } + expect_stdout: "function" + node_version: ">=4" +} + +issue_4725_2: { + options = { + inline: true, + } + input: { + var o = { + f() { + return function() { + while (console.log("PASS")); + }(); + } + }; + o.f(); + } + expect: { + var o = { + f() { + while (console.log("PASS")); + } + }; + o.f(); + } + expect_stdout: "PASS" + node_version: ">=4" +} -- 2.34.1