workaround bug in ECMAScript specification (#4656)

closes #4655
This commit is contained in:
Alex Lam S.L
2021-02-16 15:39:06 +00:00
committed by GitHub
parent fa8aa204a0
commit 6a2bda52f3
2 changed files with 34 additions and 5 deletions

View File

@@ -5017,20 +5017,22 @@ merge(Compressor.prototype, {
return self; return self;
}); });
function trim_block(node, in_list) { function trim_block(node, parent, in_list) {
switch (node.body.length) { switch (node.body.length) {
case 0: case 0:
return in_list ? List.skip : make_node(AST_EmptyStatement, node); return in_list ? List.skip : make_node(AST_EmptyStatement, node);
case 1: case 1:
var stat = node.body[0]; var stat = node.body[0];
if (!(stat instanceof AST_Const || stat instanceof AST_Let)) return stat; if (stat instanceof AST_Const || stat instanceof AST_Let) return node;
if (parent instanceof AST_IterationStatement && stat instanceof AST_LambdaDefinition) return node;
return stat;
} }
return node; return node;
} }
OPT(AST_BlockStatement, function(self, compressor) { OPT(AST_BlockStatement, function(self, compressor) {
self.body = tighten_body(self.body, compressor); self.body = tighten_body(self.body, compressor);
return trim_block(self); return trim_block(self, compressor.parent());
}); });
function drop_rest_farg(fn, compressor) { function drop_rest_farg(fn, compressor) {
@@ -6123,7 +6125,7 @@ merge(Compressor.prototype, {
} }
}, function(node, in_list) { }, function(node, in_list) {
if (node instanceof AST_BlockStatement) { if (node instanceof AST_BlockStatement) {
return trim_block(node, in_list); return trim_block(node, tt.parent(), in_list);
} else if (node instanceof AST_For) { } else if (node instanceof AST_For) {
// Certain combination of unused name + side effect leads to invalid AST: // Certain combination of unused name + side effect leads to invalid AST:
// https://github.com/mishoo/UglifyJS/issues/44 // https://github.com/mishoo/UglifyJS/issues/44
@@ -7282,7 +7284,7 @@ merge(Compressor.prototype, {
break; break;
} }
} }
self.body = trim_block(self.body); self.body = trim_block(self.body, compressor.parent());
} }
if (self.body instanceof AST_EmptyStatement) return make_node(AST_For, self, self).optimize(compressor); if (self.body instanceof AST_EmptyStatement) return make_node(AST_For, self, self).optimize(compressor);
if (self.body instanceof AST_SimpleStatement) return make_node(AST_For, self, { if (self.body instanceof AST_SimpleStatement) return make_node(AST_For, self, {

View File

@@ -5409,3 +5409,30 @@ issue_4612_4: {
} }
expect_stdout: "undefined" expect_stdout: "undefined"
} }
issue_4655: {
options = {
functions: true,
loops: true,
reduce_vars: true,
side_effects: true,
unused: true,
}
input: {
(function f() {
while (console.log("PASS")) {
var g = function() {};
for (var a in g)
g();
}
})();
}
expect: {
(function() {
for (; console.log("PASS");) {
function g() {};
}
})();
}
expect_stdout: "PASS"
}