minor consolidations (#2484)
- unique symbol generation - `unsafe` on `AST_Call`
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user