Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4377e932ca | ||
|
|
bac14ba881 | ||
|
|
ec095ed647 | ||
|
|
17e73121fa | ||
|
|
f71e8fd948 |
17
README.md
17
README.md
@@ -680,17 +680,18 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
|
|||||||
|
|
||||||
## Mangle options
|
## Mangle options
|
||||||
|
|
||||||
- `reserved` - pass an array of identifiers that should be excluded from mangling
|
- `reserved` (default `[]`). Pass an array of identifiers that should be
|
||||||
|
excluded from mangling. Example: `["foo", "bar"]`.
|
||||||
|
|
||||||
- `toplevel` — mangle names declared in the top level scope (disabled by
|
- `toplevel` (default `false`). Pass `true` to mangle names declared in the
|
||||||
default).
|
top level scope.
|
||||||
|
|
||||||
- `eval` — mangle names visible in scopes where eval or with are used
|
- `keep_fnames` (default `false`). Pass `true` to not mangle function names.
|
||||||
(disabled by default).
|
Useful for code relying on `Function.prototype.name`. See also: the `keep_fnames`
|
||||||
|
[compress option](#compress-options).
|
||||||
|
|
||||||
- `keep_fnames` -- default `false`. Pass `true` to not mangle
|
- `eval` (default `false`). Pass `true` to mangle names visible in scopes
|
||||||
function names. Useful for code relying on `Function.prototype.name`.
|
where `eval` or `with` are used.
|
||||||
See also: the `keep_fnames` [compress option](#compress-options).
|
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
|
|||||||
@@ -1665,6 +1665,63 @@ merge(Compressor.prototype, {
|
|||||||
}
|
}
|
||||||
throw def;
|
throw def;
|
||||||
});
|
});
|
||||||
|
var object_fns = [
|
||||||
|
'constructor',
|
||||||
|
'toString',
|
||||||
|
'valueOf',
|
||||||
|
];
|
||||||
|
var native_fns = {
|
||||||
|
Array: makePredicate([
|
||||||
|
'indexOf',
|
||||||
|
'join',
|
||||||
|
'lastIndexOf',
|
||||||
|
'slice',
|
||||||
|
].concat(object_fns)),
|
||||||
|
Boolean: makePredicate(object_fns),
|
||||||
|
Number: makePredicate([
|
||||||
|
'toExponential',
|
||||||
|
'toFixed',
|
||||||
|
'toPrecision',
|
||||||
|
].concat(object_fns)),
|
||||||
|
RegExp: makePredicate([
|
||||||
|
'test',
|
||||||
|
].concat(object_fns)),
|
||||||
|
String: makePredicate([
|
||||||
|
'charAt',
|
||||||
|
'charCodeAt',
|
||||||
|
'concat',
|
||||||
|
'indexOf',
|
||||||
|
'italics',
|
||||||
|
'lastIndexOf',
|
||||||
|
'match',
|
||||||
|
'replace',
|
||||||
|
'search',
|
||||||
|
'slice',
|
||||||
|
'split',
|
||||||
|
'substr',
|
||||||
|
'substring',
|
||||||
|
'trim',
|
||||||
|
].concat(object_fns)),
|
||||||
|
};
|
||||||
|
def(AST_Call, function(compressor){
|
||||||
|
var exp = this.expression;
|
||||||
|
if (compressor.option("unsafe") && exp instanceof AST_PropAccess) {
|
||||||
|
var key = exp.property;
|
||||||
|
if (key instanceof AST_Node) {
|
||||||
|
key = ev(key, compressor);
|
||||||
|
}
|
||||||
|
var val = ev(exp.expression, compressor);
|
||||||
|
if ((val && native_fns[val.constructor.name] || return_false)(key)) {
|
||||||
|
return val[key].apply(val, this.args.map(function(arg) {
|
||||||
|
return ev(arg, compressor);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw def;
|
||||||
|
});
|
||||||
|
def(AST_New, function(compressor){
|
||||||
|
throw def;
|
||||||
|
});
|
||||||
})(function(node, func){
|
})(function(node, func){
|
||||||
node.DEFMETHOD("_eval", func);
|
node.DEFMETHOD("_eval", func);
|
||||||
});
|
});
|
||||||
@@ -3144,6 +3201,11 @@ merge(Compressor.prototype, {
|
|||||||
&& is_iife_call(self)) {
|
&& is_iife_call(self)) {
|
||||||
return self.negate(compressor, true);
|
return self.negate(compressor, true);
|
||||||
}
|
}
|
||||||
|
var ev = self.evaluate(compressor);
|
||||||
|
if (ev !== self) {
|
||||||
|
ev = make_node_from_constant(ev, self).optimize(compressor);
|
||||||
|
return best_of(compressor, ev, self);
|
||||||
|
}
|
||||||
return self;
|
return self;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1234,9 +1234,8 @@ function OutputStream(options) {
|
|||||||
});
|
});
|
||||||
else output.print("{}");
|
else output.print("{}");
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_ObjectKeyVal, function(self, output){
|
|
||||||
var key = self.key;
|
function print_property_name(key, quote, output) {
|
||||||
var quote = self.quote;
|
|
||||||
if (output.option("quote_keys")) {
|
if (output.option("quote_keys")) {
|
||||||
output.print_string(key + "");
|
output.print_string(key + "");
|
||||||
} else if ((typeof key == "number"
|
} else if ((typeof key == "number"
|
||||||
@@ -1253,20 +1252,24 @@ function OutputStream(options) {
|
|||||||
} else {
|
} else {
|
||||||
output.print_string(key, quote);
|
output.print_string(key, quote);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFPRINT(AST_ObjectKeyVal, function(self, output){
|
||||||
|
print_property_name(self.key, self.quote, output);
|
||||||
output.colon();
|
output.colon();
|
||||||
self.value.print(output);
|
self.value.print(output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_ObjectSetter, function(self, output){
|
AST_ObjectProperty.DEFMETHOD("_print_getter_setter", function(type, output) {
|
||||||
output.print("set");
|
output.print(type);
|
||||||
output.space();
|
output.space();
|
||||||
self.key.print(output);
|
print_property_name(this.key.name, this.quote, output);
|
||||||
self.value._do_print(output, true);
|
this.value._do_print(output, true);
|
||||||
|
});
|
||||||
|
DEFPRINT(AST_ObjectSetter, function(self, output){
|
||||||
|
self._print_getter_setter("set", output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_ObjectGetter, function(self, output){
|
DEFPRINT(AST_ObjectGetter, function(self, output){
|
||||||
output.print("get");
|
self._print_getter_setter("get", output);
|
||||||
output.space();
|
|
||||||
self.key.print(output);
|
|
||||||
self.value._do_print(output, true);
|
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Symbol, function(self, output){
|
DEFPRINT(AST_Symbol, function(self, output){
|
||||||
var def = self.definition();
|
var def = self.definition();
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
"homepage": "http://lisperator.net/uglifyjs",
|
"homepage": "http://lisperator.net/uglifyjs",
|
||||||
"author": "Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)",
|
"author": "Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)",
|
||||||
"license": "BSD-2-Clause",
|
"license": "BSD-2-Clause",
|
||||||
"version": "3.0.14",
|
"version": "3.0.15",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.8.0"
|
"node": ">=0.8.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -780,13 +780,15 @@ unsafe_charAt_noop: {
|
|||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
s.charAt(0),
|
s.charAt(0),
|
||||||
"string".charAt(x)
|
"string".charAt(x),
|
||||||
|
(typeof x).charAt()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(
|
console.log(
|
||||||
s.charAt(0),
|
s.charAt(0),
|
||||||
"string".charAt(x)
|
"string".charAt(x),
|
||||||
|
(typeof x)[0]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1037,3 +1039,31 @@ issue_1964_2: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "b"
|
expect_stdout: "b"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
array_slice_index: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log([1,2,3].slice(1)[1]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(3);
|
||||||
|
}
|
||||||
|
expect_stdout: "3"
|
||||||
|
}
|
||||||
|
|
||||||
|
string_charCodeAt: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("foo".charCodeAt("bar".length));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(NaN);
|
||||||
|
}
|
||||||
|
expect_stdout: "NaN"
|
||||||
|
}
|
||||||
|
|||||||
@@ -555,3 +555,20 @@ native_prototype: {
|
|||||||
"".indexOf.call(e, "bar");
|
"".indexOf.call(e, "bar");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_2040: {
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
var b = {
|
||||||
|
get "a-b"() {
|
||||||
|
return a;
|
||||||
|
},
|
||||||
|
set "a-b"(c) {
|
||||||
|
a = c;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(b["a-b"], b["a-b"] = 2, b["a-b"]);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a=1;var b={get"a-b"(){return a},set"a-b"(c){a=c}};console.log(b["a-b"],b["a-b"]=2,b["a-b"]);'
|
||||||
|
expect_stdout: "1 2 2"
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user