minor consolidations (#2484)

- unique symbol generation
- `unsafe` on `AST_Call`
This commit is contained in:
Alex Lam S.L
2017-11-16 04:37:37 +08:00
committed by GitHub
parent fa7a7c5c5a
commit ebe761cad0

View File

@@ -2778,18 +2778,29 @@ merge(Compressor.prototype, {
return self; return self;
}); });
AST_Scope.DEFMETHOD("make_var_name", function(prefix) {
var var_names = this.var_names;
if (!var_names) {
this.var_names = var_names = Object.create(null);
this.enclosed.forEach(function(def) {
var_names[def.name] = true;
});
this.variables.each(function(def, name) {
var_names[name] = true;
});
}
prefix = prefix.replace(/[^a-z_$]+/ig, "_");
var name = prefix;
for (var i = 0; var_names[name]; i++) name = prefix + "$" + i;
var_names[name] = true;
return name;
});
AST_Scope.DEFMETHOD("hoist_properties", function(compressor){ AST_Scope.DEFMETHOD("hoist_properties", function(compressor){
var self = this; var self = this;
if (!compressor.option("hoist_props") || compressor.has_directive("use asm")) return self; if (!compressor.option("hoist_props") || compressor.has_directive("use asm")) return self;
var top_retain = self instanceof AST_Toplevel && compressor.top_retain || return_false; var top_retain = self instanceof AST_Toplevel && compressor.top_retain || return_false;
var defs_by_id = Object.create(null); var defs_by_id = Object.create(null);
var var_names = Object.create(null);
self.enclosed.forEach(function(def) {
var_names[def.name] = true;
});
self.variables.each(function(def, name) {
var_names[name] = true;
});
return self.transform(new TreeTransformer(function(node) { return self.transform(new TreeTransformer(function(node) {
if (node instanceof AST_VarDef) { if (node instanceof AST_VarDef) {
var sym = node.name, def, value; var sym = node.name, def, value;
@@ -2829,17 +2840,13 @@ merge(Compressor.prototype, {
} }
function make_sym(key) { function make_sym(key) {
var prefix = sym.name + "_" + key.toString().replace(/[^a-z_$]+/ig, "_");
var name = prefix;
for (var i = 0; var_names[name]; i++) name = prefix + "$" + i;
var new_var = make_node(sym.CTOR, sym, { var new_var = make_node(sym.CTOR, sym, {
name: name, name: self.make_var_name(sym.name + "_" + key),
scope: self scope: self
}); });
var def = self.def_variable(new_var); var def = self.def_variable(new_var);
defs.set(key, def); defs.set(key, def);
self.enclosed.push(def); self.enclosed.push(def);
var_names[name] = true;
return new_var; return new_var;
} }
})); }));
@@ -3408,8 +3415,7 @@ merge(Compressor.prototype, {
self.args.length = last; self.args.length = last;
} }
if (compressor.option("unsafe")) { if (compressor.option("unsafe")) {
if (is_undeclared_ref(exp)) { if (is_undeclared_ref(exp)) switch (exp.name) {
switch (exp.name) {
case "Array": case "Array":
if (self.args.length != 1) { if (self.args.length != 1) {
return make_node(AST_Array, self, { return make_node(AST_Array, self, {
@@ -3452,16 +3458,16 @@ merge(Compressor.prototype, {
operator: "!" operator: "!"
}).optimize(compressor); }).optimize(compressor);
break; break;
} } else if (exp instanceof AST_Dot) switch(exp.property) {
} case "toString":
else if (exp instanceof AST_Dot && exp.property == "toString" && self.args.length == 0) { if (self.args.length == 0) return make_node(AST_Binary, self, {
return make_node(AST_Binary, self, {
left: make_node(AST_String, self, { value: "" }), left: make_node(AST_String, self, { value: "" }),
operator: "+", operator: "+",
right: exp.expression right: exp.expression
}).optimize(compressor); }).optimize(compressor);
} break;
else if (exp instanceof AST_Dot && exp.expression instanceof AST_Array && exp.property == "join") EXIT: { case "join":
if (exp.expression instanceof AST_Array) EXIT: {
var separator; var separator;
if (self.args.length > 0) { if (self.args.length > 0) {
separator = self.args[0].evaluate(compressor); separator = self.args[0].evaluate(compressor);
@@ -3523,7 +3529,9 @@ merge(Compressor.prototype, {
node.expression.expression.elements = elements; node.expression.expression.elements = elements;
return best_of(compressor, self, node); return best_of(compressor, self, node);
} }
else if (exp instanceof AST_Dot && exp.expression.is_string(compressor) && exp.property == "charAt") { break;
case "charAt":
if (exp.expression.is_string(compressor)) {
var arg = self.args[0]; var arg = self.args[0];
var index = arg ? arg.evaluate(compressor) : 0; var index = arg ? arg.evaluate(compressor) : 0;
if (index !== arg) { if (index !== arg) {
@@ -3533,6 +3541,8 @@ merge(Compressor.prototype, {
}).optimize(compressor); }).optimize(compressor);
} }
} }
break;
}
} }
if (compressor.option("unsafe_Func") if (compressor.option("unsafe_Func")
&& is_undeclared_ref(exp) && is_undeclared_ref(exp)