preserve constant modification under strict mode (#2717)

This commit is contained in:
Alex Lam S.L
2018-01-04 15:53:53 +08:00
committed by GitHub
parent 9b58b54e2d
commit 7a6d452b54
2 changed files with 57 additions and 1 deletions

View File

@@ -3279,7 +3279,12 @@ merge(Compressor.prototype, {
}); });
def(AST_Assign, function(compressor){ def(AST_Assign, function(compressor){
var left = this.left; var left = this.left;
if (left.has_side_effects(compressor)) return this; if (left.has_side_effects(compressor)
|| compressor.has_directive("use strict")
&& left instanceof AST_PropAccess
&& left.expression.is_constant()) {
return this;
}
this.write_only = true; this.write_only = true;
while (left instanceof AST_PropAccess) { while (left instanceof AST_PropAccess) {
left = left.expression; left = left.expression;

View File

@@ -348,6 +348,57 @@ set_immutable_4: {
expect_stdout: true expect_stdout: true
} }
set_immutable_5: {
options = {
collapse_vars: true,
conditionals: true,
evaluate: true,
pure_getters: "strict",
reduce_funcs: true,
reduce_vars: true,
side_effects: true,
toplevel: true,
unused: true,
}
input: {
"use strict";
var a = 1;
a.foo += "";
if (a.foo) console.log("FAIL");
else console.log("PASS");
}
expect: {
"use strict";
1..foo += "";
1..foo ? console.log("FAIL") : console.log("PASS");
}
expect_stdout: true
}
set_immutable_6: {
options = {
collapse_vars: true,
conditionals: true,
evaluate: true,
pure_getters: "strict",
reduce_funcs: true,
reduce_vars: true,
side_effects: true,
toplevel: true,
unused: true,
}
input: {
var a = 1;
a.foo += "";
if (a.foo) console.log("FAIL");
else console.log("PASS");
}
expect: {
1..foo ? console.log("FAIL") : console.log("PASS");
}
expect_stdout: true
}
set_mutable_1: { set_mutable_1: {
options = { options = {
collapse_vars: true, collapse_vars: true,