@@ -1261,8 +1261,9 @@ Compressor.prototype.compress = function(node) {
12611261 });
12621262 def(AST_Dot, function(tw, descend) {
12631263 descend();
1264- var expr = this.expression;
1265- if (expr instanceof AST_SymbolRef) access(tw, expr.definition());
1264+ var node = this;
1265+ var expr = node.expression;
1266+ if (!node.optional && expr instanceof AST_SymbolRef) access(tw, expr.definition());
12661267 return true;
12671268 });
12681269 def(AST_For, function(tw, descend, compressor) {
@@ -1362,15 +1363,18 @@ Compressor.prototype.compress = function(node) {
13621363 pop_scope(tw, fn);
13631364 return true;
13641365 });
1365- def(AST_Sub, function(tw) {
1366+ def(AST_Sub, function(tw, descend ) {
13661367 var node = this;
1367- if (!node.optional) return;
13681368 var expr = node.expression;
1369- expr.walk(tw);
1370- if (expr instanceof AST_SymbolRef) access(tw, expr.definition());
1371- push(tw, true);
1372- node.property.walk(tw);
1373- pop(tw);
1369+ if (node.optional) {
1370+ expr.walk(tw);
1371+ push(tw, true);
1372+ node.property.walk(tw);
1373+ pop(tw);
1374+ } else {
1375+ descend();
1376+ if (expr instanceof AST_SymbolRef) access(tw, expr.definition());
1377+ }
13741378 return true;
13751379 });
13761380 def(AST_Switch, function(tw, descend, compressor) {
@@ -8020,8 +8024,14 @@ Compressor.prototype.compress = function(node) {
80208024 prop.walk(tw);
80218025 });
80228026 if (node instanceof AST_Assign) {
8023- var right = get_rhs(node), shared = false;
8024- if (init && node.write_only === true && !right.has_side_effects(compressor)) {
8027+ var fixed = sym.fixed_value();
8028+ var right = get_rhs(node);
8029+ var safe = fixed && fixed.is_constant();
8030+ var shared = false;
8031+ if (init
8032+ && node.write_only === true
8033+ && (safe || node.left === sym || right.equals(sym))
8034+ && !right.has_side_effects(compressor)) {
80258035 initializations.add(node_def.id, right);
80268036 } else {
80278037 right.walk(tw);
@@ -8031,11 +8041,8 @@ Compressor.prototype.compress = function(node) {
80318041 if (!node.write_only || shared) {
80328042 verify_safe_usage(node_def, sym, value_modified[node_def.id]);
80338043 }
8034- } else {
8035- var fixed = sym.fixed_value();
8036- if (!fixed || !fixed.is_constant()) {
8037- verify_safe_usage(node_def, value_read[node_def.id], true);
8038- }
8044+ } else if (!safe) {
8045+ verify_safe_usage(node_def, value_read[node_def.id], true);
80398046 }
80408047 }
80418048 if (track_assigns(node_def, sym) && is_lhs(sym, node) !== sym) add_assigns(node_def, sym);
0 commit comments