From ad3a331ca3ebb27724e56b30caff5e9dd1af7675 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Wed, 1 Jun 2022 19:42:39 +0100 Subject: [PATCH] fix corner case in `collapse_vars` (#5482) fixes #5481 --- lib/compress.js | 7 +++++++ test/compress/classes.js | 30 ++++++++++++++++++++++++++++++ test/ufuzz/index.js | 2 +- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/lib/compress.js b/lib/compress.js index b0da1b5e..26964c8b 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -2466,6 +2466,13 @@ Compressor.prototype.compress = function(node) { abort = false; return true; } + if (node instanceof AST_Class) { + if (!in_try) return false; + var base = node.extends; + if (!base) return false; + if (base instanceof AST_SymbolRef) base = base.fixed_value(); + return !safe_for_extends(base); + } if (node instanceof AST_Exit) { if (in_try) { if (in_try.bfinally) return true; diff --git a/test/compress/classes.js b/test/compress/classes.js index a54075de..e42512cb 100644 --- a/test/compress/classes.js +++ b/test/compress/classes.js @@ -2852,3 +2852,33 @@ issue_5436: { expect_stdout: "PASS" node_version: ">=12" } + +issue_5481: { + options = { + collapse_vars: true, + } + input: { + "use strict"; + var a = "FAIL 1", log = console.log; + try { + a = "PASS"; + (class extends 42 {}); + log("FAIL 2", a); + } catch (e) { + log(a); + } + } + expect: { + "use strict"; + var a = "FAIL 1", log = console.log; + try { + a = "PASS"; + (class extends 42 {}); + log("FAIL 2", a); + } catch (e) { + log(a); + } + } + expect_stdout: "PASS" + node_version: ">=4" +} diff --git a/test/ufuzz/index.js b/test/ufuzz/index.js index 49971309..50d6a531 100644 --- a/test/ufuzz/index.js +++ b/test/ufuzz/index.js @@ -2398,7 +2398,7 @@ function patch_try_catch(orig, toplevel) { "throw " + match[1] + ";", ].join("\n"); } - var new_code = code.slice(0, index) + insert + code.slice(index) + tail_throw; + var new_code = code.slice(0, index) + insert + code.slice(index) + tail_throw + "var UFUZZ_ERROR;"; var result = run_code(new_code, toplevel); if (!sandbox.is_error(result)) { if (!stack.filled && match[1]) stack.push({