aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/compress.js9
-rw-r--r--test/compress/const.js46
-rw-r--r--test/ufuzz/index.js35
3 files changed, 70 insertions, 20 deletions
diff --git a/lib/compress.js b/lib/compress.js
index e36fcaa7..5dd10c6c 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -485,9 +485,10 @@ merge(Compressor.prototype, {
}
function safe_to_assign(tw, def, declare) {
- if (def.fixed === undefined) return declare || all(def.orig, function(sym) {
+ if (!(declare || all(def.orig, function(sym) {
return !(sym instanceof AST_SymbolConst);
- });
+ }))) return false;
+ if (def.fixed === undefined) return true;
if (def.fixed === null && def.safe_ids) {
def.safe_ids[def.id] = false;
delete def.safe_ids;
@@ -8557,7 +8558,9 @@ merge(Compressor.prototype, {
]).optimize(compressor);
}
}
- } else if (self.left instanceof AST_SymbolRef) {
+ } else if (self.left instanceof AST_SymbolRef && all(self.left.definition().orig, function(sym) {
+ return !(sym instanceof AST_SymbolConst);
+ })) {
var parent;
if (self.operator == "=" && self.left.equivalent_to(self.right)
&& !((parent = compressor.parent()) instanceof AST_UnaryPrefix && parent.operator == "delete")) {
diff --git a/test/compress/const.js b/test/compress/const.js
index b161e876..4411cbf8 100644
--- a/test/compress/const.js
+++ b/test/compress/const.js
@@ -963,3 +963,49 @@ issue_4210: {
}
expect_stdout: true
}
+
+issue_4212_1: {
+ options = {
+ dead_code: true,
+ }
+ input: {
+ console.log({
+ get b() {
+ const a = 0;
+ return a /= 0;
+ }
+ }.b);
+ }
+ expect: {
+ console.log({
+ get b() {
+ const a = 0;
+ return a /= 0;
+ }
+ }.b);
+ }
+ expect_stdout: true
+}
+
+issue_4212_2: {
+ options = {
+ reduce_vars: true,
+ }
+ input: {
+ console.log({
+ get b() {
+ const a = 0;
+ return a /= 0;
+ }
+ }.b);
+ }
+ expect: {
+ console.log({
+ get b() {
+ const a = 0;
+ return a /= 0;
+ }
+ }.b);
+ }
+ expect_stdout: true
+}
diff --git a/test/ufuzz/index.js b/test/ufuzz/index.js
index 3e2d865d..e650a46f 100644
--- a/test/ufuzz/index.js
+++ b/test/ufuzz/index.js
@@ -899,21 +899,22 @@ function getDotKey(assign) {
function createAccessor(recurmax, stmtDepth, canThrow) {
var namesLenBefore = VAR_NAMES.length;
var s;
- var prop1 = getDotKey();
- if (rng(2) == 0) {
- s = [
- "get " + prop1 + "(){",
- strictMode(),
- createStatements(2, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth),
- createStatement(recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth, STMT_RETURN_ETC),
- "},"
- ];
- } else {
- var prop2;
- do {
- prop2 = getDotKey();
- } while (prop1 == prop2);
- createBlockVariables(recurmax, stmtDepth, canThrow, function(defns) {
+ createBlockVariables(recurmax, stmtDepth, canThrow, function(defns) {
+ var prop1 = getDotKey();
+ if (rng(2) == 0) {
+ s = [
+ "get " + prop1 + "(){",
+ strictMode(),
+ defns(),
+ _createStatements(2, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth),
+ createStatement(recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth, STMT_RETURN_ETC),
+ "},"
+ ];
+ } else {
+ var prop2;
+ do {
+ prop2 = getDotKey();
+ } while (prop1 == prop2);
s = [
"set " + prop1 + "(" + createVarName(MANDATORY) + "){",
strictMode(),
@@ -922,8 +923,8 @@ function createAccessor(recurmax, stmtDepth, canThrow) {
"this." + prop2 + createAssignment() + _createBinaryExpr(recurmax, COMMA_OK, stmtDepth, canThrow) + ";",
"},"
];
- });
- }
+ }
+ });
VAR_NAMES.length = namesLenBefore;
return filterDirective(s).join("\n");
}