@@ -2143,12 +2143,16 @@ Compressor.prototype.compress = function(node) {
2143
2143
if (sequencesize_2(statements, compressor)) changed = 7;
2144
2144
if (!changed && last_changed == 7) break;
2145
2145
}
2146
- if (compressor.option("join_vars ")) {
2147
- if (join_consecutive_vars (statements)) changed = 8;
2146
+ if (compressor.option("arrows") && compressor.option("module ")) {
2147
+ if (arrowify (statements)) changed = 8;
2148
2148
if (!changed && last_changed == 8) break;
2149
2149
}
2150
+ if (compressor.option("join_vars")) {
2151
+ if (join_consecutive_vars(statements)) changed = 9;
2152
+ if (!changed && last_changed == 9) break;
2153
+ }
2150
2154
if (compressor.option("collapse_vars")) {
2151
- if (collapse(statements, compressor)) changed = 9 ;
2155
+ if (collapse(statements, compressor)) changed = 10 ;
2152
2156
}
2153
2157
} while (changed && max_iter-- > 0);
2154
2158
return statements;
@@ -4253,6 +4257,48 @@ Compressor.prototype.compress = function(node) {
4253
4257
}
4254
4258
}
4255
4259
4260
+ function arrowify(statements) {
4261
+ var changed = false, defns = [], len = 0;
4262
+ statements.forEach(function(stat) {
4263
+ var def;
4264
+ if ((stat instanceof AST_AsyncDefun || stat instanceof AST_Defun)
4265
+ && !stat.uses_arguments
4266
+ && !stat.pinned()
4267
+ && (def = stat.name.definition()).escaped
4268
+ && def.escaped.depth != 1
4269
+ && !compressor.exposed(def)
4270
+ && !stat.contains_this()) {
4271
+ var name = make_node(AST_SymbolVar, stat.name);
4272
+ var arrow = make_node(is_async(stat) ? AST_AsyncArrow : AST_Arrow, stat);
4273
+ arrow.init_vars(stat.parent_scope, stat);
4274
+ arrow.variables.del("arguments");
4275
+ var defn = make_node(AST_VarDef, stat, {
4276
+ name: name,
4277
+ value: arrow,
4278
+ });
4279
+ defns.push(defn);
4280
+ def.orig.push(name);
4281
+ def.eliminated++;
4282
+ if (def.fixed) {
4283
+ var fixed = function() {
4284
+ return defn.value;
4285
+ };
4286
+ fixed.assigns = [ defn ];
4287
+ if (def.fixed === stat) def.fixed = fixed;
4288
+ def.references.forEach(function(node) {
4289
+ if (node.fixed === stat) node.fixed = fixed;
4290
+ });
4291
+ }
4292
+ changed = true;
4293
+ } else {
4294
+ statements[len++] = stat;
4295
+ }
4296
+ });
4297
+ statements.length = len;
4298
+ if (defns.length > 0) statements.unshift(make_node(AST_Var, compressor.self(), { definitions: defns }));
4299
+ return changed;
4300
+ }
4301
+
4256
4302
function extract_exprs(body) {
4257
4303
if (body instanceof AST_Assign) return [ body ];
4258
4304
if (body instanceof AST_Sequence) return body.expressions.slice();
@@ -11139,7 +11185,7 @@ Compressor.prototype.compress = function(node) {
11139
11185
&& !exp.uses_arguments
11140
11186
&& !exp.pinned()
11141
11187
&& !exp.contains_this()) {
11142
- var arrow = make_node(is_async(exp) ? AST_AsyncArrow : AST_Arrow, exp, exp );
11188
+ var arrow = make_node(is_async(exp) ? AST_AsyncArrow : AST_Arrow, exp);
11143
11189
arrow.init_vars(exp.parent_scope, exp);
11144
11190
arrow.variables.del("arguments");
11145
11191
self.expression = arrow.transform(compressor);
@@ -12808,50 +12854,49 @@ Compressor.prototype.compress = function(node) {
12808
12854
var value;
12809
12855
if (def.recursive_refs > 0) {
12810
12856
value = fixed.clone(true);
12811
- var defun_def = value.name.definition();
12812
- var lambda_def = value.variables.get(value.name.name);
12857
+ var lambda_def = value.variables.get(self.name);
12813
12858
var name = lambda_def && lambda_def.orig[0];
12814
12859
var def_fn_name, symbol_type;
12815
12860
if (value instanceof AST_Class) {
12816
12861
def_fn_name = "def_function";
12817
12862
symbol_type = AST_SymbolClass;
12818
12863
} else {
12819
12864
def_fn_name = "def_variable";
12820
- symbol_type = AST_SymbolLambda;
12865
+ symbol_type = value.name ? AST_SymbolLambda : AST_SymbolVar ;
12821
12866
}
12822
12867
if (!(name instanceof symbol_type)) {
12823
12868
name = make_node(symbol_type, value.name);
12824
12869
name.scope = value;
12825
- value.name = name;
12870
+ if (value.name) value.name = name;
12826
12871
lambda_def = value[def_fn_name](name);
12827
12872
lambda_def.recursive_refs = def.recursive_refs;
12828
12873
}
12829
12874
value.walk(new TreeWalker(function(node) {
12830
12875
if (node instanceof AST_SymbolDeclaration) {
12831
12876
if (node !== name) {
12832
- var def = node.definition();
12833
- def .orig.push(node);
12834
- def .eliminated++;
12877
+ var d = node.definition();
12878
+ d .orig.push(node);
12879
+ d .eliminated++;
12835
12880
}
12836
12881
return;
12837
12882
}
12838
12883
if (!(node instanceof AST_SymbolRef)) return;
12839
- var def = node.definition();
12840
- if (def === defun_def ) {
12841
- node.thedef = def = lambda_def;
12884
+ var d = node.definition();
12885
+ if (d === def ) {
12886
+ node.thedef = d = lambda_def;
12842
12887
} else {
12843
- def .single_use = false;
12888
+ d .single_use = false;
12844
12889
var fn = node.fixed_value();
12845
12890
if (is_lambda(fn)
12846
12891
&& fn.name
12847
- && fn.name.definition() === def
12848
- && def .scope === fn.name.scope
12849
- && fixed.variables.get(fn.name.name) === def ) {
12892
+ && fn.name.definition() === d
12893
+ && d .scope === fn.name.scope
12894
+ && fixed.variables.get(fn.name.name) === d ) {
12850
12895
fn.name = fn.name.clone();
12851
- node.thedef = def = value.variables.get(fn.name.name) || value[def_fn_name](fn.name);
12896
+ node.thedef = d = value.variables.get(fn.name.name) || value[def_fn_name](fn.name);
12852
12897
}
12853
12898
}
12854
- def .references.push(node);
12899
+ d .references.push(node);
12855
12900
}));
12856
12901
} else {
12857
12902
if (fixed instanceof AST_Scope) {
0 commit comments