aboutsummaryrefslogtreecommitdiff
path: root/lib/compress.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/compress.js')
-rw-r--r--lib/compress.js100
1 files changed, 58 insertions, 42 deletions
diff --git a/lib/compress.js b/lib/compress.js
index c556c492..103f47f1 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -6171,6 +6171,7 @@ merge(Compressor.prototype, {
if (var_decl <= 1) hoist_vars = false;
}
if (!hoist_funs && !hoist_vars) return;
+ var consts = Object.create(null);
var dirs = [];
var hoisted = [];
var vars = new Dictionary(), vars_found = 0;
@@ -6186,6 +6187,12 @@ merge(Compressor.prototype, {
return make_node(AST_EmptyStatement, node);
}
if (hoist_vars && node instanceof AST_Var) {
+ if (!all(node.definitions, function(defn) {
+ var sym = defn.name;
+ return sym instanceof AST_SymbolVar
+ && !consts[sym.name]
+ && self.find_variable(sym.name) === sym.definition();
+ })) return node;
node.definitions.forEach(function(def) {
vars.set(def.name.name, def);
++vars_found;
@@ -6204,6 +6211,10 @@ merge(Compressor.prototype, {
});
}
if (node instanceof AST_Scope) return node;
+ if (node instanceof AST_SymbolConst) {
+ consts[node.name] = true;
+ return node;
+ }
});
self.transform(tt);
if (vars_found > 0) {
@@ -6224,48 +6235,7 @@ merge(Compressor.prototype, {
});
if (defs.length > 0) {
// try to merge in assignments
- for (var i = 0; i < self.body.length;) {
- if (self.body[i] instanceof AST_SimpleStatement) {
- var expr = self.body[i].body, sym, assign;
- if (expr instanceof AST_Assign
- && expr.operator == "="
- && (sym = expr.left) instanceof AST_Symbol
- && vars.has(sym.name))
- {
- var def = vars.get(sym.name);
- if (def.value) break;
- def.value = expr.right;
- remove(defs, def);
- defs.push(def);
- self.body.splice(i, 1);
- continue;
- }
- if (expr instanceof AST_Sequence
- && (assign = expr.expressions[0]) instanceof AST_Assign
- && assign.operator == "="
- && (sym = assign.left) instanceof AST_Symbol
- && vars.has(sym.name))
- {
- var def = vars.get(sym.name);
- if (def.value) break;
- def.value = assign.right;
- remove(defs, def);
- defs.push(def);
- self.body[i].body = make_sequence(expr, expr.expressions.slice(1));
- continue;
- }
- }
- if (self.body[i] instanceof AST_EmptyStatement) {
- self.body.splice(i, 1);
- continue;
- }
- if (self.body[i] instanceof AST_BlockStatement) {
- var tmp = [ i, 1 ].concat(self.body[i].body);
- self.body.splice.apply(self.body, tmp);
- continue;
- }
- break;
- }
+ insert_vars(self.body);
defs = make_node(AST_Var, self, {
definitions: defs
});
@@ -6273,6 +6243,50 @@ merge(Compressor.prototype, {
}
}
self.body = dirs.concat(hoisted, self.body);
+
+ function insert_vars(body) {
+ while (body.length) {
+ var stat = body[0];
+ if (stat instanceof AST_SimpleStatement) {
+ var expr = stat.body, sym, assign;
+ if (expr instanceof AST_Assign
+ && expr.operator == "="
+ && (sym = expr.left) instanceof AST_Symbol
+ && vars.has(sym.name)) {
+ var def = vars.get(sym.name);
+ if (def.value) break;
+ def.value = expr.right;
+ remove(defs, def);
+ defs.push(def);
+ body.shift();
+ continue;
+ }
+ if (expr instanceof AST_Sequence
+ && (assign = expr.expressions[0]) instanceof AST_Assign
+ && assign.operator == "="
+ && (sym = assign.left) instanceof AST_Symbol
+ && vars.has(sym.name)) {
+ var def = vars.get(sym.name);
+ if (def.value) break;
+ def.value = assign.right;
+ remove(defs, def);
+ defs.push(def);
+ stat.body = make_sequence(expr, expr.expressions.slice(1));
+ continue;
+ }
+ }
+ if (stat instanceof AST_EmptyStatement) {
+ body.shift();
+ continue;
+ }
+ if (stat instanceof AST_BlockStatement && !insert_vars(stat.body)) {
+ body.shift();
+ continue;
+ }
+ break;
+ }
+ return body.length;
+ }
});
function scan_local_returns(fn, transform) {
@@ -9352,6 +9366,8 @@ merge(Compressor.prototype, {
scope.inlined = true;
} while (scope = scope.parent_scope);
}
+ } else if (fixed.name && fixed.name.name == "await" && is_async(fixed)) {
+ single_use = false;
}
if (single_use) fixed.parent_scope = self.scope;
} else if (!fixed || !fixed.is_constant_expression()) {