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