Compare commits
150 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e219a9a78a | ||
|
|
c80eabd61e | ||
|
|
9b82f9be91 | ||
|
|
657d525c80 | ||
|
|
6a3fe9d1df | ||
|
|
ec7fadcb5b | ||
|
|
65adeba55d | ||
|
|
7fac839c62 | ||
|
|
8926a2f327 | ||
|
|
85968dee54 | ||
|
|
a7e7865e6b | ||
|
|
ef5f7fc25e | ||
|
|
902997b73d | ||
|
|
f18804fa06 | ||
|
|
8e2dff632e | ||
|
|
92c3fddd7a | ||
|
|
0d350b78bf | ||
|
|
1ad830facb | ||
|
|
64ebf6efe9 | ||
|
|
08391b8e1c | ||
|
|
d147d5d7f0 | ||
|
|
aae1fcd12d | ||
|
|
f67dd31cbb | ||
|
|
450aabaaa0 | ||
|
|
ea7829daf5 | ||
|
|
6577d641ac | ||
|
|
2340feff87 | ||
|
|
0c48b84540 | ||
|
|
1fefe3f1d1 | ||
|
|
0668fad5e9 | ||
|
|
d0e3f6955d | ||
|
|
6961c57d1e | ||
|
|
f5dbb672b9 | ||
|
|
f4ae267920 | ||
|
|
972b9f0bef | ||
|
|
668f96623c | ||
|
|
1b745494ce | ||
|
|
611abff49f | ||
|
|
4ba8b66c5a | ||
|
|
798121c9f3 | ||
|
|
b23b333d9d | ||
|
|
7621527a5f | ||
|
|
1a064b6e74 | ||
|
|
82772ccb12 | ||
|
|
7cbcd11440 | ||
|
|
980dbde171 | ||
|
|
8b05677c15 | ||
|
|
95090dbf24 | ||
|
|
7c5b6f349e | ||
|
|
e9c902b044 | ||
|
|
111366fca0 | ||
|
|
e368d39715 | ||
|
|
fd8dec61ad | ||
|
|
7880568d15 | ||
|
|
21fc8f4630 | ||
|
|
bf76e35772 | ||
|
|
ac1262dc97 | ||
|
|
498ac83541 | ||
|
|
6fc7a2ab6a | ||
|
|
f8b2215145 | ||
|
|
70ceda5398 | ||
|
|
ce75477670 | ||
|
|
e70b84895c | ||
|
|
8dbf0b042e | ||
|
|
83f7887e5d | ||
|
|
dff7b48921 | ||
|
|
f4f0d2a2dd | ||
|
|
06e3dbc089 | ||
|
|
55a230daa8 | ||
|
|
23b9f36bd8 | ||
|
|
7e88d52fae | ||
|
|
b9d5bba5fb | ||
|
|
8d23496e0f | ||
|
|
260431f4e0 | ||
|
|
7fa1dea9d0 | ||
|
|
d40631fd44 | ||
|
|
d320a6cde2 | ||
|
|
8cd95dd263 | ||
|
|
749a828fc5 | ||
|
|
ab42a90edb | ||
|
|
362abe0ffb | ||
|
|
e3798d9a76 | ||
|
|
c8d10b7cde | ||
|
|
7caab39e26 | ||
|
|
eff45eac0e | ||
|
|
1e787c556b | ||
|
|
df47632ecc | ||
|
|
eb08fed120 | ||
|
|
8b0c836515 | ||
|
|
5d4e6e3bdc | ||
|
|
d2a45ba441 | ||
|
|
de376c3d33 | ||
|
|
4a19575e74 | ||
|
|
e0695ef549 | ||
|
|
d6152e6a76 | ||
|
|
d930c705f6 | ||
|
|
254937754c | ||
|
|
ae4dbcb5b9 | ||
|
|
e13615549e | ||
|
|
a7698f8845 | ||
|
|
bbed9b13b1 | ||
|
|
2cff7c94e8 | ||
|
|
7576048118 | ||
|
|
3c1898fd65 | ||
|
|
e04429350f | ||
|
|
60f3b55156 | ||
|
|
689f8f504d | ||
|
|
ae51f76ba7 | ||
|
|
7eef86ed05 | ||
|
|
b1cfa71131 | ||
|
|
7b8570f16c | ||
|
|
bb225367cb | ||
|
|
bbca9de9cd | ||
|
|
ee9ceb79ca | ||
|
|
ac1f7d689b | ||
|
|
19d232badb | ||
|
|
d464be3f3f | ||
|
|
3094eaaa89 | ||
|
|
ce3c35fa8b | ||
|
|
5d9224deb8 | ||
|
|
45b6d23d36 | ||
|
|
f0de9a8b5d | ||
|
|
203f4b7ad9 | ||
|
|
4114431eec | ||
|
|
fb03561799 | ||
|
|
6ab26eef6c | ||
|
|
53b57ee57e | ||
|
|
16411dcb87 | ||
|
|
8bbfaacdae | ||
|
|
df980db4a8 | ||
|
|
8e4a19ffec | ||
|
|
d833e66d23 | ||
|
|
8aa650bcf9 | ||
|
|
d576495e5a | ||
|
|
a06e20304b | ||
|
|
4cccc01f3e | ||
|
|
97bd56b7e8 | ||
|
|
acf951a5bc | ||
|
|
324587f769 | ||
|
|
80efaa2f33 | ||
|
|
a1a212f639 | ||
|
|
a2b1b96752 | ||
|
|
c296a63fb3 | ||
|
|
10dd9d4eaf | ||
|
|
9b8deff64d | ||
|
|
f46209b7e5 | ||
|
|
bddb5a0102 | ||
|
|
3c161a6662 | ||
|
|
c58e174647 | ||
|
|
c53af3dfb1 |
7
.github/workflows/build.yml
vendored
7
.github/workflows/build.yml
vendored
@@ -8,7 +8,12 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
options: [ '-mb braces', '--ie8 -c', '-mc', '--toplevel -mc passes=3,pure_getters,unsafe' ]
|
options:
|
||||||
|
- '-mb braces'
|
||||||
|
- '--ie -c'
|
||||||
|
- '-mc'
|
||||||
|
- '-p acorn --toplevel -mco spidermonkey'
|
||||||
|
- '--toplevel -mc passes=3,pure_getters,unsafe'
|
||||||
script:
|
script:
|
||||||
- acorn.sh
|
- acorn.sh
|
||||||
- bootstrap.sh
|
- bootstrap.sh
|
||||||
|
|||||||
15
.github/workflows/ufuzz.yml
vendored
15
.github/workflows/ufuzz.yml
vendored
@@ -2,11 +2,14 @@ name: Fuzzing
|
|||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '*/5 * * * *'
|
- cron: '*/15 * * * *'
|
||||||
|
workflow_dispatch:
|
||||||
|
workflow_run:
|
||||||
|
branches: [ master ]
|
||||||
|
types: [ completed ]
|
||||||
|
workflows: [ 'Build testing', CI ]
|
||||||
env:
|
env:
|
||||||
BASE_URL: https://api.github.com/repos/${{ github.repository }}
|
BASE_URL: https://api.github.com/repos/${{ github.repository }}
|
||||||
CAUSE: ${{ github.event_name }}
|
|
||||||
RUN_NUM: ${{ github.run_number }}
|
|
||||||
TOKEN: ${{ github.token }}
|
TOKEN: ${{ github.token }}
|
||||||
jobs:
|
jobs:
|
||||||
ufuzz:
|
ufuzz:
|
||||||
@@ -34,8 +37,8 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
. ./test/release/install.sh
|
. ./test/release/install.sh
|
||||||
if [[ $CAUSE == "schedule" ]]; then
|
if [[ $GITHUB_EVENT_NAME == "pull_request" ]]; then
|
||||||
node test/ufuzz/job $BASE_URL $TOKEN $RUN_NUM
|
|
||||||
else
|
|
||||||
node test/ufuzz/job 5000
|
node test/ufuzz/job 5000
|
||||||
|
else
|
||||||
|
node test/ufuzz/job $BASE_URL $TOKEN $GITHUB_RUN_NUMBER
|
||||||
fi
|
fi
|
||||||
|
|||||||
57
README.md
57
README.md
@@ -111,8 +111,8 @@ a double dash to prevent input files being used as option arguments:
|
|||||||
-d, --define <expr>[=value] Global definitions.
|
-d, --define <expr>[=value] Global definitions.
|
||||||
-e, --enclose [arg[:value]] Embed everything in a big function, with configurable
|
-e, --enclose [arg[:value]] Embed everything in a big function, with configurable
|
||||||
argument(s) & value(s).
|
argument(s) & value(s).
|
||||||
--ie8 Support non-standard Internet Explorer 8.
|
--ie Support non-standard Internet Explorer.
|
||||||
Equivalent to setting `ie8: true` in `minify()`
|
Equivalent to setting `ie: true` in `minify()`
|
||||||
for `compress`, `mangle` and `output` options.
|
for `compress`, `mangle` and `output` options.
|
||||||
By default UglifyJS will not try to be IE-proof.
|
By default UglifyJS will not try to be IE-proof.
|
||||||
--keep-fnames Do not mangle/drop function names. Useful for
|
--keep-fnames Do not mangle/drop function names. Useful for
|
||||||
@@ -502,7 +502,7 @@ if (result.error) throw result.error;
|
|||||||
- `compress` (default: `{}`) — pass `false` to skip compressing entirely.
|
- `compress` (default: `{}`) — pass `false` to skip compressing entirely.
|
||||||
Pass an object to specify custom [compress options](#compress-options).
|
Pass an object to specify custom [compress options](#compress-options).
|
||||||
|
|
||||||
- `ie8` (default: `false`) — set to `true` to support IE8.
|
- `ie` (default: `false`) — enable workarounds for Internet Explorer bugs.
|
||||||
|
|
||||||
- `keep_fnames` (default: `false`) — pass `true` to prevent discarding or mangling
|
- `keep_fnames` (default: `false`) — pass `true` to prevent discarding or mangling
|
||||||
of function names. Useful for code relying on `Function.prototype.name`.
|
of function names. Useful for code relying on `Function.prototype.name`.
|
||||||
@@ -566,7 +566,6 @@ if (result.error) throw result.error;
|
|||||||
},
|
},
|
||||||
nameCache: null, // or specify a name cache object
|
nameCache: null, // or specify a name cache object
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
ie8: false,
|
|
||||||
warnings: false,
|
warnings: false,
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -795,9 +794,8 @@ to be `false` and all symbol names will be omitted.
|
|||||||
variables (`"vars"`) in the top level scope (`false` by default, `true` to drop
|
variables (`"vars"`) in the top level scope (`false` by default, `true` to drop
|
||||||
both unreferenced functions and variables)
|
both unreferenced functions and variables)
|
||||||
|
|
||||||
- `typeofs` (default: `true`) — Transforms `typeof foo == "undefined"` into
|
- `typeofs` (default: `true`) — compress `typeof` expressions, e.g.
|
||||||
`foo === void 0`. Note: recommend to set this value to `false` for IE10 and
|
`typeof foo == "undefined" → void 0 === foo`
|
||||||
earlier versions due to known issues.
|
|
||||||
|
|
||||||
- `unsafe` (default: `false`) — apply "unsafe" transformations (discussion below)
|
- `unsafe` (default: `false`) — apply "unsafe" transformations (discussion below)
|
||||||
|
|
||||||
@@ -1309,3 +1307,48 @@ To allow for better optimizations, the compiler makes various assumptions:
|
|||||||
// Actual: { '42': undefined }
|
// Actual: { '42': undefined }
|
||||||
```
|
```
|
||||||
UglifyJS may modify the input which in turn may suppress those errors.
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Later versions of JavaScript will throw `SyntaxError` with the following:
|
||||||
|
```javascript
|
||||||
|
var await;
|
||||||
|
async function f() {
|
||||||
|
class A {
|
||||||
|
static p = await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// SyntaxError: Unexpected reserved word
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Later versions of JavaScript will throw `SyntaxError` with the following:
|
||||||
|
```javascript
|
||||||
|
var async;
|
||||||
|
for (async of []);
|
||||||
|
// SyntaxError: The left-hand side of a for-of loop may not be 'async'.
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Later versions of Chrome and Node.js will give incorrect results with the
|
||||||
|
following:
|
||||||
|
```javascript
|
||||||
|
console.log({
|
||||||
|
...console,
|
||||||
|
get 42() {
|
||||||
|
return "FAIL";
|
||||||
|
},
|
||||||
|
[42]: "PASS",
|
||||||
|
}[42]);
|
||||||
|
// Expected: "PASS"
|
||||||
|
// Actual: "FAIL"
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Earlier versions of JavaScript will throw `TypeError` with the following:
|
||||||
|
```javascript
|
||||||
|
(function() {
|
||||||
|
{
|
||||||
|
const a = "foo";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const a = "bar";
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
// TypeError: const 'a' has already been declared
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
|||||||
73
bin/uglifyjs
73
bin/uglifyjs
@@ -101,7 +101,7 @@ function process_option(name, no_value) {
|
|||||||
" --config-file <file> Read minify() options from JSON file.",
|
" --config-file <file> Read minify() options from JSON file.",
|
||||||
" -d, --define <expr>[=value] Global definitions.",
|
" -d, --define <expr>[=value] Global definitions.",
|
||||||
" -e, --enclose [arg[,...][:value[,...]]] Embed everything in a big function, with configurable argument(s) & value(s).",
|
" -e, --enclose [arg[,...][:value[,...]]] Embed everything in a big function, with configurable argument(s) & value(s).",
|
||||||
" --ie8 Support non-standard Internet Explorer 8.",
|
" --ie Support non-standard Internet Explorer.",
|
||||||
" --keep-fnames Do not mangle/drop function names. Useful for code relying on Function.prototype.name.",
|
" --keep-fnames Do not mangle/drop function names. Useful for code relying on Function.prototype.name.",
|
||||||
" --name-cache <file> File to hold mangled name mappings.",
|
" --name-cache <file> File to hold mangled name mappings.",
|
||||||
" --rename Force symbol expansion.",
|
" --rename Force symbol expansion.",
|
||||||
@@ -110,6 +110,7 @@ function process_option(name, no_value) {
|
|||||||
" --source-map [options] Enable source map/specify source map options.",
|
" --source-map [options] Enable source map/specify source map options.",
|
||||||
" --timings Display operations run time on STDERR.",
|
" --timings Display operations run time on STDERR.",
|
||||||
" --toplevel Compress and/or mangle variables in toplevel scope.",
|
" --toplevel Compress and/or mangle variables in toplevel scope.",
|
||||||
|
" --v8 Support non-standard Chrome & Node.js.",
|
||||||
" --validate Perform validation during AST manipulations.",
|
" --validate Perform validation during AST manipulations.",
|
||||||
" --verbose Print diagnostic messages.",
|
" --verbose Print diagnostic messages.",
|
||||||
" --warn Print warning messages.",
|
" --warn Print warning messages.",
|
||||||
@@ -145,9 +146,11 @@ function process_option(name, no_value) {
|
|||||||
options[name] = read_value();
|
options[name] = read_value();
|
||||||
break;
|
break;
|
||||||
case "annotations":
|
case "annotations":
|
||||||
|
case "ie":
|
||||||
case "ie8":
|
case "ie8":
|
||||||
case "timings":
|
case "timings":
|
||||||
case "toplevel":
|
case "toplevel":
|
||||||
|
case "v8":
|
||||||
case "validate":
|
case "validate":
|
||||||
case "webkit":
|
case "webkit":
|
||||||
options[name] = true;
|
options[name] = true;
|
||||||
@@ -235,10 +238,11 @@ if (options.mangle && options.mangle.properties) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (output == "ast") options.output = {
|
if (/^ast|spidermonkey$/.test(output)) {
|
||||||
ast: true,
|
if (typeof options.output != "object") options.output = {};
|
||||||
code: false,
|
options.output.ast = true;
|
||||||
};
|
options.output.code = false;
|
||||||
|
}
|
||||||
if (options.parse && (options.parse.acorn || options.parse.spidermonkey)
|
if (options.parse && (options.parse.acorn || options.parse.spidermonkey)
|
||||||
&& options.sourceMap && options.sourceMap.content == "inline") {
|
&& options.sourceMap && options.sourceMap.content == "inline") {
|
||||||
fatal("inline source map only works with built-in parser");
|
fatal("inline source map only works with built-in parser");
|
||||||
@@ -265,7 +269,9 @@ if (specified["self"]) {
|
|||||||
paths = UglifyJS.FILES;
|
paths = UglifyJS.FILES;
|
||||||
}
|
}
|
||||||
if (specified["in-situ"]) {
|
if (specified["in-situ"]) {
|
||||||
if (output || specified["reduce-test"] || specified["self"]) fatal("incompatible options specified");
|
if (output && output != "spidermonkey" || specified["reduce-test"] || specified["self"]) {
|
||||||
|
fatal("incompatible options specified");
|
||||||
|
}
|
||||||
paths.forEach(function(name) {
|
paths.forEach(function(name) {
|
||||||
print(name);
|
print(name);
|
||||||
if (/^ast|spidermonkey$/.test(name)) fatal("invalid file name specified");
|
if (/^ast|spidermonkey$/.test(name)) fatal("invalid file name specified");
|
||||||
@@ -311,13 +317,43 @@ function run() {
|
|||||||
try {
|
try {
|
||||||
if (options.parse) {
|
if (options.parse) {
|
||||||
if (options.parse.acorn) {
|
if (options.parse.acorn) {
|
||||||
|
var annotations = Object.create(null);
|
||||||
files = convert_ast(function(toplevel, name) {
|
files = convert_ast(function(toplevel, name) {
|
||||||
return require("acorn").parse(files[name], {
|
var content = files[name];
|
||||||
|
var list = annotations[name] = [];
|
||||||
|
var prev = -1;
|
||||||
|
return require("acorn").parse(content, {
|
||||||
|
allowHashBang: true,
|
||||||
|
ecmaVersion: "latest",
|
||||||
locations: true,
|
locations: true,
|
||||||
|
onComment: function(block, text, start, end) {
|
||||||
|
var match = /[@#]__PURE__/.exec(text);
|
||||||
|
if (!match) {
|
||||||
|
if (start != prev) return;
|
||||||
|
match = [ list[prev] ];
|
||||||
|
}
|
||||||
|
while (/\s/.test(content[end])) end++;
|
||||||
|
list[end] = match[0];
|
||||||
|
prev = end;
|
||||||
|
},
|
||||||
|
preserveParens: true,
|
||||||
program: toplevel,
|
program: toplevel,
|
||||||
sourceFile: name
|
sourceFile: name,
|
||||||
|
sourceType: "module",
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
files.walk(new UglifyJS.TreeWalker(function(node) {
|
||||||
|
if (!(node instanceof UglifyJS.AST_Call)) return;
|
||||||
|
var list = annotations[node.start.file];
|
||||||
|
var pure = list[node.start.pos];
|
||||||
|
if (!pure) {
|
||||||
|
var tokens = node.start.parens;
|
||||||
|
if (tokens) for (var i = 0; !pure && i < tokens.length; i++) {
|
||||||
|
pure = list[tokens[i].pos];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (pure) node.pure = pure;
|
||||||
|
}));
|
||||||
} else if (options.parse.spidermonkey) {
|
} else if (options.parse.spidermonkey) {
|
||||||
files = convert_ast(function(toplevel, name) {
|
files = convert_ast(function(toplevel, name) {
|
||||||
var obj = JSON.parse(files[name]);
|
var obj = JSON.parse(files[name]);
|
||||||
@@ -409,16 +445,19 @@ function run() {
|
|||||||
return value;
|
return value;
|
||||||
}, 2));
|
}, 2));
|
||||||
} else if (output == "spidermonkey") {
|
} else if (output == "spidermonkey") {
|
||||||
print(JSON.stringify(UglifyJS.minify(result.code, {
|
print(JSON.stringify(result.ast.to_mozilla_ast(), null, 2));
|
||||||
compress: false,
|
|
||||||
mangle: false,
|
|
||||||
output: {
|
|
||||||
ast: true,
|
|
||||||
code: false
|
|
||||||
},
|
|
||||||
}).ast.to_mozilla_ast(), null, 2));
|
|
||||||
} else if (output) {
|
} else if (output) {
|
||||||
fs.writeFileSync(output, result.code);
|
var code;
|
||||||
|
if (result.ast) {
|
||||||
|
var opts = {};
|
||||||
|
for (var name in options.output) {
|
||||||
|
if (!/^ast|code$/.test(name)) opts[name] = options.output[name];
|
||||||
|
}
|
||||||
|
code = UglifyJS.AST_Node.from_mozilla_ast(result.ast.to_mozilla_ast()).print_to_string(opts);
|
||||||
|
} else {
|
||||||
|
code = result.code;
|
||||||
|
}
|
||||||
|
fs.writeFileSync(output, code);
|
||||||
if (result.map) fs.writeFileSync(output + ".map", result.map);
|
if (result.map) fs.writeFileSync(output + ".map", result.map);
|
||||||
} else {
|
} else {
|
||||||
print(result.code);
|
print(result.code);
|
||||||
|
|||||||
80
lib/ast.js
80
lib/ast.js
@@ -56,35 +56,31 @@ function DEFNODE(type, props, methods, base) {
|
|||||||
code.push("this.", prop, "=props.", prop, ";");
|
code.push("this.", prop, "=props.", prop, ";");
|
||||||
});
|
});
|
||||||
code.push("}");
|
code.push("}");
|
||||||
var proto = base && new base;
|
var proto = Object.create(base && base.prototype);
|
||||||
if (proto && proto.initialize || methods && methods.initialize) code.push("this.initialize();");
|
if (methods.initialize || proto.initialize) code.push("this.initialize();");
|
||||||
code.push("}");
|
code.push("};");
|
||||||
var ctor = new Function(code.join(""))();
|
var ctor = new Function(code.join(""))();
|
||||||
if (proto) {
|
ctor.prototype = proto;
|
||||||
ctor.prototype = proto;
|
|
||||||
ctor.BASE = base;
|
|
||||||
}
|
|
||||||
if (base) base.SUBCLASSES.push(ctor);
|
|
||||||
ctor.prototype.CTOR = ctor;
|
ctor.prototype.CTOR = ctor;
|
||||||
ctor.PROPS = props || null;
|
ctor.prototype.TYPE = ctor.TYPE = type;
|
||||||
ctor.SELF_PROPS = self_props;
|
if (base) {
|
||||||
ctor.SUBCLASSES = [];
|
ctor.BASE = base;
|
||||||
if (type) {
|
base.SUBCLASSES.push(ctor);
|
||||||
ctor.prototype.TYPE = ctor.TYPE = type;
|
|
||||||
}
|
|
||||||
if (methods) for (var name in methods) if (HOP(methods, name)) {
|
|
||||||
if (/^\$/.test(name)) {
|
|
||||||
ctor[name.substr(1)] = methods[name];
|
|
||||||
} else {
|
|
||||||
ctor.prototype[name] = methods[name];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ctor.DEFMETHOD = function(name, method) {
|
ctor.DEFMETHOD = function(name, method) {
|
||||||
this.prototype[name] = method;
|
this.prototype[name] = method;
|
||||||
};
|
};
|
||||||
if (typeof exports !== "undefined") {
|
ctor.PROPS = props;
|
||||||
exports["AST_" + type] = ctor;
|
ctor.SELF_PROPS = self_props;
|
||||||
|
ctor.SUBCLASSES = [];
|
||||||
|
for (var name in methods) if (HOP(methods, name)) {
|
||||||
|
if (/^\$/.test(name)) {
|
||||||
|
ctor[name.substr(1)] = methods[name];
|
||||||
|
} else {
|
||||||
|
ctor.DEFMETHOD(name, methods[name]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if (typeof exports !== "undefined") exports["AST_" + type] = ctor;
|
||||||
return ctor;
|
return ctor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,9 +257,9 @@ var AST_BlockScope = DEFNODE("BlockScope", "enclosed functions make_def parent_s
|
|||||||
$documentation: "Base class for all statements introducing a lexical scope",
|
$documentation: "Base class for all statements introducing a lexical scope",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes",
|
enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes",
|
||||||
functions: "[Object/S] like `variables`, but only lists function declarations",
|
functions: "[Dictionary/S] like `variables`, but only lists function declarations",
|
||||||
parent_scope: "[AST_Scope?/S] link to the parent scope",
|
parent_scope: "[AST_Scope?/S] link to the parent scope",
|
||||||
variables: "[Object/S] a map of name ---> SymbolDef for all variables/functions defined in this scope",
|
variables: "[Dictionary/S] a map of name ---> SymbolDef for all variables/functions defined in this scope",
|
||||||
},
|
},
|
||||||
clone: function(deep) {
|
clone: function(deep) {
|
||||||
var node = this._clone(deep);
|
var node = this._clone(deep);
|
||||||
@@ -506,7 +502,7 @@ var AST_Scope = DEFNODE("Scope", "uses_eval uses_with", {
|
|||||||
var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
||||||
$documentation: "The toplevel scope",
|
$documentation: "The toplevel scope",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
globals: "[Object/S] a map of name ---> SymbolDef for all undeclared names",
|
globals: "[Dictionary/S] a map of name ---> SymbolDef for all undeclared names",
|
||||||
},
|
},
|
||||||
wrap: function(name) {
|
wrap: function(name) {
|
||||||
var body = this.body;
|
var body = this.body;
|
||||||
@@ -1293,11 +1289,13 @@ function must_be_expressions(node, prop, allow_spread, allow_hole) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var AST_Call = DEFNODE("Call", "expression args pure", {
|
var AST_Call = DEFNODE("Call", "args expression optional pure", {
|
||||||
$documentation: "A function call expression",
|
$documentation: "A function call expression",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
|
args: "[AST_Node*] array of arguments",
|
||||||
expression: "[AST_Node] expression to invoke as function",
|
expression: "[AST_Node] expression to invoke as function",
|
||||||
args: "[AST_Node*] array of arguments"
|
optional: "[boolean] whether the expression is optional chaining",
|
||||||
|
pure: "[string/S] marker for side-effect-free call expression",
|
||||||
},
|
},
|
||||||
walk: function(visitor) {
|
walk: function(visitor) {
|
||||||
var node = this;
|
var node = this;
|
||||||
@@ -1315,7 +1313,10 @@ var AST_Call = DEFNODE("Call", "expression args pure", {
|
|||||||
});
|
});
|
||||||
|
|
||||||
var AST_New = DEFNODE("New", null, {
|
var AST_New = DEFNODE("New", null, {
|
||||||
$documentation: "An object instantiation. Derives from a function call since it has exactly the same properties"
|
$documentation: "An object instantiation. Derives from a function call since it has exactly the same properties",
|
||||||
|
_validate: function() {
|
||||||
|
if (this.optional) throw new Error("optional must be false");
|
||||||
|
},
|
||||||
}, AST_Call);
|
}, AST_Call);
|
||||||
|
|
||||||
var AST_Sequence = DEFNODE("Sequence", "expressions", {
|
var AST_Sequence = DEFNODE("Sequence", "expressions", {
|
||||||
@@ -1337,22 +1338,17 @@ var AST_Sequence = DEFNODE("Sequence", "expressions", {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
var AST_PropAccess = DEFNODE("PropAccess", "expression property", {
|
var AST_PropAccess = DEFNODE("PropAccess", "expression optional property", {
|
||||||
$documentation: "Base class for property access expressions, i.e. `a.foo` or `a[\"foo\"]`",
|
$documentation: "Base class for property access expressions, i.e. `a.foo` or `a[\"foo\"]`",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
expression: "[AST_Node] the “container” expression",
|
expression: "[AST_Node] the “container” expression",
|
||||||
property: "[AST_Node|string] the property to access. For AST_Dot this is always a plain string, while for AST_Sub it's an arbitrary AST_Node"
|
optional: "[boolean] whether the expression is optional chaining",
|
||||||
|
property: "[AST_Node|string] the property to access. For AST_Dot this is always a plain string, while for AST_Sub it's an arbitrary AST_Node",
|
||||||
},
|
},
|
||||||
getProperty: function() {
|
get_property: function() {
|
||||||
var p = this.property;
|
var p = this.property;
|
||||||
if (p instanceof AST_Constant) {
|
if (p instanceof AST_Constant) return p.value;
|
||||||
return p.value;
|
if (p instanceof AST_UnaryPrefix && p.operator == "void" && p.expression instanceof AST_Constant) return;
|
||||||
}
|
|
||||||
if (p instanceof AST_UnaryPrefix
|
|
||||||
&& p.operator == "void"
|
|
||||||
&& p.expression instanceof AST_Constant) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
return p;
|
return p;
|
||||||
},
|
},
|
||||||
_validate: function() {
|
_validate: function() {
|
||||||
@@ -1686,7 +1682,7 @@ var AST_ObjectMethod = DEFNODE("ObjectMethod", null, {
|
|||||||
_validate: function() {
|
_validate: function() {
|
||||||
if (!(this.value instanceof AST_LambdaExpression)) throw new Error("value must be AST_LambdaExpression");
|
if (!(this.value instanceof AST_LambdaExpression)) throw new Error("value must be AST_LambdaExpression");
|
||||||
if (is_arrow(this.value)) throw new Error("value cannot be AST_Arrow or AST_AsyncArrow");
|
if (is_arrow(this.value)) throw new Error("value cannot be AST_Arrow or AST_AsyncArrow");
|
||||||
if (this.value.name != null) throw new Error("name of class method's lambda must be null");
|
if (this.value.name != null) throw new Error("name of object method's lambda must be null");
|
||||||
},
|
},
|
||||||
}, AST_ObjectKeyVal);
|
}, AST_ObjectKeyVal);
|
||||||
|
|
||||||
@@ -1757,11 +1753,11 @@ var AST_SymbolLambda = DEFNODE("SymbolLambda", null, {
|
|||||||
|
|
||||||
var AST_SymbolDefClass = DEFNODE("SymbolDefClass", null, {
|
var AST_SymbolDefClass = DEFNODE("SymbolDefClass", null, {
|
||||||
$documentation: "Symbol defining a class",
|
$documentation: "Symbol defining a class",
|
||||||
}, AST_SymbolLet);
|
}, AST_SymbolConst);
|
||||||
|
|
||||||
var AST_SymbolClass = DEFNODE("SymbolClass", null, {
|
var AST_SymbolClass = DEFNODE("SymbolClass", null, {
|
||||||
$documentation: "Symbol naming a class expression",
|
$documentation: "Symbol naming a class expression",
|
||||||
}, AST_SymbolLet);
|
}, AST_SymbolConst);
|
||||||
|
|
||||||
var AST_SymbolCatch = DEFNODE("SymbolCatch", null, {
|
var AST_SymbolCatch = DEFNODE("SymbolCatch", null, {
|
||||||
$documentation: "Symbol naming the exception in catch",
|
$documentation: "Symbol naming the exception in catch",
|
||||||
|
|||||||
2513
lib/compress.js
2513
lib/compress.js
File diff suppressed because it is too large
Load Diff
@@ -76,6 +76,7 @@ function minify(files, options) {
|
|||||||
annotations: undefined,
|
annotations: undefined,
|
||||||
compress: {},
|
compress: {},
|
||||||
enclose: false,
|
enclose: false,
|
||||||
|
ie: false,
|
||||||
ie8: false,
|
ie8: false,
|
||||||
keep_fnames: false,
|
keep_fnames: false,
|
||||||
mangle: {},
|
mangle: {},
|
||||||
@@ -96,17 +97,18 @@ function minify(files, options) {
|
|||||||
var timings = options.timings && { start: Date.now() };
|
var timings = options.timings && { start: Date.now() };
|
||||||
if (options.rename === undefined) options.rename = options.compress && options.mangle;
|
if (options.rename === undefined) options.rename = options.compress && options.mangle;
|
||||||
if (options.annotations !== undefined) set_shorthand("annotations", options, [ "compress", "output" ]);
|
if (options.annotations !== undefined) set_shorthand("annotations", options, [ "compress", "output" ]);
|
||||||
if (options.ie8) set_shorthand("ie8", options, [ "compress", "mangle", "output" ]);
|
if (options.ie8) options.ie = options.ie || options.ie8;
|
||||||
|
if (options.ie) set_shorthand("ie", options, [ "compress", "mangle", "output" ]);
|
||||||
if (options.keep_fnames) set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
|
if (options.keep_fnames) set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
|
||||||
if (options.toplevel) set_shorthand("toplevel", options, [ "compress", "mangle" ]);
|
if (options.toplevel) set_shorthand("toplevel", options, [ "compress", "mangle" ]);
|
||||||
if (options.v8) set_shorthand("v8", options, [ "mangle", "output" ]);
|
if (options.v8) set_shorthand("v8", options, [ "mangle", "output" ]);
|
||||||
if (options.webkit) set_shorthand("webkit", options, [ "mangle", "output" ]);
|
if (options.webkit) set_shorthand("webkit", options, [ "compress", "mangle", "output" ]);
|
||||||
var quoted_props;
|
var quoted_props;
|
||||||
if (options.mangle) {
|
if (options.mangle) {
|
||||||
options.mangle = defaults(options.mangle, {
|
options.mangle = defaults(options.mangle, {
|
||||||
cache: options.nameCache && (options.nameCache.vars || {}),
|
cache: options.nameCache && (options.nameCache.vars || {}),
|
||||||
eval: false,
|
eval: false,
|
||||||
ie8: false,
|
ie: false,
|
||||||
keep_fnames: false,
|
keep_fnames: false,
|
||||||
properties: false,
|
properties: false,
|
||||||
reserved: [],
|
reserved: [],
|
||||||
@@ -204,27 +206,29 @@ function minify(files, options) {
|
|||||||
if (options.mangle && options.mangle.properties) mangle_properties(toplevel, options.mangle.properties);
|
if (options.mangle && options.mangle.properties) mangle_properties(toplevel, options.mangle.properties);
|
||||||
if (timings) timings.output = Date.now();
|
if (timings) timings.output = Date.now();
|
||||||
var result = {};
|
var result = {};
|
||||||
if (options.output.ast) {
|
var output = defaults(options.output, {
|
||||||
result.ast = toplevel;
|
ast: false,
|
||||||
}
|
code: true,
|
||||||
if (!HOP(options.output, "code") || options.output.code) {
|
});
|
||||||
|
if (output.ast) result.ast = toplevel;
|
||||||
|
if (output.code) {
|
||||||
if (options.sourceMap) {
|
if (options.sourceMap) {
|
||||||
options.output.source_map = SourceMap(options.sourceMap);
|
output.source_map = SourceMap(options.sourceMap);
|
||||||
if (options.sourceMap.includeSources) {
|
if (options.sourceMap.includeSources) {
|
||||||
if (files instanceof AST_Toplevel) {
|
if (files instanceof AST_Toplevel) {
|
||||||
throw new Error("original source content unavailable");
|
throw new Error("original source content unavailable");
|
||||||
} else for (var name in files) if (HOP(files, name)) {
|
} else for (var name in files) if (HOP(files, name)) {
|
||||||
options.output.source_map.setSourceContent(name, files[name]);
|
output.source_map.setSourceContent(name, files[name]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delete options.output.ast;
|
delete output.ast;
|
||||||
delete options.output.code;
|
delete output.code;
|
||||||
var stream = OutputStream(options.output);
|
var stream = OutputStream(output);
|
||||||
toplevel.print(stream);
|
toplevel.print(stream);
|
||||||
result.code = stream.get();
|
result.code = stream.get();
|
||||||
if (options.sourceMap) {
|
if (options.sourceMap) {
|
||||||
result.map = options.output.source_map.toString();
|
result.map = output.source_map.toString();
|
||||||
var url = options.sourceMap.url;
|
var url = options.sourceMap.url;
|
||||||
if (url) {
|
if (url) {
|
||||||
result.code = result.code.replace(/\n\/\/# sourceMappingURL=\S+\s*$/, "");
|
result.code = result.code.replace(/\n\/\/# sourceMappingURL=\S+\s*$/, "");
|
||||||
|
|||||||
1008
lib/mozilla-ast.js
1008
lib/mozilla-ast.js
File diff suppressed because it is too large
Load Diff
161
lib/output.js
161
lib/output.js
@@ -56,7 +56,7 @@ function OutputStream(options) {
|
|||||||
braces : false,
|
braces : false,
|
||||||
comments : false,
|
comments : false,
|
||||||
galio : false,
|
galio : false,
|
||||||
ie8 : false,
|
ie : false,
|
||||||
indent_level : 4,
|
indent_level : 4,
|
||||||
indent_start : 0,
|
indent_start : 0,
|
||||||
inline_script : true,
|
inline_script : true,
|
||||||
@@ -193,7 +193,7 @@ function OutputStream(options) {
|
|||||||
case "\t": return "\\t";
|
case "\t": return "\\t";
|
||||||
case "\b": return "\\b";
|
case "\b": return "\\b";
|
||||||
case "\f": return "\\f";
|
case "\f": return "\\f";
|
||||||
case "\x0B": return options.ie8 ? "\\x0B" : "\\v";
|
case "\x0B": return options.ie ? "\\x0B" : "\\v";
|
||||||
case "\u2028": return "\\u2028";
|
case "\u2028": return "\\u2028";
|
||||||
case "\u2029": return "\\u2029";
|
case "\u2029": return "\\u2029";
|
||||||
case "\ufeff": return "\\ufeff";
|
case "\ufeff": return "\\ufeff";
|
||||||
@@ -482,31 +482,37 @@ function OutputStream(options) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function should_merge_comments(node, parent) {
|
||||||
|
if (parent instanceof AST_Binary) return parent.left === node;
|
||||||
|
if (parent.TYPE == "Call") return parent.expression === node;
|
||||||
|
if (parent instanceof AST_Conditional) return parent.condition === node;
|
||||||
|
if (parent instanceof AST_Dot) return parent.expression === node;
|
||||||
|
if (parent instanceof AST_Exit) return true;
|
||||||
|
if (parent instanceof AST_Sequence) return parent.expressions[0] === node;
|
||||||
|
if (parent instanceof AST_Sub) return parent.expression === node;
|
||||||
|
if (parent instanceof AST_UnaryPostfix) return true;
|
||||||
|
if (parent instanceof AST_Yield) return true;
|
||||||
|
}
|
||||||
|
|
||||||
function prepend_comments(node) {
|
function prepend_comments(node) {
|
||||||
var self = this;
|
var self = this;
|
||||||
var scan = node instanceof AST_Exit && node.value;
|
var scan;
|
||||||
|
if (node instanceof AST_Exit) {
|
||||||
|
scan = node.value;
|
||||||
|
} else if (node instanceof AST_Yield) {
|
||||||
|
scan = node.expression;
|
||||||
|
}
|
||||||
var comments = dump(node);
|
var comments = dump(node);
|
||||||
if (!comments) comments = [];
|
if (!comments) comments = [];
|
||||||
|
|
||||||
if (scan) {
|
if (scan) {
|
||||||
var tw = new TreeWalker(function(node) {
|
var tw = new TreeWalker(function(node) {
|
||||||
var parent = tw.parent();
|
if (!should_merge_comments(node, tw.parent())) return true;
|
||||||
if (parent instanceof AST_Exit
|
var before = dump(node);
|
||||||
|| parent instanceof AST_Binary && parent.left === node
|
if (before) comments = comments.concat(before);
|
||||||
|| parent.TYPE == "Call" && parent.expression === node
|
|
||||||
|| parent instanceof AST_Conditional && parent.condition === node
|
|
||||||
|| parent instanceof AST_Dot && parent.expression === node
|
|
||||||
|| parent instanceof AST_Sequence && parent.expressions[0] === node
|
|
||||||
|| parent instanceof AST_Sub && parent.expression === node
|
|
||||||
|| parent instanceof AST_UnaryPostfix) {
|
|
||||||
var before = dump(node);
|
|
||||||
if (before) comments = comments.concat(before);
|
|
||||||
} else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
tw.push(node);
|
tw.push(node);
|
||||||
node.value.walk(tw);
|
scan.walk(tw);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (current_pos == 0) {
|
if (current_pos == 0) {
|
||||||
@@ -703,6 +709,8 @@ function OutputStream(options) {
|
|||||||
// (x++)[y]
|
// (x++)[y]
|
||||||
// (typeof x).y
|
// (typeof x).y
|
||||||
if (p instanceof AST_PropAccess) return p.expression === this;
|
if (p instanceof AST_PropAccess) return p.expression === this;
|
||||||
|
// (~x)`foo`
|
||||||
|
if (p instanceof AST_Template) return p.tag === this;
|
||||||
}
|
}
|
||||||
PARENS(AST_Await, needs_parens_unary);
|
PARENS(AST_Await, needs_parens_unary);
|
||||||
PARENS(AST_Unary, needs_parens_unary);
|
PARENS(AST_Unary, needs_parens_unary);
|
||||||
@@ -776,14 +784,29 @@ function OutputStream(options) {
|
|||||||
if (p instanceof AST_Class) return true;
|
if (p instanceof AST_Class) return true;
|
||||||
// (foo && bar)["prop"], (foo && bar).prop
|
// (foo && bar)["prop"], (foo && bar).prop
|
||||||
if (p instanceof AST_PropAccess) return p.expression === this;
|
if (p instanceof AST_PropAccess) return p.expression === this;
|
||||||
|
// (foo && bar)``
|
||||||
|
if (p instanceof AST_Template) return p.tag === this;
|
||||||
// typeof (foo && bar)
|
// typeof (foo && bar)
|
||||||
if (p instanceof AST_Unary) return true;
|
if (p instanceof AST_Unary) return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function lhs_has_optional(node, output) {
|
||||||
|
var p = output.parent();
|
||||||
|
if (p instanceof AST_PropAccess && p.expression === node && is_lhs(p, output.parent(1))) {
|
||||||
|
// ++(foo?.bar).baz
|
||||||
|
// (foo?.()).bar = baz
|
||||||
|
do {
|
||||||
|
if (node.optional) return true;
|
||||||
|
node = node.expression;
|
||||||
|
} while (node.TYPE == "Call" || node instanceof AST_PropAccess);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PARENS(AST_PropAccess, function(output) {
|
PARENS(AST_PropAccess, function(output) {
|
||||||
var node = this;
|
var node = this;
|
||||||
var p = output.parent();
|
var p = output.parent();
|
||||||
if (p instanceof AST_New && p.expression === node) {
|
if (p instanceof AST_New) {
|
||||||
|
if (p.expression !== node) return false;
|
||||||
// i.e. new (foo().bar)
|
// i.e. new (foo().bar)
|
||||||
//
|
//
|
||||||
// if there's one call into this subtree, then we need
|
// if there's one call into this subtree, then we need
|
||||||
@@ -795,20 +818,22 @@ function OutputStream(options) {
|
|||||||
} while (node instanceof AST_PropAccess);
|
} while (node instanceof AST_PropAccess);
|
||||||
return node.TYPE == "Call";
|
return node.TYPE == "Call";
|
||||||
}
|
}
|
||||||
|
return lhs_has_optional(node, output);
|
||||||
});
|
});
|
||||||
|
|
||||||
PARENS(AST_Call, function(output) {
|
PARENS(AST_Call, function(output) {
|
||||||
|
var node = this;
|
||||||
var p = output.parent();
|
var p = output.parent();
|
||||||
if (p instanceof AST_New) return p.expression === this;
|
if (p instanceof AST_New) return p.expression === node;
|
||||||
// https://bugs.webkit.org/show_bug.cgi?id=123506
|
// https://bugs.webkit.org/show_bug.cgi?id=123506
|
||||||
if (output.option("webkit")) {
|
if (output.option("webkit")
|
||||||
|
&& node.expression instanceof AST_Function
|
||||||
|
&& p instanceof AST_PropAccess
|
||||||
|
&& p.expression === node) {
|
||||||
var g = output.parent(1);
|
var g = output.parent(1);
|
||||||
return this.expression instanceof AST_Function
|
if (g instanceof AST_Assign && g.left === p) return true;
|
||||||
&& p instanceof AST_PropAccess
|
|
||||||
&& p.expression === this
|
|
||||||
&& g instanceof AST_Assign
|
|
||||||
&& g.left === p;
|
|
||||||
}
|
}
|
||||||
|
return lhs_has_optional(node, output);
|
||||||
});
|
});
|
||||||
|
|
||||||
PARENS(AST_New, function(output) {
|
PARENS(AST_New, function(output) {
|
||||||
@@ -955,7 +980,6 @@ function OutputStream(options) {
|
|||||||
DEFPRINT(AST_Do, function(output) {
|
DEFPRINT(AST_Do, function(output) {
|
||||||
var self = this;
|
var self = this;
|
||||||
output.print("do");
|
output.print("do");
|
||||||
output.space();
|
|
||||||
make_block(self.body, output);
|
make_block(self.body, output);
|
||||||
output.space();
|
output.space();
|
||||||
output.print("while");
|
output.print("while");
|
||||||
@@ -972,7 +996,6 @@ function OutputStream(options) {
|
|||||||
output.with_parens(function() {
|
output.with_parens(function() {
|
||||||
self.condition.print(output);
|
self.condition.print(output);
|
||||||
});
|
});
|
||||||
output.space();
|
|
||||||
force_statement(self.body, output);
|
force_statement(self.body, output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_For, function(output) {
|
DEFPRINT(AST_For, function(output) {
|
||||||
@@ -1002,7 +1025,6 @@ function OutputStream(options) {
|
|||||||
self.step.print(output);
|
self.step.print(output);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
output.space();
|
|
||||||
force_statement(self.body, output);
|
force_statement(self.body, output);
|
||||||
});
|
});
|
||||||
function print_for_enum(prefix, infix) {
|
function print_for_enum(prefix, infix) {
|
||||||
@@ -1017,7 +1039,6 @@ function OutputStream(options) {
|
|||||||
output.space();
|
output.space();
|
||||||
self.object.print(output);
|
self.object.print(output);
|
||||||
});
|
});
|
||||||
output.space();
|
|
||||||
force_statement(self.body, output);
|
force_statement(self.body, output);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -1031,7 +1052,6 @@ function OutputStream(options) {
|
|||||||
output.with_parens(function() {
|
output.with_parens(function() {
|
||||||
self.expression.print(output);
|
self.expression.print(output);
|
||||||
});
|
});
|
||||||
output.space();
|
|
||||||
force_statement(self.body, output);
|
force_statement(self.body, output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_ExportDeclaration, function(output) {
|
DEFPRINT(AST_ExportDeclaration, function(output) {
|
||||||
@@ -1270,7 +1290,7 @@ function OutputStream(options) {
|
|||||||
function make_then(self, output) {
|
function make_then(self, output) {
|
||||||
var b = self.body;
|
var b = self.body;
|
||||||
if (output.option("braces") && !(b instanceof AST_Const || b instanceof AST_Let)
|
if (output.option("braces") && !(b instanceof AST_Const || b instanceof AST_Let)
|
||||||
|| output.option("ie8") && b instanceof AST_Do)
|
|| output.option("ie") && b instanceof AST_Do)
|
||||||
return make_block(b, output);
|
return make_block(b, output);
|
||||||
// The squeezer replaces "block"-s that contain only a single
|
// The squeezer replaces "block"-s that contain only a single
|
||||||
// statement with the statement itself; technically, the AST
|
// statement with the statement itself; technically, the AST
|
||||||
@@ -1300,16 +1320,16 @@ function OutputStream(options) {
|
|||||||
output.with_parens(function() {
|
output.with_parens(function() {
|
||||||
self.condition.print(output);
|
self.condition.print(output);
|
||||||
});
|
});
|
||||||
output.space();
|
|
||||||
if (self.alternative) {
|
if (self.alternative) {
|
||||||
make_then(self, output);
|
make_then(self, output);
|
||||||
output.space();
|
output.space();
|
||||||
output.print("else");
|
output.print("else");
|
||||||
output.space();
|
if (self.alternative instanceof AST_If) {
|
||||||
if (self.alternative instanceof AST_If)
|
output.space();
|
||||||
self.alternative.print(output);
|
self.alternative.print(output);
|
||||||
else
|
} else {
|
||||||
force_statement(self.alternative, output);
|
force_statement(self.alternative, output);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
force_statement(self.body, output);
|
force_statement(self.body, output);
|
||||||
}
|
}
|
||||||
@@ -1450,7 +1470,7 @@ function OutputStream(options) {
|
|||||||
parent = output.parent(level++);
|
parent = output.parent(level++);
|
||||||
if (parent instanceof AST_Call && parent.expression === node) return;
|
if (parent instanceof AST_Call && parent.expression === node) return;
|
||||||
} while (parent instanceof AST_PropAccess && parent.expression === node);
|
} while (parent instanceof AST_PropAccess && parent.expression === node);
|
||||||
output.print("/*" + self.pure + "*/");
|
output.print(typeof self.pure == "string" ? "/*" + self.pure + "*/" : "/*@__PURE__*/");
|
||||||
}
|
}
|
||||||
function print_call_args(self, output) {
|
function print_call_args(self, output) {
|
||||||
if (self.expression instanceof AST_Call || self.expression instanceof AST_Lambda) {
|
if (self.expression instanceof AST_Call || self.expression instanceof AST_Lambda) {
|
||||||
@@ -1467,6 +1487,7 @@ function OutputStream(options) {
|
|||||||
var self = this;
|
var self = this;
|
||||||
print_annotation(self, output);
|
print_annotation(self, output);
|
||||||
self.expression.print(output);
|
self.expression.print(output);
|
||||||
|
if (self.optional) output.print("?.");
|
||||||
print_call_args(self, output);
|
print_call_args(self, output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_New, function(output) {
|
DEFPRINT(AST_New, function(output) {
|
||||||
@@ -1494,23 +1515,24 @@ function OutputStream(options) {
|
|||||||
var expr = self.expression;
|
var expr = self.expression;
|
||||||
expr.print(output);
|
expr.print(output);
|
||||||
var prop = self.property;
|
var prop = self.property;
|
||||||
if (output.option("ie8") && RESERVED_WORDS[prop]) {
|
if (output.option("ie") && RESERVED_WORDS[prop]) {
|
||||||
output.print("[");
|
output.print(self.optional ? "?.[" : "[");
|
||||||
output.add_mapping(self.end);
|
output.add_mapping(self.end);
|
||||||
output.print_string(prop);
|
output.print_string(prop);
|
||||||
output.print("]");
|
output.print("]");
|
||||||
} else {
|
} else {
|
||||||
if (expr instanceof AST_Number && !/[ex.)]/i.test(output.last())) output.print(".");
|
if (expr instanceof AST_Number && !/[ex.)]/i.test(output.last())) output.print(".");
|
||||||
output.print(".");
|
output.print(self.optional ? "?." : ".");
|
||||||
// the name after dot would be mapped about here.
|
// the name after dot would be mapped about here.
|
||||||
output.add_mapping(self.end);
|
output.add_mapping(self.end);
|
||||||
output.print_name(prop);
|
output.print_name(prop);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Sub, function(output) {
|
DEFPRINT(AST_Sub, function(output) {
|
||||||
this.expression.print(output);
|
var self = this;
|
||||||
output.print("[");
|
self.expression.print(output);
|
||||||
this.property.print(output);
|
output.print(self.optional ? "?.[" : "[");
|
||||||
|
self.property.print(output);
|
||||||
output.print("]");
|
output.print("]");
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Spread, function(output) {
|
DEFPRINT(AST_Spread, function(output) {
|
||||||
@@ -1607,7 +1629,19 @@ function OutputStream(options) {
|
|||||||
var self = this;
|
var self = this;
|
||||||
var key = print_property_key(self, output);
|
var key = print_property_key(self, output);
|
||||||
var value = self.value;
|
var value = self.value;
|
||||||
if (key && value instanceof AST_SymbolDeclaration && key == get_symbol_name(value)) return;
|
if (key) {
|
||||||
|
if (value instanceof AST_DefaultValue) {
|
||||||
|
if (value.name instanceof AST_Symbol && key == get_symbol_name(value.name)) {
|
||||||
|
output.space();
|
||||||
|
output.print("=");
|
||||||
|
output.space();
|
||||||
|
value.value.print(output);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (value instanceof AST_Symbol) {
|
||||||
|
if (key == get_symbol_name(value)) return;
|
||||||
|
}
|
||||||
|
}
|
||||||
output.colon();
|
output.colon();
|
||||||
value.print(output);
|
value.print(output);
|
||||||
});
|
});
|
||||||
@@ -1656,28 +1690,21 @@ function OutputStream(options) {
|
|||||||
|
|
||||||
function print_property_key(self, output) {
|
function print_property_key(self, output) {
|
||||||
var key = self.key;
|
var key = self.key;
|
||||||
if (key instanceof AST_Node) {
|
if (key instanceof AST_Node) return output.with_square(function() {
|
||||||
output.with_square(function() {
|
key.print(output);
|
||||||
key.print(output);
|
});
|
||||||
});
|
var quote = self.start && self.start.quote;
|
||||||
} else if (output.option("quote_keys")) {
|
if (output.option("quote_keys") || quote && output.option("keep_quoted_props")) {
|
||||||
output.print_string(key);
|
output.print_string(key, quote);
|
||||||
} else if ("" + +key == key && key >= 0) {
|
} else if ("" + +key == key && key >= 0) {
|
||||||
output.print(make_num(key));
|
output.print(make_num(key));
|
||||||
|
} else if (self.private) {
|
||||||
|
output.print_name(key);
|
||||||
|
} else if (RESERVED_WORDS[key] ? !output.option("ie") : is_identifier_string(key)) {
|
||||||
|
output.print_name(key);
|
||||||
|
return key;
|
||||||
} else {
|
} else {
|
||||||
var quote = self.start && self.start.quote;
|
output.print_string(key, quote);
|
||||||
if (self.private) {
|
|
||||||
output.print_name(key);
|
|
||||||
} else if (RESERVED_WORDS[key] ? !output.option("ie8") : is_identifier_string(key)) {
|
|
||||||
if (quote && output.option("keep_quoted_props")) {
|
|
||||||
output.print_string(key, quote);
|
|
||||||
} else {
|
|
||||||
output.print_name(key);
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
output.print_string(key, quote);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DEFPRINT(AST_ObjectKeyVal, function(output) {
|
DEFPRINT(AST_ObjectKeyVal, function(output) {
|
||||||
@@ -1809,6 +1836,7 @@ function OutputStream(options) {
|
|||||||
} else if (stat instanceof AST_EmptyStatement) {
|
} else if (stat instanceof AST_EmptyStatement) {
|
||||||
output.force_semicolon();
|
output.force_semicolon();
|
||||||
} else {
|
} else {
|
||||||
|
output.space();
|
||||||
stat.print(output);
|
stat.print(output);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1857,6 +1885,7 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function make_block(stmt, output) {
|
function make_block(stmt, output) {
|
||||||
|
output.space();
|
||||||
if (stmt instanceof AST_EmptyStatement) {
|
if (stmt instanceof AST_EmptyStatement) {
|
||||||
print_braced_empty(stmt, output);
|
print_braced_empty(stmt, output);
|
||||||
} else if (stmt instanceof AST_BlockStatement) {
|
} else if (stmt instanceof AST_BlockStatement) {
|
||||||
@@ -1908,7 +1937,11 @@ function OutputStream(options) {
|
|||||||
output.add_mapping(this.start);
|
output.add_mapping(this.start);
|
||||||
});
|
});
|
||||||
|
|
||||||
DEFMAP([ AST_DestructuredKeyVal, AST_ObjectProperty ], function(output) {
|
DEFMAP([
|
||||||
|
AST_ClassProperty,
|
||||||
|
AST_DestructuredKeyVal,
|
||||||
|
AST_ObjectProperty,
|
||||||
|
], function(output) {
|
||||||
if (typeof this.key == "string") output.add_mapping(this.start, this.key);
|
if (typeof this.key == "string") output.add_mapping(this.start, this.key);
|
||||||
});
|
});
|
||||||
})();
|
})();
|
||||||
|
|||||||
79
lib/parse.js
79
lib/parse.js
@@ -124,7 +124,7 @@ var PUNC_AFTER_EXPRESSION = PUNC_SEPARATORS + PUNC_CLOSERS;
|
|||||||
var PUNC_BEFORE_EXPRESSION = PUNC_OPENERS + PUNC_SEPARATORS;
|
var PUNC_BEFORE_EXPRESSION = PUNC_OPENERS + PUNC_SEPARATORS;
|
||||||
var PUNC_CHARS = PUNC_BEFORE_EXPRESSION + "`" + PUNC_CLOSERS;
|
var PUNC_CHARS = PUNC_BEFORE_EXPRESSION + "`" + PUNC_CLOSERS;
|
||||||
var WHITESPACE_CHARS = NEWLINE_CHARS + " \u00a0\t\f\u000b\u200b\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\uFEFF";
|
var WHITESPACE_CHARS = NEWLINE_CHARS + " \u00a0\t\f\u000b\u200b\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\uFEFF";
|
||||||
var NON_IDENTIFIER_CHARS = makePredicate(characters("./'\"" + OPERATOR_CHARS + PUNC_CHARS + WHITESPACE_CHARS));
|
var NON_IDENTIFIER_CHARS = makePredicate(characters("./'\"#" + OPERATOR_CHARS + PUNC_CHARS + WHITESPACE_CHARS));
|
||||||
|
|
||||||
NEWLINE_CHARS = makePredicate(characters(NEWLINE_CHARS));
|
NEWLINE_CHARS = makePredicate(characters(NEWLINE_CHARS));
|
||||||
OPERATOR_CHARS = makePredicate(characters(OPERATOR_CHARS));
|
OPERATOR_CHARS = makePredicate(characters(OPERATOR_CHARS));
|
||||||
@@ -468,7 +468,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
function read_name() {
|
function read_name() {
|
||||||
var backslash = false, name = "", ch, escaped = false, hex;
|
var backslash = false, ch, escaped = false, name = peek() == "#" ? next() : "";
|
||||||
while (ch = peek()) {
|
while (ch = peek()) {
|
||||||
if (!backslash) {
|
if (!backslash) {
|
||||||
if (ch == "\\") escaped = backslash = true, next();
|
if (ch == "\\") escaped = backslash = true, next();
|
||||||
@@ -483,7 +483,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (KEYWORDS[name] && escaped) {
|
if (KEYWORDS[name] && escaped) {
|
||||||
hex = name.charCodeAt(0).toString(16).toUpperCase();
|
var hex = name.charCodeAt(0).toString(16).toUpperCase();
|
||||||
name = "\\u" + "0000".substr(hex.length) + hex + name.slice(1);
|
name = "\\u" + "0000".substr(hex.length) + hex + name.slice(1);
|
||||||
}
|
}
|
||||||
return name;
|
return name;
|
||||||
@@ -618,7 +618,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
if (PUNC_CHARS[ch]) return token("punc", next());
|
if (PUNC_CHARS[ch]) return token("punc", next());
|
||||||
if (looking_at("=>")) return token("punc", next() + next());
|
if (looking_at("=>")) return token("punc", next() + next());
|
||||||
if (OPERATOR_CHARS[ch]) return read_operator();
|
if (OPERATOR_CHARS[ch]) return read_operator();
|
||||||
if (code == 92 || !NON_IDENTIFIER_CHARS[ch]) return read_word();
|
if (code == 35 || code == 92 || !NON_IDENTIFIER_CHARS[ch]) return read_word();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
parse_error("Unexpected character '" + ch + "'");
|
parse_error("Unexpected character '" + ch + "'");
|
||||||
@@ -1240,6 +1240,7 @@ function parse($TEXT, options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function for_enum(ctor, init) {
|
function for_enum(ctor, init) {
|
||||||
|
handle_regexp();
|
||||||
var obj = expression();
|
var obj = expression();
|
||||||
expect(")");
|
expect(")");
|
||||||
return new ctor({
|
return new ctor({
|
||||||
@@ -1333,21 +1334,19 @@ function parse($TEXT, options) {
|
|||||||
if (is("punc", "{")) {
|
if (is("punc", "{")) {
|
||||||
body = block_();
|
body = block_();
|
||||||
value = null;
|
value = null;
|
||||||
if (S.input.has_directive("use strict")) {
|
|
||||||
argnames.forEach(strict_verify_symbol);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
body = [];
|
body = [];
|
||||||
handle_regexp();
|
handle_regexp();
|
||||||
value = maybe_assign();
|
value = maybe_assign();
|
||||||
}
|
}
|
||||||
|
var is_strict = S.input.has_directive("use strict");
|
||||||
S.input.pop_directives_stack();
|
S.input.pop_directives_stack();
|
||||||
--S.in_function;
|
--S.in_function;
|
||||||
S.in_loop = loop;
|
S.in_loop = loop;
|
||||||
S.labels = labels;
|
S.labels = labels;
|
||||||
S.in_generator = was_gen;
|
S.in_generator = was_gen;
|
||||||
S.in_async = was_async;
|
S.in_async = was_async;
|
||||||
return new (async ? AST_AsyncArrow : AST_Arrow)({
|
var node = new (async ? AST_AsyncArrow : AST_Arrow)({
|
||||||
start: start,
|
start: start,
|
||||||
argnames: argnames,
|
argnames: argnames,
|
||||||
rest: rest,
|
rest: rest,
|
||||||
@@ -1355,6 +1354,8 @@ function parse($TEXT, options) {
|
|||||||
value: value,
|
value: value,
|
||||||
end: prev(),
|
end: prev(),
|
||||||
});
|
});
|
||||||
|
if (is_strict) node.each_argname(strict_verify_symbol);
|
||||||
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
var function_ = function(ctor) {
|
var function_ = function(ctor) {
|
||||||
@@ -1387,23 +1388,24 @@ function parse($TEXT, options) {
|
|||||||
S.in_loop = 0;
|
S.in_loop = 0;
|
||||||
S.labels = [];
|
S.labels = [];
|
||||||
var body = block_();
|
var body = block_();
|
||||||
if (S.input.has_directive("use strict")) {
|
var is_strict = S.input.has_directive("use strict");
|
||||||
if (name) strict_verify_symbol(name);
|
|
||||||
argnames.forEach(strict_verify_symbol);
|
|
||||||
if (argnames.rest) strict_verify_symbol(argnames.rest);
|
|
||||||
}
|
|
||||||
S.input.pop_directives_stack();
|
S.input.pop_directives_stack();
|
||||||
--S.in_function;
|
--S.in_function;
|
||||||
S.in_loop = loop;
|
S.in_loop = loop;
|
||||||
S.labels = labels;
|
S.labels = labels;
|
||||||
S.in_generator = was_gen;
|
S.in_generator = was_gen;
|
||||||
S.in_async = was_async;
|
S.in_async = was_async;
|
||||||
return new ctor({
|
var node = new ctor({
|
||||||
name: name,
|
name: name,
|
||||||
argnames: argnames,
|
argnames: argnames,
|
||||||
rest: argnames.rest || null,
|
rest: argnames.rest || null,
|
||||||
body: body
|
body: body
|
||||||
});
|
});
|
||||||
|
if (is_strict) {
|
||||||
|
if (name) strict_verify_symbol(name);
|
||||||
|
node.each_argname(strict_verify_symbol);
|
||||||
|
}
|
||||||
|
return node;
|
||||||
};
|
};
|
||||||
|
|
||||||
function if_() {
|
function if_() {
|
||||||
@@ -1495,6 +1497,7 @@ function parse($TEXT, options) {
|
|||||||
body.start = start;
|
body.start = start;
|
||||||
body.end = prev();
|
body.end = prev();
|
||||||
} else {
|
} else {
|
||||||
|
handle_regexp();
|
||||||
body = expression();
|
body = expression();
|
||||||
semicolon();
|
semicolon();
|
||||||
}
|
}
|
||||||
@@ -2243,44 +2246,52 @@ function parse($TEXT, options) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var subscripts = function(expr, allow_calls) {
|
var subscripts = function(expr, allow_calls, optional) {
|
||||||
var start = expr.start;
|
var start = expr.start;
|
||||||
if (is("punc", ".")) {
|
|
||||||
next();
|
|
||||||
return subscripts(new AST_Dot({
|
|
||||||
start : start,
|
|
||||||
expression : expr,
|
|
||||||
property : as_name(),
|
|
||||||
end : prev()
|
|
||||||
}), allow_calls);
|
|
||||||
}
|
|
||||||
if (is("punc", "[")) {
|
if (is("punc", "[")) {
|
||||||
next();
|
next();
|
||||||
var prop = expression();
|
var prop = expression();
|
||||||
expect("]");
|
expect("]");
|
||||||
return subscripts(new AST_Sub({
|
return subscripts(new AST_Sub({
|
||||||
start : start,
|
start: start,
|
||||||
expression : expr,
|
optional: optional,
|
||||||
property : prop,
|
expression: expr,
|
||||||
end : prev()
|
property: prop,
|
||||||
|
end: prev(),
|
||||||
}), allow_calls);
|
}), allow_calls);
|
||||||
}
|
}
|
||||||
if (allow_calls && is("punc", "(")) {
|
if (allow_calls && is("punc", "(")) {
|
||||||
next();
|
next();
|
||||||
var call = new AST_Call({
|
var call = new AST_Call({
|
||||||
start : start,
|
start: start,
|
||||||
expression : expr,
|
optional: optional,
|
||||||
args : expr_list(")", !options.strict),
|
expression: expr,
|
||||||
end : prev()
|
args: expr_list(")", !options.strict),
|
||||||
|
end: prev(),
|
||||||
});
|
});
|
||||||
return subscripts(call, true);
|
return subscripts(call, true);
|
||||||
}
|
}
|
||||||
|
if (optional || is("punc", ".")) {
|
||||||
|
if (!optional) next();
|
||||||
|
return subscripts(new AST_Dot({
|
||||||
|
start: start,
|
||||||
|
optional: optional,
|
||||||
|
expression: expr,
|
||||||
|
property: as_name(),
|
||||||
|
end: prev(),
|
||||||
|
}), allow_calls);
|
||||||
|
}
|
||||||
if (is("punc", "`")) {
|
if (is("punc", "`")) {
|
||||||
var tmpl = template(expr);
|
var tmpl = template(expr);
|
||||||
tmpl.start = expr.start;
|
tmpl.start = expr.start;
|
||||||
tmpl.end = prev();
|
tmpl.end = prev();
|
||||||
return subscripts(tmpl, allow_calls);
|
return subscripts(tmpl, allow_calls);
|
||||||
}
|
}
|
||||||
|
if (is("operator", "?") && is_token(peek(), "punc", ".")) {
|
||||||
|
next();
|
||||||
|
next();
|
||||||
|
return subscripts(expr, allow_calls, true);
|
||||||
|
}
|
||||||
if (expr instanceof AST_Call && !expr.pure) {
|
if (expr instanceof AST_Call && !expr.pure) {
|
||||||
var start = expr.start;
|
var start = expr.start;
|
||||||
var comments = start.comments_before;
|
var comments = start.comments_before;
|
||||||
@@ -2403,7 +2414,7 @@ function parse($TEXT, options) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
function is_assignable(expr) {
|
function is_assignable(expr) {
|
||||||
return expr instanceof AST_PropAccess || expr instanceof AST_SymbolRef;
|
return expr instanceof AST_PropAccess && !expr.optional || expr instanceof AST_SymbolRef;
|
||||||
}
|
}
|
||||||
|
|
||||||
function to_destructured(node) {
|
function to_destructured(node) {
|
||||||
@@ -2525,7 +2536,7 @@ function parse($TEXT, options) {
|
|||||||
while (!is("eof"))
|
while (!is("eof"))
|
||||||
body.push(statement());
|
body.push(statement());
|
||||||
S.input.pop_directives_stack();
|
S.input.pop_directives_stack();
|
||||||
var end = prev();
|
var end = prev() || start;
|
||||||
var toplevel = options.toplevel;
|
var toplevel = options.toplevel;
|
||||||
if (toplevel) {
|
if (toplevel) {
|
||||||
toplevel.body = toplevel.body.concat(body);
|
toplevel.body = toplevel.body.concat(body);
|
||||||
|
|||||||
35
lib/scope.js
35
lib/scope.js
@@ -80,15 +80,16 @@ SymbolDef.prototype = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
redefined: function() {
|
redefined: function() {
|
||||||
var scope = this.defun;
|
var self = this;
|
||||||
|
var scope = self.defun;
|
||||||
if (!scope) return;
|
if (!scope) return;
|
||||||
var name = this.name;
|
var name = self.name;
|
||||||
var def = scope.variables.get(name)
|
var def = scope.variables.get(name)
|
||||||
|| scope instanceof AST_Toplevel && scope.globals.get(name)
|
|| scope instanceof AST_Toplevel && scope.globals.get(name)
|
||||||
|| this.orig[0] instanceof AST_SymbolConst && find_if(function(def) {
|
|| self.orig[0] instanceof AST_SymbolConst && find_if(function(def) {
|
||||||
return def.name == name;
|
return def.name == name;
|
||||||
}, scope.enclosed);
|
}, scope.enclosed);
|
||||||
if (def && def !== this) return def.redefined() || def;
|
if (def && def !== self) return def.redefined() || def;
|
||||||
},
|
},
|
||||||
unmangleable: function(options) {
|
unmangleable: function(options) {
|
||||||
return this.global && !options.toplevel
|
return this.global && !options.toplevel
|
||||||
@@ -117,7 +118,7 @@ function is_lhs(node, parent) {
|
|||||||
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
cache: null,
|
cache: null,
|
||||||
ie8: false,
|
ie: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
// pass 1: setup scope chaining and handle definitions
|
// pass 1: setup scope chaining and handle definitions
|
||||||
@@ -210,7 +211,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
entangle(defun, scope);
|
entangle(defun, scope);
|
||||||
} else if (node instanceof AST_SymbolLambda) {
|
} else if (node instanceof AST_SymbolLambda) {
|
||||||
var def = defun.def_function(node, node.name == "arguments" ? undefined : defun);
|
var def = defun.def_function(node, node.name == "arguments" ? undefined : defun);
|
||||||
if (options.ie8) def.defun = defun.parent_scope.resolve();
|
if (options.ie) def.defun = defun.parent_scope.resolve();
|
||||||
} else if (node instanceof AST_SymbolLet) {
|
} else if (node instanceof AST_SymbolLet) {
|
||||||
var def = scope.def_variable(node);
|
var def = scope.def_variable(node);
|
||||||
if (exported) def.exported = true;
|
if (exported) def.exported = true;
|
||||||
@@ -350,7 +351,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
self.walk(tw);
|
self.walk(tw);
|
||||||
|
|
||||||
// pass 3: fix up any scoping issue with IE8
|
// pass 3: fix up any scoping issue with IE8
|
||||||
if (options.ie8) self.walk(new TreeWalker(function(node) {
|
if (options.ie) self.walk(new TreeWalker(function(node) {
|
||||||
if (node instanceof AST_SymbolCatch) {
|
if (node instanceof AST_SymbolCatch) {
|
||||||
var scope = node.thedef.defun;
|
var scope = node.thedef.defun;
|
||||||
if (scope.name instanceof AST_SymbolLambda && scope.name.name == node.name) {
|
if (scope.name instanceof AST_SymbolLambda && scope.name.name == node.name) {
|
||||||
@@ -396,13 +397,14 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
} else {
|
} else {
|
||||||
new_def = scope.def_variable(node);
|
new_def = scope.def_variable(node);
|
||||||
}
|
}
|
||||||
|
if (new_def.undeclared) self.variables.set(name, new_def);
|
||||||
|
if (name == "arguments" && is_arguments(old_def) && node instanceof AST_SymbolLambda) return true;
|
||||||
old_def.defun = new_def.scope;
|
old_def.defun = new_def.scope;
|
||||||
old_def.forEach(function(node) {
|
old_def.forEach(function(node) {
|
||||||
node.redef = old_def;
|
node.redef = old_def;
|
||||||
node.thedef = new_def;
|
node.thedef = new_def;
|
||||||
node.reference(options);
|
node.reference(options);
|
||||||
});
|
});
|
||||||
if (new_def.undeclared) self.variables.set(name, new_def);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -570,7 +572,7 @@ AST_Symbol.DEFMETHOD("definition", function() {
|
|||||||
function _default_mangler_options(options) {
|
function _default_mangler_options(options) {
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
eval : false,
|
eval : false,
|
||||||
ie8 : false,
|
ie : false,
|
||||||
keep_fnames : false,
|
keep_fnames : false,
|
||||||
reserved : [],
|
reserved : [],
|
||||||
toplevel : false,
|
toplevel : false,
|
||||||
@@ -800,6 +802,7 @@ var base54 = (function() {
|
|||||||
var leading = init("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_");
|
var leading = init("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_");
|
||||||
var chars, frequency;
|
var chars, frequency;
|
||||||
function reset() {
|
function reset() {
|
||||||
|
chars = null;
|
||||||
frequency = Object.create(freq);
|
frequency = Object.create(freq);
|
||||||
}
|
}
|
||||||
base54.consider = function(str, delta) {
|
base54.consider = function(str, delta) {
|
||||||
@@ -811,19 +814,15 @@ var base54 = (function() {
|
|||||||
return frequency[b] - frequency[a];
|
return frequency[b] - frequency[a];
|
||||||
}
|
}
|
||||||
base54.sort = function() {
|
base54.sort = function() {
|
||||||
chars = leading.sort(compare).concat(digits.sort(compare));
|
chars = leading.sort(compare).concat(digits).sort(compare);
|
||||||
};
|
};
|
||||||
base54.reset = reset;
|
base54.reset = reset;
|
||||||
reset();
|
reset();
|
||||||
function base54(num) {
|
function base54(num) {
|
||||||
var ret = "", base = 54;
|
var ret = leading[num % 54];
|
||||||
num++;
|
for (num = Math.floor(num / 54); --num >= 0; num >>= 6) {
|
||||||
do {
|
ret += chars[num & 0x3F];
|
||||||
num--;
|
}
|
||||||
ret += chars[num % base];
|
|
||||||
num = Math.floor(num / base);
|
|
||||||
base = 64;
|
|
||||||
} while (num > 0);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
return base54;
|
return base54;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"description": "JavaScript parser, mangler/compressor and beautifier toolkit",
|
"description": "JavaScript parser, mangler/compressor and beautifier toolkit",
|
||||||
"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.13.4",
|
"version": "3.14.1",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.8.0"
|
"node": ">=0.8.0"
|
||||||
},
|
},
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
"LICENSE"
|
"LICENSE"
|
||||||
],
|
],
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"acorn": "~7.1.0",
|
"acorn": "~8.2.1",
|
||||||
"semver": "~6.3.0"
|
"semver": "~6.3.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ var urls = [
|
|||||||
"https://code.angularjs.org/1.7.8/angular.js",
|
"https://code.angularjs.org/1.7.8/angular.js",
|
||||||
"https://unpkg.com/mathjs@6.2.3/dist/math.js",
|
"https://unpkg.com/mathjs@6.2.3/dist/math.js",
|
||||||
"https://unpkg.com/react@15.3.2/dist/react.js",
|
"https://unpkg.com/react@15.3.2/dist/react.js",
|
||||||
"https://cdnjs.cloudflare.com/ajax/libs/d3/5.12.0/d3.js",
|
"https://cdnjs.cloudflare.com/ajax/libs/d3/6.7.0/d3.js",
|
||||||
"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js",
|
"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js",
|
||||||
"https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js",
|
"https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js",
|
||||||
"https://cdnjs.cloudflare.com/ajax/libs/ember.js/2.12.2/ember.prod.js",
|
"https://cdnjs.cloudflare.com/ajax/libs/ember.js/2.12.2/ember.prod.js",
|
||||||
|
|||||||
@@ -256,6 +256,7 @@ issue_3858: {
|
|||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
unsafe: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -254,6 +254,25 @@ duplicate_argname: {
|
|||||||
expect_stdout: "bar 42 foo 42 bar"
|
expect_stdout: "bar 42 foo 42 bar"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fraction: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
return arguments[0.3];
|
||||||
|
}("FAIL") || "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
return arguments[0.3];
|
||||||
|
}("FAIL") || "PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
issue_3273: {
|
issue_3273: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
|
|||||||
@@ -421,6 +421,7 @@ collapse_value: {
|
|||||||
arrows: true,
|
arrows: true,
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
unsafe: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -555,6 +556,75 @@ reduce_iife_3: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reduce_lambda_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = () => {
|
||||||
|
console.log(a, b);
|
||||||
|
};
|
||||||
|
var a = "foo", b = 42;
|
||||||
|
f();
|
||||||
|
b = "bar";
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var f = () => {
|
||||||
|
console.log("foo", b);
|
||||||
|
};
|
||||||
|
var b = 42;
|
||||||
|
f();
|
||||||
|
b = "bar";
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo 42",
|
||||||
|
"foo bar",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_lambda_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(f, a, b) {
|
||||||
|
f = () => {
|
||||||
|
console.log(a, b);
|
||||||
|
};
|
||||||
|
a = "foo", b = 42;
|
||||||
|
f();
|
||||||
|
b = "bar";
|
||||||
|
f();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(f, a, b) {
|
||||||
|
f = () => {
|
||||||
|
console.log("foo", b);
|
||||||
|
};
|
||||||
|
b = 42;
|
||||||
|
f();
|
||||||
|
b = "bar";
|
||||||
|
f();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo 42",
|
||||||
|
"foo bar",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
single_use_recursive: {
|
single_use_recursive: {
|
||||||
options = {
|
options = {
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
|
|||||||
@@ -672,3 +672,77 @@ issue_4827_3: {
|
|||||||
expect_stdout: "undefined"
|
expect_stdout: "undefined"
|
||||||
node_version: ">=15"
|
node_version: ">=15"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4876: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
var a = null;
|
||||||
|
var b = a &&= 42;
|
||||||
|
b.p;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
var a = null;
|
||||||
|
var b = a &&= 42;
|
||||||
|
b.p;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4924_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b;
|
||||||
|
console.log("PASS");
|
||||||
|
a = function() {};
|
||||||
|
b = function() {}(b ||= a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b;
|
||||||
|
console.log("PASS");
|
||||||
|
b = void (b ||= function() {});
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4924_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
dead_code: true,
|
||||||
|
passes: 2,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b;
|
||||||
|
console.log("PASS");
|
||||||
|
a = function() {};
|
||||||
|
b = function() {}(b ||= a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|||||||
@@ -227,9 +227,7 @@ inline_await_1_trim: {
|
|||||||
console.log("PASS");
|
console.log("PASS");
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(async function() {
|
void 0;
|
||||||
await 0;
|
|
||||||
})();
|
|
||||||
console.log("PASS");
|
console.log("PASS");
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
@@ -334,7 +332,7 @@ inline_await_3_trim: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(async function() {
|
(async function() {
|
||||||
return a = "PASS", b = console.log, await b(a);
|
return a = "PASS", b = console.log, b(a);
|
||||||
var a, b;
|
var a, b;
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
@@ -557,6 +555,51 @@ collapse_property_lambda: {
|
|||||||
node_version: ">=8"
|
node_version: ">=8"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drop_async_1: {
|
||||||
|
options = {
|
||||||
|
awaits: true,
|
||||||
|
inline: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
(async function() {
|
||||||
|
a *= 7;
|
||||||
|
})();
|
||||||
|
return a;
|
||||||
|
}(6));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
void (a *= 7);
|
||||||
|
return a;
|
||||||
|
}(6));
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_async_2: {
|
||||||
|
options = {
|
||||||
|
awaits: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
(async b => await (a *= b))(7);
|
||||||
|
return a;
|
||||||
|
}(6));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(42);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
drop_return: {
|
drop_return: {
|
||||||
options = {
|
options = {
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -1531,3 +1574,475 @@ issue_4764_3: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=8"
|
node_version: ">=8"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4972_1: {
|
||||||
|
options = {
|
||||||
|
awaits: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("foo");
|
||||||
|
(async function() {
|
||||||
|
try {
|
||||||
|
return await "bar";
|
||||||
|
} finally {
|
||||||
|
console.log("baz");
|
||||||
|
}
|
||||||
|
})().then(console.log);
|
||||||
|
console.log("moo");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("foo");
|
||||||
|
(async function() {
|
||||||
|
try {
|
||||||
|
return await "bar";
|
||||||
|
} finally {
|
||||||
|
console.log("baz");
|
||||||
|
}
|
||||||
|
})().then(console.log);
|
||||||
|
console.log("moo");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"moo",
|
||||||
|
"baz",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4972_2: {
|
||||||
|
options = {
|
||||||
|
awaits: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("foo");
|
||||||
|
(async function() {
|
||||||
|
try {
|
||||||
|
console.log("bar");
|
||||||
|
} finally {
|
||||||
|
return await "baz";
|
||||||
|
}
|
||||||
|
})().then(console.log);
|
||||||
|
console.log("moo");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("foo");
|
||||||
|
(async function() {
|
||||||
|
try {
|
||||||
|
console.log("bar");
|
||||||
|
} finally {
|
||||||
|
return "baz";
|
||||||
|
}
|
||||||
|
})().then(console.log);
|
||||||
|
console.log("moo");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"moo",
|
||||||
|
"baz",
|
||||||
|
]
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4972_3: {
|
||||||
|
options = {
|
||||||
|
awaits: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("foo");
|
||||||
|
try {
|
||||||
|
(async function() {
|
||||||
|
return await "bar";
|
||||||
|
})().then(console.log);
|
||||||
|
} finally {
|
||||||
|
console.log("baz");
|
||||||
|
}
|
||||||
|
console.log("moo");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("foo");
|
||||||
|
try {
|
||||||
|
(async function() {
|
||||||
|
return "bar";
|
||||||
|
})().then(console.log);
|
||||||
|
} finally {
|
||||||
|
console.log("baz");
|
||||||
|
}
|
||||||
|
console.log("moo");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"baz",
|
||||||
|
"moo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4974: {
|
||||||
|
options = {
|
||||||
|
awaits: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(async function f() {
|
||||||
|
return 42 in f();
|
||||||
|
})();
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(async function f() {
|
||||||
|
return 42 in f();
|
||||||
|
})();
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4975: {
|
||||||
|
options = {
|
||||||
|
awaits: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(async function f(a) {
|
||||||
|
try {
|
||||||
|
if (a) console.log(typeof f());
|
||||||
|
} catch (e) {}
|
||||||
|
})(42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(async function f(a) {
|
||||||
|
try {
|
||||||
|
if (a) console.log(typeof f());
|
||||||
|
} catch (e) {}
|
||||||
|
})(42);
|
||||||
|
}
|
||||||
|
expect_stdout: "object"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4987: {
|
||||||
|
options = {
|
||||||
|
awaits: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(async function() {
|
||||||
|
try {
|
||||||
|
await 42;
|
||||||
|
} finally {
|
||||||
|
console.log("foo");
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
console.log("bar");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(async function() {
|
||||||
|
try {
|
||||||
|
await 0;
|
||||||
|
} finally {
|
||||||
|
console.log("foo");
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
console.log("bar");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"bar",
|
||||||
|
"foo",
|
||||||
|
]
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5001: {
|
||||||
|
options = {
|
||||||
|
awaits: true,
|
||||||
|
inline: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0;
|
||||||
|
(async function() {
|
||||||
|
a++ | await 42;
|
||||||
|
})();
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0;
|
||||||
|
void a++;
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5019_1: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
(async function() {
|
||||||
|
await 42;
|
||||||
|
console.log(a);
|
||||||
|
})();
|
||||||
|
a = "PASS";
|
||||||
|
})("FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
(async function() {
|
||||||
|
await 42;
|
||||||
|
console.log(a);
|
||||||
|
})();
|
||||||
|
a = "PASS";
|
||||||
|
})("FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5019_2: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("sync", function(a) {
|
||||||
|
(async function() {
|
||||||
|
console.log(await "async", a);
|
||||||
|
})();
|
||||||
|
return a = "PASS";
|
||||||
|
}("FAIL"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("sync", function(a) {
|
||||||
|
(async function() {
|
||||||
|
console.log(await "async", a);
|
||||||
|
})();
|
||||||
|
return a = "PASS";
|
||||||
|
}("FAIL"));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"sync PASS",
|
||||||
|
"async PASS",
|
||||||
|
]
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5019_3: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
for (var i in "foo") {
|
||||||
|
(function(a) {
|
||||||
|
(async function() {
|
||||||
|
console.log(await "async", a);
|
||||||
|
})();
|
||||||
|
})(i);
|
||||||
|
console.log("sync", i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (var i in "foo") {
|
||||||
|
(function(a) {
|
||||||
|
(async function() {
|
||||||
|
console.log(await "async", a);
|
||||||
|
})();
|
||||||
|
})(i);
|
||||||
|
console.log("sync", i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"sync 0",
|
||||||
|
"sync 1",
|
||||||
|
"sync 2",
|
||||||
|
"async 0",
|
||||||
|
"async 1",
|
||||||
|
"async 2",
|
||||||
|
]
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5023_1: {
|
||||||
|
options = {
|
||||||
|
awaits: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(async function() {
|
||||||
|
let a = a;
|
||||||
|
})();
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(async function() {
|
||||||
|
let a = a;
|
||||||
|
})();
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5023_2: {
|
||||||
|
options = {
|
||||||
|
awaits: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(async function() {
|
||||||
|
let a;
|
||||||
|
a = a;
|
||||||
|
})();
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
let a;
|
||||||
|
a = a;
|
||||||
|
})();
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5032_normal: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
webkit: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function log(value) {
|
||||||
|
console.log(value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
async function f(a) {
|
||||||
|
var b = log(a), c = b;
|
||||||
|
log(b);
|
||||||
|
log(c);
|
||||||
|
}
|
||||||
|
f("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function log(value) {
|
||||||
|
console.log(value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
async function f(c) {
|
||||||
|
var b = log(c), c = b;
|
||||||
|
log(b);
|
||||||
|
log(c);
|
||||||
|
}
|
||||||
|
f("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"PASS",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5032_webkit: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
webkit: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function log(value) {
|
||||||
|
console.log(value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
async function f(a) {
|
||||||
|
var b = log(a), c = b;
|
||||||
|
log(b);
|
||||||
|
log(c);
|
||||||
|
}
|
||||||
|
f("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function log(value) {
|
||||||
|
console.log(value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
async function f(a) {
|
||||||
|
var b = log(a), c = b;
|
||||||
|
log(b);
|
||||||
|
log(c);
|
||||||
|
}
|
||||||
|
f("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"PASS",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5034: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var await = function f() {
|
||||||
|
return async function() {
|
||||||
|
return f;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
await()().then(function(value) {
|
||||||
|
console.log(value === await ? "PASS" : "FAIL");
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
var await = function f() {
|
||||||
|
return async function() {
|
||||||
|
return f;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
await()().then(function(value) {
|
||||||
|
console.log(value === await ? "PASS" : "FAIL");
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5070: {
|
||||||
|
options = {
|
||||||
|
awaits: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(async function() {
|
||||||
|
try {
|
||||||
|
for await (var a of console.log("PASS"));
|
||||||
|
} catch (e) {}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(async function() {
|
||||||
|
try {
|
||||||
|
for await (var a of console.log("PASS"));
|
||||||
|
} catch (e) {}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=10"
|
||||||
|
}
|
||||||
|
|||||||
@@ -29,6 +29,404 @@ iife_boolean_context: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
de_morgan_1a: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return a || a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(42));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(42));
|
||||||
|
}
|
||||||
|
expect_stdout: "null 42"
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_1b: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return a && a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(42));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(42));
|
||||||
|
}
|
||||||
|
expect_stdout: "null 42"
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_1c: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(delete (NaN && NaN));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(delete (0, NaN));
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_2a: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a || (a || b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a || b;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined {}",
|
||||||
|
"42 42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_2b: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a || (a && b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null",
|
||||||
|
"42 42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_2c: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a && (a || b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null",
|
||||||
|
"42 42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_2d: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a && (a && b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a && b;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null",
|
||||||
|
"undefined {}",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_3a: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a || ((a || b) || c);
|
||||||
|
}
|
||||||
|
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
||||||
|
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a || b || c;
|
||||||
|
}
|
||||||
|
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
||||||
|
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined {} true true",
|
||||||
|
"42 42 42 42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_3b: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a || ((a || b) && c);
|
||||||
|
}
|
||||||
|
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
||||||
|
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a || b && c;
|
||||||
|
}
|
||||||
|
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
||||||
|
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"false false undefined {}",
|
||||||
|
"42 42 42 42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_3c: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a || ((a && b) || c);
|
||||||
|
}
|
||||||
|
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
||||||
|
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a || c;
|
||||||
|
}
|
||||||
|
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
||||||
|
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined {} undefined {}",
|
||||||
|
"42 42 42 42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_3d: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a || ((a && b) && c);
|
||||||
|
}
|
||||||
|
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
||||||
|
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
||||||
|
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null null null",
|
||||||
|
"42 42 42 42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_3e: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a && ((a || b) || c);
|
||||||
|
}
|
||||||
|
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
||||||
|
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
||||||
|
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null null null",
|
||||||
|
"42 42 42 42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_3f: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a && ((a || b) && c);
|
||||||
|
}
|
||||||
|
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
||||||
|
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a && c;
|
||||||
|
}
|
||||||
|
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
||||||
|
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null null null",
|
||||||
|
"undefined {} undefined {}",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_3g: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a && ((a && b) || c);
|
||||||
|
}
|
||||||
|
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
||||||
|
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a && (b || c);
|
||||||
|
}
|
||||||
|
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
||||||
|
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null null null",
|
||||||
|
"undefined {} true true",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_3h: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a && ((a && b) && c);
|
||||||
|
}
|
||||||
|
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
||||||
|
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a && b && c;
|
||||||
|
}
|
||||||
|
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
||||||
|
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null null null",
|
||||||
|
"false false undefined {}",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
conditional_chain: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a ? a : b ? b : 42;
|
||||||
|
}
|
||||||
|
console.log(f("PASS", "FAIL"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a || b || 42;
|
||||||
|
}
|
||||||
|
console.log(f("PASS", "FAIL"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
negated_if: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
if (!a)
|
||||||
|
return a ? "FAIL" : "PASS";
|
||||||
|
}(!console));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
if (!a)
|
||||||
|
return "PASS";
|
||||||
|
}(!console));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
issue_3465_1: {
|
issue_3465_1: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
@@ -181,3 +579,121 @@ issue_4374: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "0"
|
expect_stdout: "0"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5028_1: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
console.log(function() {
|
||||||
|
return a-- ? a-- ? "FAIL 1" : "PASS" : "FAIL 2";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
console.log(function() {
|
||||||
|
return a-- ? a-- ? "FAIL 1" : "PASS" : "FAIL 2";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5028_2: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
(function() {
|
||||||
|
if (a--)
|
||||||
|
if (a--)
|
||||||
|
a = "FAIL";
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
(function() {
|
||||||
|
a-- && a-- && (a = "FAIL");
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "-1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5028_3: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
(function() {
|
||||||
|
if (a--)
|
||||||
|
if (a--)
|
||||||
|
a = "FAIL";
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
(function() {
|
||||||
|
a-- && a-- && (a = "FAIL");
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "-1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5041_1: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 42;
|
||||||
|
if (a)
|
||||||
|
if ([ a = null ])
|
||||||
|
if (a)
|
||||||
|
console.log("FAIL");
|
||||||
|
else
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 42;
|
||||||
|
a && [ a = null ] && (a ? console.log("FAIL") : console.log("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5041_2: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
if (!a)
|
||||||
|
if (a = 42)
|
||||||
|
if (a)
|
||||||
|
console.log("PASS");
|
||||||
|
else
|
||||||
|
console.log("FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
a || (a = 42) && (a ? console.log("PASS") : console.log("FAIL"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ fields: {
|
|||||||
console.log(k, o[k]);
|
console.log(k, o[k]);
|
||||||
console.log(o.q);
|
console.log(o.q);
|
||||||
}
|
}
|
||||||
expect_exact: 'var o=new class A{"#p";static #p="PASS";async;get q(){return A.#p}[6*7]=console?"foo":"bar"};for(var k in o)console.log(k,o[k]);console.log(o.q);'
|
expect_exact: 'var o=new class A{"#p";static#p="PASS";async;get q(){return A.#p}[6*7]=console?"foo":"bar"};for(var k in o)console.log(k,o[k]);console.log(o.q);'
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"42 foo",
|
"42 foo",
|
||||||
"#p undefined",
|
"#p undefined",
|
||||||
@@ -136,7 +136,7 @@ private_methods: {
|
|||||||
}
|
}
|
||||||
}().q.then(console.log);
|
}().q.then(console.log);
|
||||||
}
|
}
|
||||||
expect_exact: "(new class A{static*#f(){yield 3*A.#p}async #g(){for(var a of A.#f())return a*await 2}static get #p(){return 7}get q(){return this.#g()}}).q.then(console.log);"
|
expect_exact: "(new class A{static*#f(){yield 3*A.#p}async#g(){for(var a of A.#f())return a*await 2}static get#p(){return 7}get q(){return this.#g()}}).q.then(console.log);"
|
||||||
expect_stdout: "42"
|
expect_stdout: "42"
|
||||||
node_version: ">=14.6"
|
node_version: ">=14.6"
|
||||||
}
|
}
|
||||||
@@ -260,6 +260,9 @@ block_scoped: {
|
|||||||
expect: {
|
expect: {
|
||||||
"use strict";
|
"use strict";
|
||||||
0;
|
0;
|
||||||
|
{
|
||||||
|
class A {}
|
||||||
|
}
|
||||||
if (console) {
|
if (console) {
|
||||||
class B {}
|
class B {}
|
||||||
}
|
}
|
||||||
@@ -269,6 +272,38 @@ block_scoped: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
retain_declaration: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
console.log(function() {
|
||||||
|
return a;
|
||||||
|
class a {}
|
||||||
|
}());
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
console.log(function() {
|
||||||
|
return a;
|
||||||
|
class a {}
|
||||||
|
}());
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
drop_extends: {
|
drop_extends: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
@@ -632,6 +667,7 @@ collapse_non_strict: {
|
|||||||
collapse_rhs: {
|
collapse_rhs: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -777,7 +813,7 @@ unused_await: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
node_version: ">=12"
|
node_version: ">=12 <16"
|
||||||
}
|
}
|
||||||
|
|
||||||
computed_key_side_effects: {
|
computed_key_side_effects: {
|
||||||
@@ -937,9 +973,9 @@ issue_4681: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(function(a) {
|
console.log(function(a) {
|
||||||
class A {
|
(class {
|
||||||
static p = a = this;
|
static p = a = this;
|
||||||
}
|
});
|
||||||
return typeof a;
|
return typeof a;
|
||||||
}());
|
}());
|
||||||
}
|
}
|
||||||
@@ -1121,7 +1157,7 @@ issue_4705: {
|
|||||||
|
|
||||||
issue_4720: {
|
issue_4720: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -1363,9 +1399,9 @@ issue_4821_1: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a;
|
var a;
|
||||||
class A {
|
(class {
|
||||||
static p = void (a = this);
|
static p = void (a = this);
|
||||||
}
|
});
|
||||||
console.log(typeof a);
|
console.log(typeof a);
|
||||||
}
|
}
|
||||||
expect_stdout: "function"
|
expect_stdout: "function"
|
||||||
@@ -1541,3 +1577,492 @@ issue_4848: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drop_unused_self_reference: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
class A {}
|
||||||
|
(A.p = A).q = console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4951_1: {
|
||||||
|
input: {
|
||||||
|
class A {
|
||||||
|
static#p = console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: 'class A{static#p=console.log("PASS")}'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=12"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4951_2: {
|
||||||
|
input: {
|
||||||
|
new class {
|
||||||
|
constructor() {
|
||||||
|
this.#f().then(console.log);
|
||||||
|
}
|
||||||
|
async#f() {
|
||||||
|
return await "PASS";
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_exact: 'new class{constructor(){this.#f().then(console.log)}async#f(){return await"PASS"}};'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14.6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4962_1: {
|
||||||
|
options = {
|
||||||
|
ie: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
function f() {
|
||||||
|
while (console.log(typeof g));
|
||||||
|
}
|
||||||
|
class A {
|
||||||
|
static p = f();
|
||||||
|
}
|
||||||
|
})(function g() {});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function g() {}),
|
||||||
|
void function() {
|
||||||
|
while (console.log(typeof g));
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=12"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4962_2: {
|
||||||
|
options = {
|
||||||
|
ie: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f() {}(function g() {
|
||||||
|
function h() {
|
||||||
|
f;
|
||||||
|
}
|
||||||
|
class A {
|
||||||
|
static p = h();
|
||||||
|
}
|
||||||
|
}, typeof g));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function f() {}(function g() {
|
||||||
|
f;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=12"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4982_1: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
try {} catch (e) {
|
||||||
|
class A extends 42 {}
|
||||||
|
}
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
{
|
||||||
|
class A {}
|
||||||
|
}
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4982_2: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
try {} catch (e) {
|
||||||
|
class A {
|
||||||
|
static p = a = "FAIL";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
{
|
||||||
|
class A {}
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=12"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4992: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class A {
|
||||||
|
static P = this;
|
||||||
|
get p() {}
|
||||||
|
}
|
||||||
|
console.log(typeof A.P);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(typeof class {
|
||||||
|
static P = this;
|
||||||
|
get p() {}
|
||||||
|
}.P);
|
||||||
|
}
|
||||||
|
expect_stdout: "function"
|
||||||
|
node_version: ">=12"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4996_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
console.log(new class A {
|
||||||
|
p = a-- && new A();
|
||||||
|
}().p.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
console.log(new class A {
|
||||||
|
p = a-- && new A();
|
||||||
|
}().p.p);
|
||||||
|
}
|
||||||
|
expect_stdout: "0"
|
||||||
|
node_version: ">=12"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4996_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
console.log(new class A {
|
||||||
|
p = a-- && new A();
|
||||||
|
}().p.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
console.log(new class A {
|
||||||
|
p = a-- && new A();
|
||||||
|
}().p.p);
|
||||||
|
}
|
||||||
|
expect_stdout: "0"
|
||||||
|
node_version: ">=12"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5015_1: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
var a;
|
||||||
|
try {
|
||||||
|
(class a {
|
||||||
|
[a]() {}
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
var a;
|
||||||
|
try {
|
||||||
|
(class a {
|
||||||
|
[a]() {}
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5015_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
try {
|
||||||
|
new class A {
|
||||||
|
[(A, 42)]() {}
|
||||||
|
}();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
try {
|
||||||
|
new class A {
|
||||||
|
[(A, 42)]() {}
|
||||||
|
}();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5015_3: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
(class A {
|
||||||
|
static f() {
|
||||||
|
return A;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5053_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
try {
|
||||||
|
console.log(new class A {
|
||||||
|
constructor() {
|
||||||
|
A = 42;
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
try {
|
||||||
|
console.log(new class A {
|
||||||
|
constructor() {
|
||||||
|
A = 42;
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5053_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
try {
|
||||||
|
console.log(new class A {
|
||||||
|
f() {
|
||||||
|
A = 42;
|
||||||
|
}
|
||||||
|
}().f());
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
try {
|
||||||
|
console.log(new class A {
|
||||||
|
f() {
|
||||||
|
A = 42;
|
||||||
|
}
|
||||||
|
}().f());
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5053_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
console.log(new class A {
|
||||||
|
p = A = 42;
|
||||||
|
}().p);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
console.log(new class A {
|
||||||
|
p = A = 42;
|
||||||
|
}().p);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=12"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5053_4: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
class A {
|
||||||
|
constructor() {
|
||||||
|
A = 42;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
console.log(new A());
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
class A {
|
||||||
|
constructor() {
|
||||||
|
A = 42;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
console.log(new A());
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5082_1: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
class A {
|
||||||
|
p = console.log("PASS");
|
||||||
|
q() {}
|
||||||
|
}
|
||||||
|
class B {
|
||||||
|
static P = new A();
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
class A {
|
||||||
|
p = console.log("PASS");
|
||||||
|
q() {}
|
||||||
|
}
|
||||||
|
new A();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=12"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5082_2: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
class A {
|
||||||
|
p = console.log("PASS");
|
||||||
|
q() {}
|
||||||
|
}
|
||||||
|
class B {
|
||||||
|
static P = new A();
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
void new class {
|
||||||
|
p = console.log("PASS");
|
||||||
|
q() {}
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=12"
|
||||||
|
}
|
||||||
|
|||||||
@@ -2264,6 +2264,7 @@ var_defs: {
|
|||||||
properties: true,
|
properties: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -2486,6 +2487,7 @@ issue_1858: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
pure_getters: true,
|
pure_getters: true,
|
||||||
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -2907,6 +2909,7 @@ compound_assignment_2: {
|
|||||||
issue_2187_1: {
|
issue_2187_1: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -4271,6 +4274,7 @@ issue_2436_14: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
|
unsafe: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -4761,6 +4765,7 @@ unsafe_builtin: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -6003,7 +6008,7 @@ issue_3215_1: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
ie8: false,
|
ie: false,
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -6025,7 +6030,7 @@ issue_3215_2: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -6050,7 +6055,7 @@ issue_3215_3: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
ie8: false,
|
ie: false,
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -6073,7 +6078,7 @@ issue_3215_4: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -6965,6 +6970,7 @@ sequence_in_iife_2: {
|
|||||||
inline: true,
|
inline: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -6976,7 +6982,7 @@ sequence_in_iife_2: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a = "foo", b = 42;
|
var a = "foo", b = 42;
|
||||||
console.log(a, b = a);
|
console.log(b = a, b);
|
||||||
}
|
}
|
||||||
expect_stdout: "foo foo"
|
expect_stdout: "foo foo"
|
||||||
}
|
}
|
||||||
@@ -6988,6 +6994,7 @@ sequence_in_iife_3: {
|
|||||||
passes: 2,
|
passes: 2,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -7092,6 +7099,7 @@ setter_side_effect: {
|
|||||||
substitution_assign: {
|
substitution_assign: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1(a, b) {
|
function f1(a, b) {
|
||||||
@@ -7112,8 +7120,7 @@ substitution_assign: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f1(a, b) {
|
function f1(a, b) {
|
||||||
f1 = a;
|
console.log(f1 = a, a);
|
||||||
console.log(a, a);
|
|
||||||
}
|
}
|
||||||
function f2(a, b) {
|
function f2(a, b) {
|
||||||
a = 1 + (b = a);
|
a = 1 + (b = a);
|
||||||
@@ -7917,6 +7924,7 @@ issue_3744: {
|
|||||||
assign_value_def: {
|
assign_value_def: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -7957,6 +7965,7 @@ join_vars_value_def: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -7996,6 +8005,7 @@ join_vars_value_def: {
|
|||||||
var_value_def: {
|
var_value_def: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -8033,6 +8043,7 @@ var_value_def: {
|
|||||||
mangleable_var: {
|
mangleable_var: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -8064,6 +8075,69 @@ mangleable_var: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mangleable_assignment_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
p: function() {
|
||||||
|
return 6;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
(function() {
|
||||||
|
var a, b = a = o.p();
|
||||||
|
console.log(a * (b / a + b));
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
p: function() {
|
||||||
|
return 6;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
(function() {
|
||||||
|
var a;
|
||||||
|
a = o.p();
|
||||||
|
console.log(a * (a / a + a));
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangleable_assignment_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
p: function() {
|
||||||
|
return 6;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
(function(a, b) {
|
||||||
|
b = a = o.p();
|
||||||
|
console.log(a * (b / a + b));
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
p: function() {
|
||||||
|
return 6;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
(function(a, b) {
|
||||||
|
a = o.p();
|
||||||
|
console.log(a * (a / a + a));
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
issue_3884_1: {
|
issue_3884_1: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
@@ -8499,7 +8573,7 @@ issue_4047_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
var b = 1;
|
var b = 1;
|
||||||
var a;
|
var a;
|
||||||
console.log((a = --b + ((a = 0) !== typeof A), +void ((a >>= 0) && console.log("PASS"))));
|
console.log((a = --b + (0 !== typeof A), +void ((a >>= 0) && console.log("PASS"))));
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"PASS",
|
"PASS",
|
||||||
@@ -8789,7 +8863,7 @@ issue_4732_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
var a = 0;
|
var a = 0;
|
||||||
(function(b) {
|
(function(b) {
|
||||||
(b = a++) && (b && console.log("PASS"));
|
(b = a++) && console.log("PASS");
|
||||||
})(a++);
|
})(a++);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
@@ -8878,6 +8952,8 @@ dot_non_local: {
|
|||||||
issue_4806: {
|
issue_4806: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a, o = {
|
var a, o = {
|
||||||
@@ -8901,6 +8977,7 @@ issue_4806: {
|
|||||||
issue_4852: {
|
issue_4852: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = "PASS";
|
var a = "PASS";
|
||||||
@@ -8932,3 +9009,406 @@ issue_4852: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4865: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var NaN;
|
||||||
|
var a = NaN = "PASS";
|
||||||
|
console.log(a, NaN);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var NaN;
|
||||||
|
var a = NaN = "PASS";
|
||||||
|
console.log(a, NaN);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4868: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
(function(b) {
|
||||||
|
console.log(b[0]);
|
||||||
|
})(a = [ "PASS" ], a = [ "FAIL" ]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
(function(b) {
|
||||||
|
console.log(b[0]);
|
||||||
|
})(a = [ "PASS" ], a = [ "FAIL" ]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4874: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
a = null;
|
||||||
|
(function(b) {
|
||||||
|
for (var c in b = b && b[console.log("PASS")])
|
||||||
|
console;
|
||||||
|
})(a = 42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
null;
|
||||||
|
(function(b) {
|
||||||
|
for (var c in a && a[console.log("PASS")])
|
||||||
|
console;
|
||||||
|
})(a = 42);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4891: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b;
|
||||||
|
a++;
|
||||||
|
console.log(b = a, b);
|
||||||
|
b--;
|
||||||
|
a.a += 0;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b;
|
||||||
|
a++;
|
||||||
|
console.log(a, b = a);
|
||||||
|
b--;
|
||||||
|
a.a += 0;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1 1",
|
||||||
|
"0",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4895: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b;
|
||||||
|
(function f() {
|
||||||
|
a = 42;
|
||||||
|
})();
|
||||||
|
console.log((b = a) || b, b += 0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, b;
|
||||||
|
(function f() {
|
||||||
|
a = 42;
|
||||||
|
})();
|
||||||
|
console.log((b = a) || b, b += 0);
|
||||||
|
}
|
||||||
|
expect_stdout: "42 42"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4908: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
join_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0;
|
||||||
|
var b;
|
||||||
|
console || a++;
|
||||||
|
var c = d = a, d = [ c && c, d += 42 ];
|
||||||
|
console.log(d[1]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b;
|
||||||
|
console || a++;
|
||||||
|
var c = a, d = [ (d = a) && d, d += 42 ];
|
||||||
|
console.log(d[1]);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4910: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "foo", b;
|
||||||
|
var c = b = a;
|
||||||
|
1 && c[a = "bar"];
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "foo", b;
|
||||||
|
var c = b = a;
|
||||||
|
1 && b[a = "bar"];
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: "bar foo"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4914: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(typeof function f() {
|
||||||
|
f.__proto__ = 42;
|
||||||
|
return f.__proto__;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(typeof function f() {
|
||||||
|
f.__proto__ = 42;
|
||||||
|
return f.__proto__;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "function"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4918: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
({
|
||||||
|
get 42() {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}[a = "PASS", 42] += "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "FAIL";
|
||||||
|
({
|
||||||
|
get 42() {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}[a = "PASS", 42] += "PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4920_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS", b;
|
||||||
|
({
|
||||||
|
get PASS() {
|
||||||
|
a = "FAIL";
|
||||||
|
},
|
||||||
|
})[b = a];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS", b;
|
||||||
|
({
|
||||||
|
get PASS() {
|
||||||
|
a = "FAIL";
|
||||||
|
},
|
||||||
|
})[b = a];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4920_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
get PASS() {
|
||||||
|
a = "FAIL";
|
||||||
|
},
|
||||||
|
};
|
||||||
|
var a = "PASS", b;
|
||||||
|
o[b = a];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
get PASS() {
|
||||||
|
a = "FAIL";
|
||||||
|
},
|
||||||
|
};
|
||||||
|
var a = "PASS", b;
|
||||||
|
o[b = a];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4920_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var log = console.log;
|
||||||
|
var o = {
|
||||||
|
get PASS() {
|
||||||
|
a = "FAIL";
|
||||||
|
},
|
||||||
|
};
|
||||||
|
var a = "PASS", b;
|
||||||
|
o[b = a];
|
||||||
|
log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var log = console.log;
|
||||||
|
var o = {
|
||||||
|
get PASS() {
|
||||||
|
a = "FAIL";
|
||||||
|
},
|
||||||
|
};
|
||||||
|
var a = "PASS", b;
|
||||||
|
o[b = a];
|
||||||
|
log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4935: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
var b;
|
||||||
|
var c = b = a;
|
||||||
|
console || c(a++);
|
||||||
|
--b;
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
var b;
|
||||||
|
var c = b = a;
|
||||||
|
console || a(a++);
|
||||||
|
--b;
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 0"
|
||||||
|
}
|
||||||
|
|
||||||
|
inline_throw: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
(function() {
|
||||||
|
return function(a) {
|
||||||
|
return function(b) {
|
||||||
|
throw b;
|
||||||
|
}(a);
|
||||||
|
};
|
||||||
|
})()("PASS");
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
(function(a) {
|
||||||
|
return function() {
|
||||||
|
throw a;
|
||||||
|
}();
|
||||||
|
})("PASS");
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4977_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
a = "PASS";
|
||||||
|
console.log(o.p, a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "FAIL";
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
a = "PASS";
|
||||||
|
console.log(o.p, a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4977_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, o = {
|
||||||
|
get p() {
|
||||||
|
return a = "PASS";
|
||||||
|
},
|
||||||
|
};
|
||||||
|
if (console) {
|
||||||
|
var a = "FAIL";
|
||||||
|
console.log(o.p, a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, o = {
|
||||||
|
get p() {
|
||||||
|
return a = "PASS";
|
||||||
|
},
|
||||||
|
};
|
||||||
|
if (console) {
|
||||||
|
var a = "FAIL";
|
||||||
|
console.log(o.p, a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -822,6 +822,33 @@ cond_13: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cond_14: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
if (a)
|
||||||
|
if (a)
|
||||||
|
console.log("PASS");
|
||||||
|
else
|
||||||
|
console.log("FAIL");
|
||||||
|
}
|
||||||
|
f(null);
|
||||||
|
f(42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
a && console.log("PASS");
|
||||||
|
}
|
||||||
|
f(null);
|
||||||
|
f(42);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
ternary_boolean_consequent: {
|
ternary_boolean_consequent: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
|
|||||||
@@ -486,7 +486,7 @@ do_continue: {
|
|||||||
|
|
||||||
catch_ie8_1: {
|
catch_ie8_1: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -506,7 +506,7 @@ catch_ie8_1: {
|
|||||||
catch_ie8_2: {
|
catch_ie8_2: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -727,7 +727,7 @@ issue_4193: {
|
|||||||
|
|
||||||
issue_4195: {
|
issue_4195: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(function f(a) {
|
console.log(function f(a) {
|
||||||
@@ -1131,7 +1131,7 @@ issue_4225: {
|
|||||||
|
|
||||||
issue_4229: {
|
issue_4229: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1151,7 +1151,7 @@ issue_4229: {
|
|||||||
|
|
||||||
issue_4231: {
|
issue_4231: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1535,3 +1535,160 @@ issue_4848: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4954_1: {
|
||||||
|
rename = true
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
(function() {
|
||||||
|
{
|
||||||
|
const a = "foo";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const a = "bar";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
(function() {
|
||||||
|
{
|
||||||
|
const a = "foo";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const b = "bar";
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4954_2: {
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
const a = null;
|
||||||
|
(function(b) {
|
||||||
|
for (const a in null);
|
||||||
|
for (const a in b)
|
||||||
|
console.log("PASS");
|
||||||
|
})([ null ]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
const a = null;
|
||||||
|
(function(o) {
|
||||||
|
for (const n in null);
|
||||||
|
for (const n in o)
|
||||||
|
console.log("PASS");
|
||||||
|
})([ null ]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4960: {
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
var a;
|
||||||
|
(function() {
|
||||||
|
{
|
||||||
|
const a = console.log("PASS");
|
||||||
|
}
|
||||||
|
try {} catch (e) {
|
||||||
|
const a = console.log("FAIL");
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
var a;
|
||||||
|
(function() {
|
||||||
|
{
|
||||||
|
const o = console.log("PASS");
|
||||||
|
}
|
||||||
|
try {} catch (o) {
|
||||||
|
const c = console.log("FAIL");
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4965_1: {
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
try {
|
||||||
|
c;
|
||||||
|
} catch (a) {
|
||||||
|
{
|
||||||
|
const a = 1;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const a = console.log(typeof c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
try {
|
||||||
|
c;
|
||||||
|
} catch (t) {
|
||||||
|
{
|
||||||
|
const c = 1;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const t = console.log(typeof c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4965_2: {
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (e) {
|
||||||
|
try {
|
||||||
|
{
|
||||||
|
const e = 2;
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
const e = 3;
|
||||||
|
console.log(typeof t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (o) {
|
||||||
|
try {
|
||||||
|
{
|
||||||
|
const t = 2;
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
const o = 3;
|
||||||
|
console.log(typeof t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|||||||
@@ -939,6 +939,185 @@ catch_return_assign: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
catch_return_assign_may_throw: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
return e = console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
return console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
finally_return_assign: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} finally {
|
||||||
|
return a = "PASS";
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} finally {
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
last_assign_statement: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
a = a("PASS");
|
||||||
|
}
|
||||||
|
f(console.log);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
a("PASS");
|
||||||
|
}
|
||||||
|
f(console.log);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
last_assign_if_else: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
if (a)
|
||||||
|
a = console.log("foo");
|
||||||
|
else {
|
||||||
|
console.log("bar");
|
||||||
|
a = console.log("baz");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f(42);
|
||||||
|
f(null);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
if (a)
|
||||||
|
console.log("foo");
|
||||||
|
else {
|
||||||
|
console.log("bar");
|
||||||
|
console.log("baz");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f(42);
|
||||||
|
f(null);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"baz",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
last_assign_catch: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
e = console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
last_assign_finally: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
try {
|
||||||
|
throw a.log;
|
||||||
|
} catch (e) {
|
||||||
|
a = e;
|
||||||
|
} finally {
|
||||||
|
a = a("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f(console);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
try {
|
||||||
|
throw a.log;
|
||||||
|
} catch (e) {
|
||||||
|
a = e;
|
||||||
|
} finally {
|
||||||
|
a("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f(console);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
consecutive_assignments: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
while (a = void 0, a = "PASS", console.log(a));
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
while (void 0, a = "PASS", console.log(a));
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
issue_3578: {
|
issue_3578: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
@@ -1420,3 +1599,37 @@ issue_4570: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "NaN"
|
expect_stdout: "NaN"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5030: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a, b) {
|
||||||
|
a = function f() {
|
||||||
|
if (a)
|
||||||
|
if (b--)
|
||||||
|
setImmediate(f);
|
||||||
|
else
|
||||||
|
console.log("FAIL");
|
||||||
|
else
|
||||||
|
console.log("PASS");
|
||||||
|
}();
|
||||||
|
})(42, 1);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a, b) {
|
||||||
|
a = function f() {
|
||||||
|
if (a)
|
||||||
|
if (b--)
|
||||||
|
setImmediate(f);
|
||||||
|
else
|
||||||
|
console.log("FAIL");
|
||||||
|
else
|
||||||
|
console.log("PASS");
|
||||||
|
}();
|
||||||
|
})(42, 1);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=0.12"
|
||||||
|
}
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ object_shorthand_assign: {
|
|||||||
({ a = "PASS" } = 42);
|
({ a = "PASS" } = 42);
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect_exact: '({a:a="PASS"}=42);console.log(a);'
|
expect_exact: '({a="PASS"}=42);console.log(a);'
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
@@ -80,7 +80,7 @@ object_shorthand_declaration: {
|
|||||||
var { a = "PASS" } = 42;
|
var { a = "PASS" } = 42;
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect_exact: 'var{a:a="PASS"}=42;console.log(a);'
|
expect_exact: 'var{a="PASS"}=42;console.log(a);'
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
@@ -91,7 +91,7 @@ object_shorthand_function: {
|
|||||||
console.log(a);
|
console.log(a);
|
||||||
})(42);
|
})(42);
|
||||||
}
|
}
|
||||||
expect_exact: '(function({a:a="PASS"}){console.log(a)})(42);'
|
expect_exact: '(function({a="PASS"}){console.log(a)})(42);'
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
@@ -149,7 +149,7 @@ process_boolean_returns: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(function(a = console.log("FAIL 1")) {
|
console.log(function(a = console.log("FAIL 1")) {
|
||||||
return a() ? "PASS" : "FAIL 2";
|
return 42 ? "PASS" : "FAIL 2";
|
||||||
}(function() {
|
}(function() {
|
||||||
return 1;
|
return 1;
|
||||||
}));
|
}));
|
||||||
@@ -245,21 +245,64 @@ maintain_if: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
reduce_value: {
|
reduce_funarg: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
keep_fargs: false,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(function(a = "PASS") {
|
console.log(...function(a = "foo", b = "bar", c = "baz") {
|
||||||
return a;
|
return [ a, b, c ];
|
||||||
}());
|
}(void 0, null));
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log("PASS");
|
console.log(...function() {
|
||||||
|
return [ "foo", null, "baz" ];
|
||||||
|
}());
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "foo null baz"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_array: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var [ a = "foo", b = "bar", c = "baz" ] = [ void 0, null ];
|
||||||
|
console.log(a, b, c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var [ c = "baz" ] = [];
|
||||||
|
console.log("foo", null, c);
|
||||||
|
}
|
||||||
|
expect_stdout: "foo null baz"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_object: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var { a = "foo", b = "bar", c = "baz" } = { a: void 0, b: null };
|
||||||
|
console.log(a, b, c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var { c = "baz" } = {};
|
||||||
|
console.log("foo", null, c);
|
||||||
|
}
|
||||||
|
expect_stdout: "foo null baz"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -422,7 +465,9 @@ inline_loop_1: {
|
|||||||
inline_loop_2: {
|
inline_loop_2: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
|
sequences: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
while (function(a = [ "PASS" ]) {
|
while (function(a = [ "PASS" ]) {
|
||||||
@@ -432,10 +477,11 @@ inline_loop_2: {
|
|||||||
}());
|
}());
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
while (a = [ "PASS" ], a = function f(b) {
|
while (a = [ "PASS" ],
|
||||||
console.log(a[b]);
|
b = void 0,
|
||||||
}(0), void 0) ;
|
b = 0,
|
||||||
var a;
|
void (a = void console.log(a[b])));
|
||||||
|
var a, b;
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
@@ -598,6 +644,7 @@ unused_var_1: {
|
|||||||
|
|
||||||
unused_var_2: {
|
unused_var_2: {
|
||||||
options = {
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -609,11 +656,7 @@ unused_var_2: {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var {
|
console.log("PASS");
|
||||||
p: [] = [ console.log("FAIL") ],
|
|
||||||
} = {
|
|
||||||
p: [ console.log("PASS") ],
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
@@ -676,7 +719,7 @@ unused_value_var_2: {
|
|||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var [ a ] = [ "PASS" ];
|
var a = [ "PASS" ][0];
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
@@ -1257,7 +1300,7 @@ issue_4468: {
|
|||||||
expect: {
|
expect: {
|
||||||
(function() {
|
(function() {
|
||||||
var {
|
var {
|
||||||
[console.log("PASS")]: b = 0,
|
[console.log("PASS")]: b,
|
||||||
} = 0;
|
} = 0;
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
@@ -1416,6 +1459,7 @@ issue_4502_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
(function() {
|
(function() {
|
||||||
var a = "PASS";
|
var a = "PASS";
|
||||||
|
void 0,
|
||||||
console.log(a),
|
console.log(a),
|
||||||
a++,
|
a++,
|
||||||
void 0;
|
void 0;
|
||||||
@@ -1439,6 +1483,7 @@ issue_4502_2: {
|
|||||||
expect: {
|
expect: {
|
||||||
(function() {
|
(function() {
|
||||||
var a = "PASS";
|
var a = "PASS";
|
||||||
|
void 0,
|
||||||
console.log(a),
|
console.log(a),
|
||||||
a++,
|
a++,
|
||||||
void 0;
|
void 0;
|
||||||
@@ -1664,7 +1709,7 @@ issue_4588_2_evaluate: {
|
|||||||
|
|
||||||
issue_4817: {
|
issue_4817: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -1681,3 +1726,167 @@ issue_4817: {
|
|||||||
expect_stdout: "function"
|
expect_stdout: "function"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4854: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
(function(b = a = "foo") {
|
||||||
|
[] = "foo";
|
||||||
|
})();
|
||||||
|
a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(void 0);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4916: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var log = console.log;
|
||||||
|
(function(b = "foo") {
|
||||||
|
b.value = "FAIL";
|
||||||
|
b;
|
||||||
|
log(b.value);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var log = console.log;
|
||||||
|
(function(b = "foo") {
|
||||||
|
b.value = "FAIL";
|
||||||
|
b;
|
||||||
|
log(b.value);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4994: {
|
||||||
|
options = {
|
||||||
|
loops: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
(function(b = function() {
|
||||||
|
for (a in { PASS: 42 });
|
||||||
|
}()) {
|
||||||
|
var a;
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "FAIL";
|
||||||
|
(function(b = function() {
|
||||||
|
for (a in { PASS: 42 });
|
||||||
|
}()) {})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5057_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
sequences: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 42;
|
||||||
|
(function() {
|
||||||
|
var b = function(c = (console.log("foo"), b = a)) {
|
||||||
|
a && console.log("bar");
|
||||||
|
}();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 42;
|
||||||
|
console.log("foo"),
|
||||||
|
void (a && console.log("bar"));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5057_2: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function f(a) {
|
||||||
|
(function(b = console.log("FAIL")) {})(a);
|
||||||
|
})(42);
|
||||||
|
console.log(typeof b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
[ b = console.log("FAIL") ] = [ a ],
|
||||||
|
void 0;
|
||||||
|
var b;
|
||||||
|
})(42);
|
||||||
|
console.log(typeof b);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5057_3: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
(function f(b) {
|
||||||
|
(function(a = console.log("FAIL 1")) {})(b);
|
||||||
|
console.log(a);
|
||||||
|
})("FAIL 2");
|
||||||
|
})("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
(function(b) {
|
||||||
|
(function(a = console.log("FAIL 1")) {})(b);
|
||||||
|
console.log(a);
|
||||||
|
})("FAIL 2");
|
||||||
|
})("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5065: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var [ a = console.log("PASS") ] = [ (A = 42).p ];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var [ a = console.log("PASS") ] = [ (A = 42).p ];
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|||||||
@@ -1010,6 +1010,42 @@ collapse_vars_8: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
collapse_vars_9: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
try {
|
||||||
|
var b = function([ c ]) {
|
||||||
|
if (c)
|
||||||
|
return "FAIL 1";
|
||||||
|
}();
|
||||||
|
a = "FAIL 2";
|
||||||
|
return b;
|
||||||
|
} catch (e) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
}("PASS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
try {
|
||||||
|
var b = function([ c ]) {
|
||||||
|
if (c)
|
||||||
|
return "FAIL 1";
|
||||||
|
}();
|
||||||
|
a = "FAIL 2";
|
||||||
|
return b;
|
||||||
|
} catch (e) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
}("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
conditionals: {
|
conditionals: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
@@ -1069,7 +1105,7 @@ drop_unused_1: {
|
|||||||
try {
|
try {
|
||||||
throw 42;
|
throw 42;
|
||||||
} catch (a) {
|
} catch (a) {
|
||||||
var [ a ] = [];
|
var a = [][0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1102,6 +1138,175 @@ drop_unused_2: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drop_hole: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var [ a ] = [ , ];
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = [][0];
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_key_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({} = {
|
||||||
|
[(console.log("PASS"), 42)]: null,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({} = {
|
||||||
|
[(console.log("PASS"), 42)]: 0,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_key_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var { 42: a } = { [(console.log("PASS"), 42)](){} };
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var {} = { [(console.log("PASS"), 42)]: 0 };
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_key_2_pure_getters: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var { 42: a } = { [(console.log("PASS"), 42)](){} };
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_reference: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [ {}, 42 ];
|
||||||
|
var [ b, c ] = a;
|
||||||
|
console.log(a[0] === b ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = [ {}, 42 ];
|
||||||
|
var [ b ] = a;
|
||||||
|
console.log(a[0] === b ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
maintain_position_assign: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(([ , ] = [ , "PASS" ])[1]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log([ , "PASS" ][1]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
maintain_position_var: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = "FAIL";
|
||||||
|
var [ a, b ] = [ A ];
|
||||||
|
console.log(b || "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = "FAIL";
|
||||||
|
var [ , b ] = [ A ];
|
||||||
|
console.log(b || "PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects_array: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
var [ a ] = 42;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
var [ a ] = 42;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects_object: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = null, b = console, { c } = 42;
|
||||||
|
try {
|
||||||
|
c[a = "PASS"];
|
||||||
|
} catch (e) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = null, c = (console, 42["c"]);
|
||||||
|
try {
|
||||||
|
c[a = "PASS"];
|
||||||
|
} catch (e) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
join_vars: {
|
join_vars: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
@@ -1824,7 +2029,7 @@ issue_4321: {
|
|||||||
|
|
||||||
issue_4323: {
|
issue_4323: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
merge_vars: true,
|
merge_vars: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -2556,3 +2761,299 @@ issue_4608_2: {
|
|||||||
expect_stdout: "f"
|
expect_stdout: "f"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4994: {
|
||||||
|
options = {
|
||||||
|
loops: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
(function([
|
||||||
|
{
|
||||||
|
[function() {
|
||||||
|
for (a in { PASS: null });
|
||||||
|
}()]: b,
|
||||||
|
},
|
||||||
|
]) {
|
||||||
|
var a;
|
||||||
|
})([ 42 ]);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "FAIL";
|
||||||
|
(function([
|
||||||
|
{
|
||||||
|
[function() {
|
||||||
|
for (a in { PASS: null });
|
||||||
|
}()]: b,
|
||||||
|
},
|
||||||
|
]) {})([ 42 ]);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5017: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function() {};
|
||||||
|
var b = c = a;
|
||||||
|
var c = [ c ] = [ c ];
|
||||||
|
console.log(c[0] === a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = function() {};
|
||||||
|
var b = a;
|
||||||
|
var c = [ c ] = [ c = a ];
|
||||||
|
console.log(c[0] === a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5071_1: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log(([ , a ] = [ "PA", , ]).join("SS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
console.log(([ , a ] = [ "PA", , ]).join("SS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5071_2: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
([ a ] = []).p = console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
([ a ] = []).p = console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5074_getter: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({} = { get [(console.log("PASS"), 42)]() {} });
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({} = { [(console.log("PASS"), 42)]: 0 });
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5074_getter_pure_getters: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({} = { get [(console.log("PASS"), 42)]() {} });
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5074_setter: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({} = { set [(console.log("PASS"), 42)](v) {} });
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({} = { [(console.log("PASS"), 42)]: 0 });
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5074_setter_pure_getters: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({} = { set [(console.log("PASS"), 42)](v) {} });
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5074_method: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({} = { [(console.log("PASS"), 42)]() {} });
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({} = { [(console.log("PASS"), 42)]: 0 });
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5074_method_pure_getters: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({} = { [(console.log("PASS"), 42)]() {} });
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5085_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
var [ b ] = [ 42, a ], c = b ? 0 : a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
var b = [ 42 ][0];
|
||||||
|
b;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5085_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
(function(b) {
|
||||||
|
[ b ] = [ 42, a ];
|
||||||
|
var c = b ? 0 : a = "FAIL";
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
(function(b) {
|
||||||
|
b = [ 42 ][0];
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5087_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
(function() {
|
||||||
|
(function() {
|
||||||
|
(function([ b ]) {
|
||||||
|
b && console.log(b);
|
||||||
|
})([ a ]);
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
(function() {
|
||||||
|
var b;
|
||||||
|
(b = a) && console.log(b);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5087_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
(function() {
|
||||||
|
(function() {
|
||||||
|
(function([ b ]) {
|
||||||
|
b && console.log(b);
|
||||||
|
})([ a ]);
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
a && console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|||||||
@@ -795,9 +795,9 @@ issue_1656: {
|
|||||||
beautify: true,
|
beautify: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
for(var a=0;;);
|
for (var a=0;;);
|
||||||
}
|
}
|
||||||
expect_exact: "for (;;) ;"
|
expect_exact: "for (;;);"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1709: {
|
issue_1709: {
|
||||||
@@ -1110,7 +1110,7 @@ issue_1838: {
|
|||||||
}
|
}
|
||||||
expect_exact: [
|
expect_exact: [
|
||||||
"function f() {",
|
"function f() {",
|
||||||
" for (a; c; ) ;",
|
" for (a; c; );",
|
||||||
"}",
|
"}",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -2345,7 +2345,7 @@ function_argument_reference: {
|
|||||||
|
|
||||||
function_parameter_ie8: {
|
function_parameter_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -2371,6 +2371,7 @@ function_parameter_ie8: {
|
|||||||
issue_3664: {
|
issue_3664: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -2381,7 +2382,7 @@ issue_3664: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(function() {
|
console.log(function() {
|
||||||
var b = ([ b && console.log("FAIL") ].p = 0, 0);
|
var a, b = (a = (a = [ b && console.log("FAIL") ]).p = 0, 0);
|
||||||
return "PASS";
|
return "PASS";
|
||||||
}());
|
}());
|
||||||
}
|
}
|
||||||
@@ -2391,6 +2392,7 @@ issue_3664: {
|
|||||||
issue_3673: {
|
issue_3673: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -2401,8 +2403,6 @@ issue_3673: {
|
|||||||
console.log("PASS");
|
console.log("PASS");
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a;
|
|
||||||
(a = [ a ]).p = 42;
|
|
||||||
console.log("PASS");
|
console.log("PASS");
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
@@ -3080,11 +3080,10 @@ issue_4235: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(function() {
|
void function() {
|
||||||
f = console.log(f),
|
|
||||||
void 0;
|
|
||||||
var f;
|
var f;
|
||||||
})();
|
console.log(f);
|
||||||
|
}();
|
||||||
}
|
}
|
||||||
expect_stdout: "undefined"
|
expect_stdout: "undefined"
|
||||||
}
|
}
|
||||||
@@ -3231,7 +3230,7 @@ issue_4558_1: {
|
|||||||
issue_4558_2: {
|
issue_4558_2: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -3388,3 +3387,108 @@ issue_4834: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4912_1: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = A = function() {};
|
||||||
|
A;
|
||||||
|
a.prototype = {
|
||||||
|
f: function() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
new A().f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = A = function() {};
|
||||||
|
A;
|
||||||
|
a.prototype = {
|
||||||
|
f: function() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
new A().f();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4912_2: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var g, f = function() {};
|
||||||
|
f.p = {};
|
||||||
|
(g = f.p.q = function() {}).r = "PASS";
|
||||||
|
return f;
|
||||||
|
}().p.q.r);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
var g, f = function() {};
|
||||||
|
f.p = {};
|
||||||
|
(f.p.q = function() {}).r = "PASS";
|
||||||
|
return f;
|
||||||
|
}().p.q.r);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4912_3: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(f, g) {
|
||||||
|
f = function() {};
|
||||||
|
f.p = {};
|
||||||
|
g = f.p.q = function() {};
|
||||||
|
g.r = "PASS";
|
||||||
|
return f;
|
||||||
|
}().p.q.r);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(f, g) {
|
||||||
|
f = function() {};
|
||||||
|
f.p = {};
|
||||||
|
g = f.p.q = function() {};
|
||||||
|
g.r = "PASS";
|
||||||
|
return f;
|
||||||
|
}().p.q.r);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5079: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
do {
|
||||||
|
(a = 123456).p = a;
|
||||||
|
a.q = null;
|
||||||
|
} while (console.log("PASS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
do {
|
||||||
|
0, 0, null;
|
||||||
|
} while (console.log("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -684,26 +684,47 @@ prototype_function: {
|
|||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = ({valueOf: 0}) < 1;
|
function v() {
|
||||||
var b = ({toString: 0}) < 1;
|
return this.valueOf === v ? "PASS" : "FAIL";
|
||||||
var c = ({valueOf: 0}) + "";
|
}
|
||||||
var d = ({toString: 0}) + "";
|
console.log(({ valueOf: v }) < 1);
|
||||||
var e = (({valueOf: 0}) + "")[2];
|
console.log(({ valueOf: v }) + "");
|
||||||
var f = (({toString: 0}) + "")[2];
|
console.log((( {valueOf: v }) + "")[2]);
|
||||||
var g = ({valueOf: 0}).valueOf();
|
console.log(({ valueOf: v }).valueOf());
|
||||||
var h = ({toString: 0}).toString();
|
function t() {
|
||||||
|
return this.toString === t ? "PASS" : "FAIL";
|
||||||
|
}
|
||||||
|
console.log(({ toString: t }) < 1);
|
||||||
|
console.log(({ toString: t }) + "");
|
||||||
|
console.log((( {toString: t }) + "")[2]);
|
||||||
|
console.log(({ toString: t }).toString());
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a = ({valueOf: 0}) < 1;
|
function v() {
|
||||||
var b = ({toString: 0}) < 1;
|
return this.valueOf === v ? "PASS" : "FAIL";
|
||||||
var c = ({valueOf: 0}) + "";
|
}
|
||||||
var d = ({toString: 0}) + "";
|
console.log(({ valueOf: v }) < 1);
|
||||||
var e = (({valueOf: 0}) + "")[2];
|
console.log(({ valueOf: v }) + "");
|
||||||
var f = (({toString: 0}) + "")[2];
|
console.log((( {valueOf: v }) + "")[2]);
|
||||||
var g = 0();
|
console.log(({ valueOf: v }).valueOf());
|
||||||
var h = 0();
|
function t() {
|
||||||
|
return this.toString === t ? "PASS" : "FAIL";
|
||||||
|
}
|
||||||
|
console.log(({ toString: t }) < 1);
|
||||||
|
console.log(({ toString: t }) + "");
|
||||||
|
console.log((( {toString: t }) + "")[2]);
|
||||||
|
console.log(({ toString: t }).toString());
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: [
|
||||||
|
"false",
|
||||||
|
"PASS",
|
||||||
|
"S",
|
||||||
|
"PASS",
|
||||||
|
"false",
|
||||||
|
"PASS",
|
||||||
|
"S",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
call_args: {
|
call_args: {
|
||||||
@@ -3181,3 +3202,23 @@ issue_4552: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "NaN"
|
expect_stdout: "NaN"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4886: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("length" in {
|
||||||
|
__proto__: function() {},
|
||||||
|
length: void 0,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("length" in {
|
||||||
|
__proto__: function() {},
|
||||||
|
length: void 0,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|||||||
@@ -91,6 +91,13 @@ defaults_parentheses_6: {
|
|||||||
expect_exact: 'export default(function(){while(!console);})()?"FAIL":"PASS";'
|
expect_exact: 'export default(function(){while(!console);})()?"FAIL":"PASS";'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defaults_regexp: {
|
||||||
|
input: {
|
||||||
|
export default /foo/;
|
||||||
|
}
|
||||||
|
expect_exact: "export default/foo/;"
|
||||||
|
}
|
||||||
|
|
||||||
foreign: {
|
foreign: {
|
||||||
input: {
|
input: {
|
||||||
export * from "foo";
|
export * from "foo";
|
||||||
@@ -242,7 +249,7 @@ hoist_exports_2: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
let e, { foo: a } = 42;
|
let e, a = 42["foo"];
|
||||||
function f(t, { [e]: o }) {
|
function f(t, { [e]: o }) {
|
||||||
t(o, f);
|
t(o, f);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2123,7 +2123,7 @@ issue_3016_2: {
|
|||||||
issue_3016_2_ie8: {
|
issue_3016_2_ie8: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
@@ -2188,7 +2188,7 @@ issue_3016_3: {
|
|||||||
issue_3016_3_ie8: {
|
issue_3016_3_ie8: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
@@ -2826,6 +2826,36 @@ functions_use_strict: {
|
|||||||
expect_stdout: "a true 42 function function function"
|
expect_stdout: "a true 42 function function function"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
functions_cross_scope_reference: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
log = function(fn) {
|
||||||
|
console.log(typeof fn());
|
||||||
|
};
|
||||||
|
var a = function() {};
|
||||||
|
function f() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
while (log(f));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
log = function(fn) {
|
||||||
|
console.log(typeof fn());
|
||||||
|
};
|
||||||
|
function a() {}
|
||||||
|
function f() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
while (log(f));
|
||||||
|
}
|
||||||
|
expect_stdout: "function"
|
||||||
|
}
|
||||||
|
|
||||||
functions_inner_var: {
|
functions_inner_var: {
|
||||||
options = {
|
options = {
|
||||||
functions: true,
|
functions: true,
|
||||||
@@ -2905,6 +2935,7 @@ issue_2437: {
|
|||||||
issue_2485_1: {
|
issue_2485_1: {
|
||||||
options = {
|
options = {
|
||||||
functions: true,
|
functions: true,
|
||||||
|
passes: 2,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -2955,6 +2986,7 @@ issue_2485_2: {
|
|||||||
options = {
|
options = {
|
||||||
functions: true,
|
functions: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -5236,7 +5268,7 @@ issue_4265: {
|
|||||||
expect: {
|
expect: {
|
||||||
function f() {
|
function f() {
|
||||||
return console, function() {
|
return console, function() {
|
||||||
return console.log(a);
|
console.log(a);
|
||||||
var a;
|
var a;
|
||||||
}(), 0;
|
}(), 0;
|
||||||
}
|
}
|
||||||
@@ -6013,7 +6045,7 @@ issue_4823: {
|
|||||||
console.log(typeof function() {
|
console.log(typeof function() {
|
||||||
{
|
{
|
||||||
function f() {}
|
function f() {}
|
||||||
arguments = f();
|
f();
|
||||||
var arguments = function() {};
|
var arguments = function() {};
|
||||||
}
|
}
|
||||||
return f && arguments;
|
return f && arguments;
|
||||||
@@ -6021,3 +6053,515 @@ issue_4823: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "function"
|
expect_stdout: "function"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drop_unused_self_reference: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {}
|
||||||
|
(f.p = f).q = console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_cross_reference_1: {
|
||||||
|
options = {
|
||||||
|
passes: 3,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a, b) {
|
||||||
|
a = b = function() {};
|
||||||
|
a.p = a;
|
||||||
|
b = a = function() {};
|
||||||
|
b.q = b;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_cross_reference_1_toplevel: {
|
||||||
|
options = {
|
||||||
|
passes: 2,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = b = function() {};
|
||||||
|
a.p = a;
|
||||||
|
var b = a = function() {};
|
||||||
|
b.q = b;
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_cross_reference_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
passes: 3,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a, b) {
|
||||||
|
a = b = function() {};
|
||||||
|
b.p = a;
|
||||||
|
b = a = function() {};
|
||||||
|
a.q = b;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_cross_reference_2_toplevel: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
passes: 2,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = b = function() {};
|
||||||
|
b.p = a;
|
||||||
|
var b = a = function() {};
|
||||||
|
a.q = b;
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_cross_reference_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
passes: 3,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a, b) {
|
||||||
|
a = b = function() {};
|
||||||
|
a.p = b;
|
||||||
|
b = a = function() {};
|
||||||
|
b.q = a;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_cross_reference_3_toplevel: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
passes: 2,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = b = function() {};
|
||||||
|
a.p = b;
|
||||||
|
var b = a = function() {};
|
||||||
|
b.q = a;
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_cross_reference_4: {
|
||||||
|
options = {
|
||||||
|
passes: 3,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a, b) {
|
||||||
|
a = b = function() {};
|
||||||
|
b.p = b;
|
||||||
|
b = a = function() {};
|
||||||
|
a.q = a;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_cross_reference_4_toplevel: {
|
||||||
|
options = {
|
||||||
|
passes: 2,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = b = function() {};
|
||||||
|
b.p = b;
|
||||||
|
var b = a = function() {};
|
||||||
|
a.q = a;
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
recursive_collapse: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f(a) {
|
||||||
|
var b = a && f();
|
||||||
|
return b;
|
||||||
|
}("FAIL") || "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function f(a) {
|
||||||
|
var b;
|
||||||
|
return a && f();
|
||||||
|
}("FAIL") || "PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5025: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
function g() {
|
||||||
|
b = 42;
|
||||||
|
}
|
||||||
|
g(b = a);
|
||||||
|
var b = this;
|
||||||
|
console.log(typeof b);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
b = a,
|
||||||
|
void (b = 42);
|
||||||
|
var b = this;
|
||||||
|
console.log(typeof b);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: "object"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5036: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(typeof function() {
|
||||||
|
var await = function f() {
|
||||||
|
return f;
|
||||||
|
};
|
||||||
|
return await() === await;
|
||||||
|
}() ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(typeof function() {
|
||||||
|
function await() {
|
||||||
|
return await;
|
||||||
|
}
|
||||||
|
return await() === await;
|
||||||
|
}() ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5046: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
keep_fnames: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0;
|
||||||
|
if (a)
|
||||||
|
0();
|
||||||
|
else
|
||||||
|
(function f() {
|
||||||
|
f;
|
||||||
|
return a = "PASS";
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0;
|
||||||
|
(a ? 0 : function f() {
|
||||||
|
return a = "PASS";
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5061_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f, a = 1;
|
||||||
|
(f = function() {
|
||||||
|
console.log(a ? "foo" : "bar");
|
||||||
|
})();
|
||||||
|
f(a = 0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var f, a = 1;
|
||||||
|
(f = function() {
|
||||||
|
console.log(a ? "foo" : "bar");
|
||||||
|
})();
|
||||||
|
f(a = 0);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5061_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f, a = 1;
|
||||||
|
(f = function() {
|
||||||
|
console.log(a ? "foo" : "bar");
|
||||||
|
})();
|
||||||
|
f(a = 0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var f, a = 1;
|
||||||
|
(f = function() {
|
||||||
|
console.log(a ? "foo" : "bar");
|
||||||
|
})();
|
||||||
|
f(a = 0);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5067: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = function() {
|
||||||
|
f();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5096_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b = "FAIL", c = 1;
|
||||||
|
do {
|
||||||
|
a && a();
|
||||||
|
a = function() {
|
||||||
|
b = "PASS";
|
||||||
|
};
|
||||||
|
} while (c--);
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, b = "FAIL", c = 1;
|
||||||
|
do {
|
||||||
|
a && a();
|
||||||
|
a = function() {
|
||||||
|
b = "PASS";
|
||||||
|
};
|
||||||
|
} while (c--);
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5096_2: {
|
||||||
|
options = {
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b = "FAIL", c = 1;
|
||||||
|
do {
|
||||||
|
a && a();
|
||||||
|
a = function() {
|
||||||
|
b = "PASS";
|
||||||
|
};
|
||||||
|
} while (c--);
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, b = "FAIL", c = 1;
|
||||||
|
do {
|
||||||
|
a && a();
|
||||||
|
a = function() {
|
||||||
|
b = "PASS";
|
||||||
|
};
|
||||||
|
} while (c--);
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5096_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var b = "FAIL", c = 1;
|
||||||
|
do {
|
||||||
|
a && a();
|
||||||
|
var a = function() {
|
||||||
|
b = "PASS";
|
||||||
|
};
|
||||||
|
} while (c--);
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b = "FAIL", c = 1;
|
||||||
|
do {
|
||||||
|
a && a();
|
||||||
|
var a = function() {
|
||||||
|
b = "PASS";
|
||||||
|
};
|
||||||
|
} while (c--);
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5096_4: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var b = "FAIL", c = 1;
|
||||||
|
do {
|
||||||
|
a && a();
|
||||||
|
var a = function() {
|
||||||
|
b = "PASS";
|
||||||
|
};
|
||||||
|
} while (c--);
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b = "FAIL", c = 1;
|
||||||
|
do {
|
||||||
|
a && a();
|
||||||
|
var a = function() {
|
||||||
|
b = "PASS";
|
||||||
|
};
|
||||||
|
} while (c--);
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5098: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(o) {
|
||||||
|
function f() {
|
||||||
|
f = console.log;
|
||||||
|
if (o.p++)
|
||||||
|
throw "FAIL";
|
||||||
|
f("PASS");
|
||||||
|
}
|
||||||
|
return f;
|
||||||
|
})({ p: 0 })();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(o) {
|
||||||
|
function f() {
|
||||||
|
f = console.log;
|
||||||
|
if (o.p++)
|
||||||
|
throw "FAIL";
|
||||||
|
f("PASS");
|
||||||
|
}
|
||||||
|
return f;
|
||||||
|
})({ p: 0 })();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -777,6 +777,32 @@ issue_3046: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
issue_3071_1: {
|
issue_3071_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
join_vars: true,
|
||||||
|
passes: 3,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var obj = {};
|
||||||
|
obj.one = 1;
|
||||||
|
obj.two = 2;
|
||||||
|
console.log(obj.one, obj.two);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, 2);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3071_1_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
hoist_props: true,
|
hoist_props: true,
|
||||||
@@ -1094,3 +1120,24 @@ object_super: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4985: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = { p: 42 };
|
||||||
|
console.log(function() {
|
||||||
|
a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a_p = 42;
|
||||||
|
console.log(function() {
|
||||||
|
({});
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|||||||
@@ -152,7 +152,8 @@ issue_4487: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function a() {
|
function a() {
|
||||||
var f = console.log(typeof f);
|
var f;
|
||||||
|
console.log(typeof f);
|
||||||
}
|
}
|
||||||
a();
|
a();
|
||||||
}
|
}
|
||||||
@@ -265,3 +266,132 @@ issue_4839: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4859: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
keep_infinity: true,
|
||||||
|
merge_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
var b = (a = 2, 1 / 0), c = 3;
|
||||||
|
var d = a + b;
|
||||||
|
console.log(d);
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function f(a) {
|
||||||
|
var d = 1 / 0, d = Infinity;
|
||||||
|
console.log(d);
|
||||||
|
return f;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "Infinity"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4893_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {}
|
||||||
|
var a = null;
|
||||||
|
var b = null;
|
||||||
|
var c = null;
|
||||||
|
b.p += a = 42;
|
||||||
|
f;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
f();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try{
|
||||||
|
(function f() {
|
||||||
|
null.p += 42;
|
||||||
|
f;
|
||||||
|
})();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4893_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {}
|
||||||
|
var a = null;
|
||||||
|
var b = null;
|
||||||
|
var c = null;
|
||||||
|
b.p += a = 42;
|
||||||
|
f;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
f();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try{
|
||||||
|
(function() {
|
||||||
|
var b;
|
||||||
|
b = null;
|
||||||
|
b.p += 42;
|
||||||
|
})();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4898: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
loops: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
do {
|
||||||
|
var b = [ console.log("PASS") ];
|
||||||
|
var c = b;
|
||||||
|
} while (c.p = 0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b;
|
||||||
|
b = [ console.log("PASS") ];
|
||||||
|
b.p = 0;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -94,13 +94,15 @@ drop_unused: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
import a, * as b from "foo";
|
import a, * as b from "foo";
|
||||||
import { c, bar as d } from "baz";
|
import { c } from "bar";
|
||||||
console.log(c);
|
import { d, _ as e } from "baz";
|
||||||
|
console.log(d);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
import "foo";
|
import "foo";
|
||||||
import { c as c } from "baz";
|
import "bar";
|
||||||
console.log(c);
|
import { d as d } from "baz";
|
||||||
|
console.log(d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ typeof_eq_undefined: {
|
|||||||
typeof_eq_undefined_ie8: {
|
typeof_eq_undefined_ie8: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
typeofs: true,
|
typeofs: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
screw_ie8: {
|
screw_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
try { throw "foo"; } catch (x) { console.log(x); }
|
try { throw "foo"; } catch (x) { console.log(x); }
|
||||||
@@ -16,10 +16,10 @@ screw_ie8: {
|
|||||||
|
|
||||||
support_ie8: {
|
support_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
try { throw "foo"; } catch (x) { console.log(x); }
|
try { throw "foo"; } catch (x) { console.log(x); }
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
mangle_catch: {
|
mangle_catch: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -22,11 +22,11 @@ mangle_catch: {
|
|||||||
|
|
||||||
mangle_catch_ie8: {
|
mangle_catch_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -44,11 +44,11 @@ mangle_catch_ie8: {
|
|||||||
|
|
||||||
mangle_catch_var: {
|
mangle_catch_var: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -66,11 +66,11 @@ mangle_catch_var: {
|
|||||||
|
|
||||||
mangle_catch_var_ie8: {
|
mangle_catch_var_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -88,11 +88,11 @@ mangle_catch_var_ie8: {
|
|||||||
|
|
||||||
mangle_catch_toplevel: {
|
mangle_catch_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -110,11 +110,11 @@ mangle_catch_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_ie8_toplevel: {
|
mangle_catch_ie8_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -132,11 +132,11 @@ mangle_catch_ie8_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_var_toplevel: {
|
mangle_catch_var_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -154,11 +154,11 @@ mangle_catch_var_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_var_ie8_toplevel: {
|
mangle_catch_var_ie8_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -176,11 +176,11 @@ mangle_catch_var_ie8_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_1: {
|
mangle_catch_redef_1: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -198,11 +198,11 @@ mangle_catch_redef_1: {
|
|||||||
|
|
||||||
mangle_catch_redef_1_ie8: {
|
mangle_catch_redef_1_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -220,11 +220,11 @@ mangle_catch_redef_1_ie8: {
|
|||||||
|
|
||||||
mangle_catch_redef_1_toplevel: {
|
mangle_catch_redef_1_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -242,11 +242,11 @@ mangle_catch_redef_1_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_1_ie8_toplevel: {
|
mangle_catch_redef_1_ie8_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -264,11 +264,11 @@ mangle_catch_redef_1_ie8_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_2: {
|
mangle_catch_redef_2: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -285,11 +285,11 @@ mangle_catch_redef_2: {
|
|||||||
|
|
||||||
mangle_catch_redef_2_ie8: {
|
mangle_catch_redef_2_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -306,11 +306,11 @@ mangle_catch_redef_2_ie8: {
|
|||||||
|
|
||||||
mangle_catch_redef_2_toplevel: {
|
mangle_catch_redef_2_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -327,11 +327,11 @@ mangle_catch_redef_2_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_2_ie8_toplevel: {
|
mangle_catch_redef_2_ie8_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -348,7 +348,7 @@ mangle_catch_redef_2_ie8_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_3: {
|
mangle_catch_redef_3: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -371,7 +371,7 @@ mangle_catch_redef_3: {
|
|||||||
|
|
||||||
mangle_catch_redef_3_toplevel: {
|
mangle_catch_redef_3_toplevel: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -394,7 +394,7 @@ mangle_catch_redef_3_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_3_ie8: {
|
mangle_catch_redef_3_ie8: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -417,7 +417,7 @@ mangle_catch_redef_3_ie8: {
|
|||||||
|
|
||||||
mangle_catch_redef_3_ie8_toplevel: {
|
mangle_catch_redef_3_ie8_toplevel: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
function_iife_catch: {
|
function_iife_catch: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(n) {
|
function f(n) {
|
||||||
@@ -21,7 +21,7 @@ function_iife_catch: {
|
|||||||
|
|
||||||
function_iife_catch_ie8: {
|
function_iife_catch_ie8: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(n) {
|
function f(n) {
|
||||||
@@ -42,7 +42,7 @@ function_iife_catch_ie8: {
|
|||||||
|
|
||||||
function_catch_catch: {
|
function_catch_catch: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = 0;
|
var o = 0;
|
||||||
@@ -70,7 +70,7 @@ function_catch_catch: {
|
|||||||
|
|
||||||
function_catch_catch_ie8: {
|
function_catch_catch_ie8: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = 0;
|
var o = 0;
|
||||||
|
|||||||
@@ -1015,7 +1015,7 @@ issue_3856: {
|
|||||||
console.log(function() {
|
console.log(function() {
|
||||||
(function() {
|
(function() {
|
||||||
var a, b;
|
var a, b;
|
||||||
if (a) return !!a;
|
if (a) return a, 1;
|
||||||
for (a = 0; !console;);
|
for (a = 0; !console;);
|
||||||
return 0;
|
return 0;
|
||||||
})();
|
})();
|
||||||
@@ -1024,7 +1024,7 @@ issue_3856: {
|
|||||||
expect_stdout: "undefined"
|
expect_stdout: "undefined"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_3916: {
|
issue_3916_1: {
|
||||||
options = {
|
options = {
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
}
|
}
|
||||||
@@ -1044,8 +1044,8 @@ issue_3916: {
|
|||||||
var o = {
|
var o = {
|
||||||
p: "PASS",
|
p: "PASS",
|
||||||
__proto__: 42,
|
__proto__: 42,
|
||||||
q: "FAIL",
|
|
||||||
};
|
};
|
||||||
|
o.q = "FAIL";
|
||||||
o.__proto__ = {
|
o.__proto__ = {
|
||||||
p: "FAIL",
|
p: "FAIL",
|
||||||
q: "PASS",
|
q: "PASS",
|
||||||
@@ -1056,6 +1056,62 @@ issue_3916: {
|
|||||||
expect_stdout: "object PASS true PASS"
|
expect_stdout: "object PASS true PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3916_2: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var log = console.log, o = {};
|
||||||
|
o.p = "FAIL 1";
|
||||||
|
o.__proto__ = {
|
||||||
|
get p() {
|
||||||
|
return "FAIL 2";
|
||||||
|
},
|
||||||
|
set p(u) {
|
||||||
|
log("FAIL 3");
|
||||||
|
},
|
||||||
|
set q(v) {
|
||||||
|
log("PASS 1");
|
||||||
|
},
|
||||||
|
get q() {
|
||||||
|
return "PASS 3";
|
||||||
|
},
|
||||||
|
};
|
||||||
|
o.p = "PASS 2";
|
||||||
|
o.q = "FAIL 4";
|
||||||
|
log(o.p);
|
||||||
|
log(o.q);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var log = console.log, o = {
|
||||||
|
p: "FAIL 1",
|
||||||
|
__proto__: {
|
||||||
|
get p() {
|
||||||
|
return "FAIL 2";
|
||||||
|
},
|
||||||
|
set p(u) {
|
||||||
|
log("FAIL 3");
|
||||||
|
},
|
||||||
|
set q(v) {
|
||||||
|
log("PASS 1");
|
||||||
|
},
|
||||||
|
get q() {
|
||||||
|
return "PASS 3";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
o.p = "PASS 2";
|
||||||
|
o.q = "FAIL 4";
|
||||||
|
log(o.p);
|
||||||
|
log(o.q);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS 1",
|
||||||
|
"PASS 2",
|
||||||
|
"PASS 3",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
assign_var: {
|
assign_var: {
|
||||||
options = {
|
options = {
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
|
|||||||
@@ -117,6 +117,7 @@ issue_1858: {
|
|||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
pure_getters: true,
|
pure_getters: true,
|
||||||
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -950,7 +951,7 @@ function_name_mangle_ie8: {
|
|||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1157,8 +1158,8 @@ replace_all_var_scope: {
|
|||||||
var a = 100, b = 10;
|
var a = 100, b = 10;
|
||||||
(function(r, a) {
|
(function(r, a) {
|
||||||
switch (~a) {
|
switch (~a) {
|
||||||
case (b += a):
|
case (b += a):
|
||||||
case a++:
|
case a++:
|
||||||
}
|
}
|
||||||
})(--b, a);
|
})(--b, a);
|
||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
@@ -1167,8 +1168,8 @@ replace_all_var_scope: {
|
|||||||
var a = 100, b = 10;
|
var a = 100, b = 10;
|
||||||
(function(c) {
|
(function(c) {
|
||||||
switch (~a) {
|
switch (~a) {
|
||||||
case (b += a):
|
case (b += a):
|
||||||
case c++:
|
case c++:
|
||||||
}
|
}
|
||||||
})((--b, a));
|
})((--b, a));
|
||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
|
|||||||
@@ -20,6 +20,39 @@ retain_block: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
retain_assignment: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
function f() {
|
||||||
|
return a = 0;
|
||||||
|
let a;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
f();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function f() {
|
||||||
|
return a = 0;
|
||||||
|
let a;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
f();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
retain_catch: {
|
retain_catch: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
@@ -461,6 +494,41 @@ reduce_vars_3: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reduce_lambda: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
functions: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
let f = function() {
|
||||||
|
console.log(a, b);
|
||||||
|
};
|
||||||
|
let a = "foo", b = 42;
|
||||||
|
f();
|
||||||
|
b = "bar";
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function f() {
|
||||||
|
console.log("foo", b);
|
||||||
|
}
|
||||||
|
let b = 42;
|
||||||
|
f();
|
||||||
|
b = "bar";
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo 42",
|
||||||
|
"foo bar",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
hoist_props: {
|
hoist_props: {
|
||||||
options = {
|
options = {
|
||||||
hoist_props: true,
|
hoist_props: true,
|
||||||
@@ -536,6 +604,38 @@ loop_block_2: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do_break: {
|
||||||
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
try {
|
||||||
|
do {
|
||||||
|
if (a)
|
||||||
|
break;
|
||||||
|
let a;
|
||||||
|
} while (!console);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
try {
|
||||||
|
do {
|
||||||
|
if (a)
|
||||||
|
break;
|
||||||
|
let a;
|
||||||
|
} while (!console);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
do_continue: {
|
do_continue: {
|
||||||
options = {
|
options = {
|
||||||
loops: true,
|
loops: true,
|
||||||
@@ -596,6 +696,82 @@ dead_block_after_return: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if_return_1: {
|
||||||
|
options = {
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
function f(a) {
|
||||||
|
function g() {
|
||||||
|
return b = "PASS";
|
||||||
|
}
|
||||||
|
if (a)
|
||||||
|
return g();
|
||||||
|
let b;
|
||||||
|
return g();
|
||||||
|
};
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function f(a) {
|
||||||
|
function g() {
|
||||||
|
return b = "PASS";
|
||||||
|
}
|
||||||
|
if (a)
|
||||||
|
return g();
|
||||||
|
let b;
|
||||||
|
return g();
|
||||||
|
};
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
if_return_2: {
|
||||||
|
options = {
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
function f(a) {
|
||||||
|
function g() {
|
||||||
|
return b = "FAIL";
|
||||||
|
}
|
||||||
|
if (a)
|
||||||
|
return g();
|
||||||
|
let b;
|
||||||
|
return g();
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
console.log(f(42));
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function f(a) {
|
||||||
|
function g() {
|
||||||
|
return b = "FAIL";
|
||||||
|
}
|
||||||
|
if (a)
|
||||||
|
return g();
|
||||||
|
let b;
|
||||||
|
return g();
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
console.log(f(42));
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
do_if_continue_1: {
|
do_if_continue_1: {
|
||||||
options = {
|
options = {
|
||||||
if_return: true,
|
if_return: true,
|
||||||
@@ -897,6 +1073,7 @@ issue_4210: {
|
|||||||
issue_4212_1: {
|
issue_4212_1: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -987,7 +1164,7 @@ issue_4225: {
|
|||||||
|
|
||||||
issue_4229: {
|
issue_4229: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1018,7 +1195,7 @@ issue_4229: {
|
|||||||
|
|
||||||
issue_4231: {
|
issue_4231: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1387,7 +1564,7 @@ issue_4438: {
|
|||||||
|
|
||||||
issue_4531_1: {
|
issue_4531_1: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1413,11 +1590,11 @@ issue_4531_1: {
|
|||||||
issue_4531_2: {
|
issue_4531_2: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1546,3 +1723,27 @@ issue_4848: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4985: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
let a = { p: 42 };
|
||||||
|
console.log(function() {
|
||||||
|
a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
let a = { p: 42 };
|
||||||
|
console.log(function() {
|
||||||
|
a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|||||||
@@ -193,9 +193,9 @@ evaluate: {
|
|||||||
} while (false);
|
} while (false);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
for(;;)
|
for (;;)
|
||||||
a();
|
a();
|
||||||
for(;;)
|
for (;;)
|
||||||
c();
|
c();
|
||||||
d();
|
d();
|
||||||
}
|
}
|
||||||
@@ -265,7 +265,7 @@ issue_1532_2: {
|
|||||||
issue_186: {
|
issue_186: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -284,7 +284,7 @@ issue_186: {
|
|||||||
issue_186_ie8: {
|
issue_186_ie8: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -303,7 +303,7 @@ issue_186_ie8: {
|
|||||||
issue_186_beautify: {
|
issue_186_beautify: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -330,7 +330,7 @@ issue_186_beautify: {
|
|||||||
issue_186_beautify_ie8: {
|
issue_186_beautify_ie8: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -360,7 +360,7 @@ issue_186_braces: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
braces: true,
|
braces: true,
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -380,7 +380,7 @@ issue_186_braces_ie8: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
braces: true,
|
braces: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -400,7 +400,7 @@ issue_186_beautify_braces: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
braces: true,
|
braces: true,
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -432,7 +432,7 @@ issue_186_beautify_braces_ie8: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
braces: true,
|
braces: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -829,6 +829,18 @@ empty_for_in_prop_init: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for_of: {
|
for_of: {
|
||||||
|
input: {
|
||||||
|
var a = [ "PASS", 42 ];
|
||||||
|
a.p = "FAIL";
|
||||||
|
for (a of (null, a))
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a=["PASS",42];a.p="FAIL";for(a of(null,a))console.log(a);'
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=0.12"
|
||||||
|
}
|
||||||
|
|
||||||
|
for_async_of: {
|
||||||
input: {
|
input: {
|
||||||
var async = [ "PASS", 42 ];
|
var async = [ "PASS", 42 ];
|
||||||
async.p = "FAIL";
|
async.p = "FAIL";
|
||||||
@@ -837,7 +849,21 @@ for_of: {
|
|||||||
}
|
}
|
||||||
expect_exact: 'var async=["PASS",42];async.p="FAIL";for(async of(null,async))console.log(async);'
|
expect_exact: 'var async=["PASS",42];async.p="FAIL";for(async of(null,async))console.log(async);'
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
node_version: ">=0.12"
|
node_version: ">=0.12 <16"
|
||||||
|
}
|
||||||
|
|
||||||
|
for_of_regexp: {
|
||||||
|
input: {
|
||||||
|
for (var a of /foo/);
|
||||||
|
}
|
||||||
|
expect_exact: "for(var a of/foo/);"
|
||||||
|
}
|
||||||
|
|
||||||
|
for_await_of_regexp: {
|
||||||
|
input: {
|
||||||
|
for await (var a of /foo/);
|
||||||
|
}
|
||||||
|
expect_exact: "for await(var a of/foo/);"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_3631_1: {
|
issue_3631_1: {
|
||||||
|
|||||||
@@ -359,7 +359,7 @@ issue_4107: {
|
|||||||
|
|
||||||
issue_4109: {
|
issue_4109: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
merge_vars: true,
|
merge_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
@@ -2735,8 +2735,7 @@ issue_4135: {
|
|||||||
0;
|
0;
|
||||||
a++;
|
a++;
|
||||||
if (!a)
|
if (!a)
|
||||||
c = (a++, c = 0, void (c && c.p));
|
var c = void a++;
|
||||||
var c;
|
|
||||||
console.log(a, -1, c);
|
console.log(a, -1, c);
|
||||||
}
|
}
|
||||||
expect_stdout: "1 -1 undefined"
|
expect_stdout: "1 -1 undefined"
|
||||||
@@ -3075,7 +3074,7 @@ issue_4237_2: {
|
|||||||
console.log(function(a) {
|
console.log(function(a) {
|
||||||
do {
|
do {
|
||||||
switch (0) {
|
switch (0) {
|
||||||
case 0:
|
default:
|
||||||
var b = a++;
|
var b = a++;
|
||||||
if (b)
|
if (b)
|
||||||
return "FAIL";
|
return "FAIL";
|
||||||
@@ -3301,3 +3300,80 @@ issue_4761: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "undefined"
|
expect_stdout: "undefined"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4956_1: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b;
|
||||||
|
function f(c) {
|
||||||
|
switch (c) {
|
||||||
|
case 0:
|
||||||
|
a = { p: 42 };
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
b = a.p;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f(0);
|
||||||
|
f(1);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, b;
|
||||||
|
function f(c) {
|
||||||
|
switch (c) {
|
||||||
|
case 0:
|
||||||
|
a = { p: 42 };
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
b = a.p;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f(0);
|
||||||
|
f(1);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"42",
|
||||||
|
"42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4956_2: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b;
|
||||||
|
function f(c) {
|
||||||
|
if (0 == c) {
|
||||||
|
console;
|
||||||
|
a = { p: 42 };
|
||||||
|
}
|
||||||
|
b = a.p;
|
||||||
|
if (1 == c)
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
f(0);
|
||||||
|
f(1);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, b;
|
||||||
|
function f(c) {
|
||||||
|
if (0 == c) {
|
||||||
|
console;
|
||||||
|
a = { p: 42 };
|
||||||
|
}
|
||||||
|
b = a.p;
|
||||||
|
if (1 == c)
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
f(0);
|
||||||
|
f(1);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|||||||
@@ -110,10 +110,162 @@ conditional_assignment_4: {
|
|||||||
node_version: ">=14"
|
node_version: ">=14"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
de_morgan_1: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return a ?? a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(42));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(42));
|
||||||
|
}
|
||||||
|
expect_stdout: "null 42"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_2a: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a || (a ?? b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a || (a ?? b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined {}",
|
||||||
|
"42 42",
|
||||||
|
]
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_2b: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a && (a ?? b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null",
|
||||||
|
"42 42",
|
||||||
|
]
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_2c: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a ?? (a || b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a ?? b;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined {}",
|
||||||
|
"42 42",
|
||||||
|
]
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_2d: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a ?? (a && b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null",
|
||||||
|
"42 42",
|
||||||
|
]
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_2e: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a ?? (a ?? b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a ?? b;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined {}",
|
||||||
|
"42 42",
|
||||||
|
]
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
issue_4679: {
|
issue_4679: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a;
|
var a;
|
||||||
|
|||||||
355
test/compress/optional-chains.js
Normal file
355
test/compress/optional-chains.js
Normal file
@@ -0,0 +1,355 @@
|
|||||||
|
call: {
|
||||||
|
input: {
|
||||||
|
console.log?.(undefined?.(console.log("FAIL")));
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log?.((void 0)?.(console.log("FAIL")));'
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
dot: {
|
||||||
|
input: {
|
||||||
|
console?.log((void 0)?.p);
|
||||||
|
}
|
||||||
|
expect_exact: "console?.log((void 0)?.p);"
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
dot_in: {
|
||||||
|
input: {
|
||||||
|
var o = { in: 42 };
|
||||||
|
console.log(o.in, o?.in);
|
||||||
|
}
|
||||||
|
expect_exact: "var o={in:42};console.log(o.in,o?.in);"
|
||||||
|
expect_stdout: "42 42"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
sub: {
|
||||||
|
input: {
|
||||||
|
console?.["log"](null?.[console.log("FAIL")]);
|
||||||
|
}
|
||||||
|
expect_exact: 'console?.["log"](null?.[console.log("FAIL")]);'
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
ternary_decimal: {
|
||||||
|
input: {
|
||||||
|
null ? .42 : console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_exact: 'null?.42:console.log("PASS");'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
assign_parentheses_call: {
|
||||||
|
input: {
|
||||||
|
var o = {};
|
||||||
|
((() => o)?.()).p = "PASS";
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o={};((()=>o)?.()).p="PASS";console.log(o.p);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
assign_parentheses_dot: {
|
||||||
|
input: {
|
||||||
|
(console?.log).name.p = console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_exact: '(console?.log.name).p=console.log("PASS");'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
assign_no_parentheses: {
|
||||||
|
input: {
|
||||||
|
console[console.log?.("PASS")] = 42;
|
||||||
|
}
|
||||||
|
expect_exact: 'console[console.log?.("PASS")]=42;'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
unary_parentheses: {
|
||||||
|
input: {
|
||||||
|
var o = { p: 41 };
|
||||||
|
(function() {
|
||||||
|
return o;
|
||||||
|
}?.()).p++;
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect_exact: "var o={p:41};(function(){return o}?.()).p++;console.log(o.p);"
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
collapse_vars_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
A = 42;
|
||||||
|
a?.[42];
|
||||||
|
console.log(typeof A);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
A = 42;
|
||||||
|
a?.[42];
|
||||||
|
console.log(typeof A);
|
||||||
|
}
|
||||||
|
expect_stdout: "number"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
collapse_vars_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
A = 42;
|
||||||
|
a?.(42);
|
||||||
|
console.log(typeof A);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
A = 42;
|
||||||
|
a?.(42);
|
||||||
|
console.log(typeof A);
|
||||||
|
}
|
||||||
|
expect_stdout: "number"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
properties: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log(a?.["FAIL"]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
console.log(a?.FAIL);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_vars_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
null?.[a = 0];
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
null?.[a = 0];
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_vars_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
null?.(a = 0);
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
null?.(a = 0);
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
a?.[a = "FAIL"];
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
a?.[a = "FAIL"];
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
trim_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
optional_chains: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a, b) {
|
||||||
|
console?.log?.(a?.p, b?.[console.log("FAIL")]);
|
||||||
|
})?.({ p: "PASS" });
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a, b) {
|
||||||
|
console?.log?.(a.p, void 0);
|
||||||
|
})({ p: "PASS" });
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
trim_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
optional_chains: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(void console.log("PASS"))?.[console.log("FAIL")];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4906: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
do {
|
||||||
|
var a = a?.[42];
|
||||||
|
} while (console.log("PASS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
do {} while (console.log("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4928: {
|
||||||
|
options = {
|
||||||
|
ie: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = a?.[function f() {
|
||||||
|
f(a);
|
||||||
|
}];
|
||||||
|
console.log(typeof f);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = a?.[function f() {
|
||||||
|
f(a);
|
||||||
|
}];
|
||||||
|
console.log(typeof f);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4947_1: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(console.foo ? 42..p : console.bar?.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(console.foo ? 42..p : console.bar?.p);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4947_2: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var log = console.log, fail;
|
||||||
|
log("PASS") ? log(42) : fail?.(42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var log = console.log, fail;
|
||||||
|
log("PASS") ? log(42) : fail?.(42);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5039: {
|
||||||
|
options = {
|
||||||
|
ie: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = a?.[function f() {
|
||||||
|
f;
|
||||||
|
a;
|
||||||
|
}];
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function f() {});
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5091: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
var b = a.p;
|
||||||
|
var c;
|
||||||
|
b?.[c = "FAIL 2"];
|
||||||
|
return b || c;
|
||||||
|
}
|
||||||
|
console.log(f("FAIL 1") || "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(b) {
|
||||||
|
var b = b.p;
|
||||||
|
var c;
|
||||||
|
b?.[c = "FAIL 2"];
|
||||||
|
return b || c;
|
||||||
|
}
|
||||||
|
console.log(f("FAIL 1") || "PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
@@ -17,7 +17,7 @@ dot_properties: {
|
|||||||
properties: true,
|
properties: true,
|
||||||
}
|
}
|
||||||
beautify = {
|
beautify = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
a["foo"] = "bar";
|
a["foo"] = "bar";
|
||||||
@@ -43,7 +43,7 @@ dot_properties_es5: {
|
|||||||
properties: true,
|
properties: true,
|
||||||
}
|
}
|
||||||
beautify = {
|
beautify = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
a["foo"] = "bar";
|
a["foo"] = "bar";
|
||||||
@@ -1446,3 +1446,67 @@ issue_4831_2: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4888: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(typeof {
|
||||||
|
__proto__: 42,
|
||||||
|
}.__proto__);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(typeof {
|
||||||
|
__proto__: 42,
|
||||||
|
}.__proto__);
|
||||||
|
}
|
||||||
|
expect_stdout: "object"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5093: {
|
||||||
|
beautify = {
|
||||||
|
keep_quoted_props: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
a: true,
|
||||||
|
'42': "PASS",
|
||||||
|
"null": [],
|
||||||
|
}[6 * 7]);
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log({a:true,"42":"PASS","null":[]}[6*7]);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5093_quote_keys: {
|
||||||
|
beautify = {
|
||||||
|
keep_quoted_props: true,
|
||||||
|
quote_keys: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
a: true,
|
||||||
|
'42': "PASS",
|
||||||
|
"null": [],
|
||||||
|
}[6 * 7]);
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log({"a":true,"42":"PASS","null":[]}[6*7]);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5093_quote_style: {
|
||||||
|
beautify = {
|
||||||
|
keep_quoted_props: true,
|
||||||
|
quote_style: 3,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
a: true,
|
||||||
|
'42': "PASS",
|
||||||
|
"null": [],
|
||||||
|
}[6 * 7]);
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log({a:true,\'42\':"PASS","null":[]}[6*7]);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ conditional: {
|
|||||||
relational: {
|
relational: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "foo" ],
|
pure_funcs: [ "foo" ],
|
||||||
side_effects :true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
foo() in new foo();
|
foo() in new foo();
|
||||||
@@ -158,7 +158,7 @@ relational: {
|
|||||||
arithmetic: {
|
arithmetic: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "foo" ],
|
pure_funcs: [ "foo" ],
|
||||||
side_effects :true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
foo() + foo();
|
foo() + foo();
|
||||||
@@ -183,7 +183,7 @@ arithmetic: {
|
|||||||
boolean_and: {
|
boolean_and: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "foo" ],
|
pure_funcs: [ "foo" ],
|
||||||
side_effects :true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
foo() && foo();
|
foo() && foo();
|
||||||
@@ -208,7 +208,7 @@ boolean_and: {
|
|||||||
boolean_or: {
|
boolean_or: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "foo" ],
|
pure_funcs: [ "foo" ],
|
||||||
side_effects :true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
foo() || foo();
|
foo() || foo();
|
||||||
@@ -233,7 +233,7 @@ boolean_or: {
|
|||||||
assign: {
|
assign: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "foo" ],
|
pure_funcs: [ "foo" ],
|
||||||
side_effects :true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a;
|
var a;
|
||||||
@@ -256,7 +256,7 @@ assign: {
|
|||||||
unary: {
|
unary: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "foo" ],
|
pure_funcs: [ "foo" ],
|
||||||
side_effects :true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
typeof foo();
|
typeof foo();
|
||||||
|
|||||||
@@ -1320,6 +1320,7 @@ issue_2878: {
|
|||||||
|
|
||||||
issue_3427: {
|
issue_3427: {
|
||||||
options = {
|
options = {
|
||||||
|
assignments: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
@@ -1564,3 +1565,103 @@ issue_4803: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nested_property_assignments_1: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f;
|
||||||
|
((f = function() {
|
||||||
|
console.log("FAIL");
|
||||||
|
}).p = f).q = console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
nested_property_assignments_2: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {};
|
||||||
|
(function() {
|
||||||
|
var a;
|
||||||
|
(o.p = a = {}).q = "PASS";
|
||||||
|
})();
|
||||||
|
console.log(o.p.q);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {};
|
||||||
|
(function() {
|
||||||
|
(o.p = {}).q = "PASS";
|
||||||
|
})();
|
||||||
|
console.log(o.p.q);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
nested_property_assignments_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
pure_getters: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = { p: {} };
|
||||||
|
(function(a) {
|
||||||
|
console && a;
|
||||||
|
if (console) {
|
||||||
|
a = a.p;
|
||||||
|
a.q = a;
|
||||||
|
}
|
||||||
|
})(o);
|
||||||
|
console.log(o.p.q === o.p ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = { p: {} };
|
||||||
|
(function(a) {
|
||||||
|
console;
|
||||||
|
if (console)
|
||||||
|
(a = a.p).q = a;
|
||||||
|
})(o);
|
||||||
|
console.log(o.p.q === o.p ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4939: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({
|
||||||
|
__proto__: {
|
||||||
|
get p() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}).p;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({
|
||||||
|
__proto__: {
|
||||||
|
get p() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}).p;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -1292,6 +1292,7 @@ toplevel_on_loops_3: {
|
|||||||
loops: true,
|
loops: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -2071,72 +2072,6 @@ issue_1670_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
issue_1670_3: {
|
issue_1670_3: {
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
switches: true,
|
|
||||||
typeofs: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function f() {
|
|
||||||
switch (1) {
|
|
||||||
case 0:
|
|
||||||
var a = true;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
if (typeof a === "undefined") console.log("PASS");
|
|
||||||
else console.log("FAIL");
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
var a;
|
|
||||||
void 0 === a ? console.log("PASS") : console.log("FAIL");
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1670_4: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
passes: 2,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
switches: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function f() {
|
|
||||||
switch (1) {
|
|
||||||
case 0:
|
|
||||||
var a = true;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
if (typeof a === "undefined") console.log("PASS");
|
|
||||||
else console.log("FAIL");
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
console.log("PASS");
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1670_5: {
|
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
@@ -2168,7 +2103,7 @@ issue_1670_5: {
|
|||||||
expect_stdout: "1"
|
expect_stdout: "1"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1670_6: {
|
issue_1670_4: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
@@ -3158,7 +3093,7 @@ accessor_1: {
|
|||||||
a = 2;
|
a = 2;
|
||||||
return a;
|
return a;
|
||||||
},
|
},
|
||||||
b: 1
|
b: 1,
|
||||||
}.b, a);
|
}.b, a);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
@@ -3168,7 +3103,7 @@ accessor_1: {
|
|||||||
a = 2;
|
a = 2;
|
||||||
return a;
|
return a;
|
||||||
},
|
},
|
||||||
b: 1
|
b: 1,
|
||||||
}.b, a);
|
}.b, a);
|
||||||
}
|
}
|
||||||
expect_stdout: "1 1"
|
expect_stdout: "1 1"
|
||||||
@@ -3188,7 +3123,7 @@ accessor_2: {
|
|||||||
var B = {
|
var B = {
|
||||||
get c() {
|
get c() {
|
||||||
console.log(A);
|
console.log(A);
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
B.c;
|
B.c;
|
||||||
}
|
}
|
||||||
@@ -3196,7 +3131,7 @@ accessor_2: {
|
|||||||
({
|
({
|
||||||
get c() {
|
get c() {
|
||||||
console.log(1);
|
console.log(1);
|
||||||
}
|
},
|
||||||
}).c;
|
}).c;
|
||||||
}
|
}
|
||||||
expect_stdout: "1"
|
expect_stdout: "1"
|
||||||
@@ -3242,7 +3177,7 @@ obj_var_1: {
|
|||||||
var obj = {
|
var obj = {
|
||||||
bar: function() {
|
bar: function() {
|
||||||
return C + C;
|
return C + C;
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
console.log(obj.bar());
|
console.log(obj.bar());
|
||||||
}
|
}
|
||||||
@@ -3250,7 +3185,7 @@ obj_var_1: {
|
|||||||
console.log({
|
console.log({
|
||||||
bar: function() {
|
bar: function() {
|
||||||
return 2;
|
return 2;
|
||||||
}
|
},
|
||||||
}.bar());
|
}.bar());
|
||||||
}
|
}
|
||||||
expect_stdout: "2"
|
expect_stdout: "2"
|
||||||
@@ -3274,7 +3209,7 @@ obj_var_2: {
|
|||||||
var obj = {
|
var obj = {
|
||||||
bar: function() {
|
bar: function() {
|
||||||
return C + C;
|
return C + C;
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
console.log(obj.bar());
|
console.log(obj.bar());
|
||||||
}
|
}
|
||||||
@@ -4488,6 +4423,7 @@ perf_2: {
|
|||||||
|
|
||||||
perf_3: {
|
perf_3: {
|
||||||
options = {
|
options = {
|
||||||
|
passes: 2,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -4496,10 +4432,10 @@ perf_3: {
|
|||||||
input: {
|
input: {
|
||||||
var foo = function(x, y, z) {
|
var foo = function(x, y, z) {
|
||||||
return x < y ? x * y + z : x * z - y;
|
return x < y ? x * y + z : x * z - y;
|
||||||
}
|
};
|
||||||
var indirect_foo = function(x, y, z) {
|
var indirect_foo = function(x, y, z) {
|
||||||
return foo(x, y, z);
|
return foo(x, y, z);
|
||||||
}
|
};
|
||||||
var sum = 0;
|
var sum = 0;
|
||||||
for (var i = 0; i < 100; ++i)
|
for (var i = 0; i < 100; ++i)
|
||||||
sum += indirect_foo(i, i + 1, 3 * i);
|
sum += indirect_foo(i, i + 1, 3 * i);
|
||||||
@@ -4528,10 +4464,10 @@ perf_4: {
|
|||||||
input: {
|
input: {
|
||||||
var foo = function(x, y, z) {
|
var foo = function(x, y, z) {
|
||||||
return x < y ? x * y + z : x * z - y;
|
return x < y ? x * y + z : x * z - y;
|
||||||
}
|
};
|
||||||
var indirect_foo = function(x, y, z) {
|
var indirect_foo = function(x, y, z) {
|
||||||
return foo(x, y, z);
|
return foo(x, y, z);
|
||||||
}
|
};
|
||||||
var sum = 0;
|
var sum = 0;
|
||||||
for (var i = 0; i < 100; ++i)
|
for (var i = 0; i < 100; ++i)
|
||||||
sum += indirect_foo(i, i + 1, 3 * i);
|
sum += indirect_foo(i, i + 1, 3 * i);
|
||||||
@@ -4540,10 +4476,10 @@ perf_4: {
|
|||||||
expect: {
|
expect: {
|
||||||
var foo = function(x, y, z) {
|
var foo = function(x, y, z) {
|
||||||
return x < y ? x * y + z : x * z - y;
|
return x < y ? x * y + z : x * z - y;
|
||||||
}
|
};
|
||||||
var indirect_foo = function(x, y, z) {
|
var indirect_foo = function(x, y, z) {
|
||||||
return foo(x, y, z);
|
return foo(x, y, z);
|
||||||
}
|
};
|
||||||
var sum = 0;
|
var sum = 0;
|
||||||
for (var i = 0; i < 100; ++i)
|
for (var i = 0; i < 100; ++i)
|
||||||
sum += indirect_foo(i, i + 1, 3 * i);
|
sum += indirect_foo(i, i + 1, 3 * i);
|
||||||
@@ -4632,9 +4568,9 @@ perf_7: {
|
|||||||
var indirect_foo = function(x, y, z) {
|
var indirect_foo = function(x, y, z) {
|
||||||
var foo = function(x, y, z) {
|
var foo = function(x, y, z) {
|
||||||
return x < y ? x * y + z : x * z - y;
|
return x < y ? x * y + z : x * z - y;
|
||||||
}
|
};
|
||||||
return foo(x, y, z);
|
return foo(x, y, z);
|
||||||
}
|
};
|
||||||
var sum = 0;
|
var sum = 0;
|
||||||
for (var i = 0; i < 100; ++i)
|
for (var i = 0; i < 100; ++i)
|
||||||
sum += indirect_foo(i, i + 1, 3 * i);
|
sum += indirect_foo(i, i + 1, 3 * i);
|
||||||
@@ -4664,9 +4600,9 @@ perf_8: {
|
|||||||
var indirect_foo = function(x, y, z) {
|
var indirect_foo = function(x, y, z) {
|
||||||
var foo = function(x, y, z) {
|
var foo = function(x, y, z) {
|
||||||
return x < y ? x * y + z : x * z - y;
|
return x < y ? x * y + z : x * z - y;
|
||||||
}
|
};
|
||||||
return foo(x, y, z);
|
return foo(x, y, z);
|
||||||
}
|
};
|
||||||
var sum = 0;
|
var sum = 0;
|
||||||
for (var i = 0; i < 100; ++i)
|
for (var i = 0; i < 100; ++i)
|
||||||
sum += indirect_foo(i, i + 1, 3 * i);
|
sum += indirect_foo(i, i + 1, 3 * i);
|
||||||
@@ -4677,7 +4613,7 @@ perf_8: {
|
|||||||
return function(x, y, z) {
|
return function(x, y, z) {
|
||||||
return x < y ? x * y + z : x * z - y;
|
return x < y ? x * y + z : x * z - y;
|
||||||
}(x, y, z);
|
}(x, y, z);
|
||||||
}
|
};
|
||||||
var sum = 0;
|
var sum = 0;
|
||||||
for (var i = 0; i < 100; ++i)
|
for (var i = 0; i < 100; ++i)
|
||||||
sum += indirect_foo(i, i + 1, 3 * i);
|
sum += indirect_foo(i, i + 1, 3 * i);
|
||||||
@@ -7631,3 +7567,208 @@ issue_4568: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4937: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
while (console.log("PASS"));
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
function g() {
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
} while (!g);
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
while (console.log("PASS"));
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
function g() {
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
} while (!g);
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4943_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b = 1;
|
||||||
|
(function f() {
|
||||||
|
a = "foo";
|
||||||
|
b-- && f();
|
||||||
|
console.log(a);
|
||||||
|
a = "bar";
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, b = 1;
|
||||||
|
(function f() {
|
||||||
|
a = "foo";
|
||||||
|
b-- && f();
|
||||||
|
console.log(a);
|
||||||
|
a = "bar";
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4943_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b = 1;
|
||||||
|
(function f() {
|
||||||
|
a = "foo";
|
||||||
|
b-- && f();
|
||||||
|
console.log(a);
|
||||||
|
a = "bar";
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, b = 1;
|
||||||
|
(function f() {
|
||||||
|
a = "foo";
|
||||||
|
b-- && f();
|
||||||
|
console.log(a);
|
||||||
|
a = "bar";
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4949: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function f(a) {
|
||||||
|
a = 0;
|
||||||
|
console.log(a++, arguments[0]);
|
||||||
|
})(0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
a = 0;
|
||||||
|
console.log(a++, arguments[0]);
|
||||||
|
})(0);
|
||||||
|
}
|
||||||
|
expect_stdout: "0 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5048: {
|
||||||
|
options = {
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var a = function() {
|
||||||
|
return a + 42;
|
||||||
|
};
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5050: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
this;
|
||||||
|
var a = 1;
|
||||||
|
f(console.log(2), f(), a = 3);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
this;
|
||||||
|
var a = 1;
|
||||||
|
f(console.log(2), f(), a = 3);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"2",
|
||||||
|
"1",
|
||||||
|
"3",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5055_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
function f() {
|
||||||
|
console.log(a || "FAIL");
|
||||||
|
}
|
||||||
|
f(0 && (a = 0)(f(this)));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
function f() {
|
||||||
|
console.log(a || "FAIL");
|
||||||
|
}
|
||||||
|
f(0);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5055_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
function f() {
|
||||||
|
console.log(a || "FAIL");
|
||||||
|
}
|
||||||
|
f(0 && (a = 0)(f(this)));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
function f() {
|
||||||
|
console.log(a || "FAIL");
|
||||||
|
}
|
||||||
|
f(0 && (a = 0)(f()));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
mangle_catch: {
|
mangle_catch: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -24,11 +24,11 @@ mangle_catch: {
|
|||||||
mangle_catch_ie8: {
|
mangle_catch_ie8: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -47,11 +47,11 @@ mangle_catch_ie8: {
|
|||||||
mangle_catch_var: {
|
mangle_catch_var: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -70,11 +70,11 @@ mangle_catch_var: {
|
|||||||
mangle_catch_var_ie8: {
|
mangle_catch_var_ie8: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -93,11 +93,11 @@ mangle_catch_var_ie8: {
|
|||||||
mangle_catch_toplevel: {
|
mangle_catch_toplevel: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -116,11 +116,11 @@ mangle_catch_toplevel: {
|
|||||||
mangle_catch_ie8_toplevel: {
|
mangle_catch_ie8_toplevel: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -139,11 +139,11 @@ mangle_catch_ie8_toplevel: {
|
|||||||
mangle_catch_var_toplevel: {
|
mangle_catch_var_toplevel: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -162,11 +162,11 @@ mangle_catch_var_toplevel: {
|
|||||||
mangle_catch_var_ie8_toplevel: {
|
mangle_catch_var_ie8_toplevel: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -185,11 +185,11 @@ mangle_catch_var_ie8_toplevel: {
|
|||||||
mangle_catch_redef_1: {
|
mangle_catch_redef_1: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -208,11 +208,11 @@ mangle_catch_redef_1: {
|
|||||||
mangle_catch_redef_1_ie8: {
|
mangle_catch_redef_1_ie8: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -231,11 +231,11 @@ mangle_catch_redef_1_ie8: {
|
|||||||
mangle_catch_redef_1_toplevel: {
|
mangle_catch_redef_1_toplevel: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -254,11 +254,11 @@ mangle_catch_redef_1_toplevel: {
|
|||||||
mangle_catch_redef_1_ie8_toplevel: {
|
mangle_catch_redef_1_ie8_toplevel: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -277,11 +277,11 @@ mangle_catch_redef_1_ie8_toplevel: {
|
|||||||
mangle_catch_redef_2: {
|
mangle_catch_redef_2: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -299,11 +299,11 @@ mangle_catch_redef_2: {
|
|||||||
mangle_catch_redef_2_ie8: {
|
mangle_catch_redef_2_ie8: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -321,11 +321,11 @@ mangle_catch_redef_2_ie8: {
|
|||||||
mangle_catch_redef_2_toplevel: {
|
mangle_catch_redef_2_toplevel: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -343,11 +343,11 @@ mangle_catch_redef_2_toplevel: {
|
|||||||
mangle_catch_redef_2_ie8_toplevel: {
|
mangle_catch_redef_2_ie8_toplevel: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -365,7 +365,7 @@ mangle_catch_redef_2_ie8_toplevel: {
|
|||||||
issue_2120_1: {
|
issue_2120_1: {
|
||||||
rename = true
|
rename = true
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"aaaaaaaa";
|
"aaaaaaaa";
|
||||||
@@ -401,7 +401,7 @@ issue_2120_1: {
|
|||||||
issue_2120_2: {
|
issue_2120_2: {
|
||||||
rename = true
|
rename = true
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"aaaaaaaa";
|
"aaaaaaaa";
|
||||||
@@ -436,7 +436,7 @@ issue_2120_2: {
|
|||||||
function_iife_catch: {
|
function_iife_catch: {
|
||||||
rename = true
|
rename = true
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(n) {
|
function f(n) {
|
||||||
@@ -458,7 +458,7 @@ function_iife_catch: {
|
|||||||
function_iife_catch_ie8: {
|
function_iife_catch_ie8: {
|
||||||
rename = true
|
rename = true
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(n) {
|
function f(n) {
|
||||||
@@ -480,7 +480,7 @@ function_iife_catch_ie8: {
|
|||||||
function_catch_catch: {
|
function_catch_catch: {
|
||||||
rename = true
|
rename = true
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = 0;
|
var o = 0;
|
||||||
@@ -509,7 +509,7 @@ function_catch_catch: {
|
|||||||
function_catch_catch_ie8: {
|
function_catch_catch_ie8: {
|
||||||
rename = true
|
rename = true
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = 0;
|
var o = 0;
|
||||||
@@ -538,12 +538,12 @@ function_catch_catch_ie8: {
|
|||||||
function_do_catch_ie8: {
|
function_do_catch_ie8: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -615,7 +615,7 @@ function_do_catch_ie8: {
|
|||||||
issue_3480: {
|
issue_3480: {
|
||||||
rename = true,
|
rename = true,
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -647,7 +647,7 @@ issue_3480: {
|
|||||||
issue_3480_ie8: {
|
issue_3480_ie8: {
|
||||||
rename = true,
|
rename = true,
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -679,7 +679,7 @@ issue_3480_ie8: {
|
|||||||
issue_3480_toplevel: {
|
issue_3480_toplevel: {
|
||||||
rename = true,
|
rename = true,
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -711,7 +711,7 @@ issue_3480_toplevel: {
|
|||||||
issue_3480_ie8_toplevel: {
|
issue_3480_ie8_toplevel: {
|
||||||
rename = true,
|
rename = true,
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -244,7 +244,7 @@ retain_destructured_array: {
|
|||||||
console.log.apply(console, b);
|
console.log.apply(console, b);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var [ , ...b ] = [ "FAIL", "PASS", 42 ];
|
var [ ...b ] = [ "PASS", 42 ];
|
||||||
console.log.apply(console, b);
|
console.log.apply(console, b);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS 42"
|
expect_stdout: "PASS 42"
|
||||||
@@ -284,7 +284,7 @@ retain_destructured_object_2: {
|
|||||||
console.log(k, b[k]);
|
console.log(k, b[k]);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var { foo: [], ...b } = { foo: [ "FAIL" ], bar: "PASS", baz: 42 };
|
var { foo: {}, ...b } = { foo: 0, bar: "PASS", baz: 42 };
|
||||||
for (var k in b)
|
for (var k in b)
|
||||||
console.log(k, b[k]);
|
console.log(k, b[k]);
|
||||||
}
|
}
|
||||||
@@ -407,6 +407,24 @@ drop_unused_call_args_2: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
maintain_position: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = "FAIL";
|
||||||
|
var [ , ...a ] = [ A, "PASS" ];
|
||||||
|
console.log(a[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = "FAIL";
|
||||||
|
var [ , ...a ] = [ A, "PASS" ];
|
||||||
|
console.log(a[0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
merge_funarg: {
|
merge_funarg: {
|
||||||
options = {
|
options = {
|
||||||
merge_vars: true,
|
merge_vars: true,
|
||||||
@@ -491,7 +509,7 @@ drop_rest_array: {
|
|||||||
rests: true,
|
rests: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var [ ...[ a ]] = [ "PASS" ];
|
var [ ...[ a ] ] = [ "PASS" ];
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
@@ -542,6 +560,82 @@ drop_rest_lambda: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
keep_rest_array: {
|
||||||
|
options = {
|
||||||
|
rests: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var [ ...[ ...a ] ] = "PASS";
|
||||||
|
console.log(a.join(""));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var [ ...a ] = "PASS";
|
||||||
|
console.log(a.join(""));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_rest_arrow: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
rests: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(((...[ ...a ]) => a.join(""))("PASS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(((...a) => a.join(""))("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_rest_lambda_1: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
rests: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(...[ ...a ]) {
|
||||||
|
return a.join("");
|
||||||
|
}
|
||||||
|
console.log(f("PASS"), f([ 42 ]));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(...a) {
|
||||||
|
return a.join("");
|
||||||
|
}
|
||||||
|
console.log(f("PASS"), f([ 42 ]));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_rest_lambda_2: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(...[ ...a ]) {
|
||||||
|
return a.join("");
|
||||||
|
}
|
||||||
|
console.log(f("PASS"), f([ 42 ]));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(...[ ...a ]) {
|
||||||
|
return a.join("");
|
||||||
|
}
|
||||||
|
console.log(f("PASS"), f([ 42 ]));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
issue_4525_1: {
|
issue_4525_1: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
@@ -647,6 +741,78 @@ issue_4544_2: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4560_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0;
|
||||||
|
(function(...{
|
||||||
|
[a++]: {},
|
||||||
|
}) {})(2);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0;
|
||||||
|
(function(...{
|
||||||
|
[a++]: {},
|
||||||
|
}) {})(2);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4560_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0;
|
||||||
|
(function(...{
|
||||||
|
[a++]: {},
|
||||||
|
}) {})(2);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0;
|
||||||
|
(function(...{
|
||||||
|
[a++]: {},
|
||||||
|
}) {})(2);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4560_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b;
|
||||||
|
[ ...{
|
||||||
|
[a++]: b,
|
||||||
|
} ] = [ "PASS" ];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b;
|
||||||
|
[ ...{
|
||||||
|
[a++]: b,
|
||||||
|
} ] = [ "PASS" ];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
issue_4562: {
|
issue_4562: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -667,7 +833,7 @@ issue_4562: {
|
|||||||
issue_4575: {
|
issue_4575: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
rests: true,
|
rests: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -777,10 +943,129 @@ issue_4666: {
|
|||||||
expect: {
|
expect: {
|
||||||
var a = 0, b = 0;
|
var a = 0, b = 0;
|
||||||
var o = (c => +a + c)([ b ]);
|
var o = (c => +a + c)([ b ]);
|
||||||
for(var k in o)
|
for (var k in o)
|
||||||
b++;
|
b++;
|
||||||
console.log(1, b);
|
console.log(1, b);
|
||||||
}
|
}
|
||||||
expect_stdout: "1 2"
|
expect_stdout: "1 2"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5089_1: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var {
|
||||||
|
p: [] = 42,
|
||||||
|
...o
|
||||||
|
} = {
|
||||||
|
p: [],
|
||||||
|
};
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var {
|
||||||
|
p: {},
|
||||||
|
...o
|
||||||
|
} = {
|
||||||
|
p: 0,
|
||||||
|
};
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5089_2: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var {
|
||||||
|
p: {} = null,
|
||||||
|
...o
|
||||||
|
} = {
|
||||||
|
p: {},
|
||||||
|
};
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var {
|
||||||
|
p: {},
|
||||||
|
...o
|
||||||
|
} = {
|
||||||
|
p: 0,
|
||||||
|
};
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5100_1: {
|
||||||
|
options = {
|
||||||
|
passes: 2,
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
[ {
|
||||||
|
p: {},
|
||||||
|
...a
|
||||||
|
} ] = [ {
|
||||||
|
p: {
|
||||||
|
q: a,
|
||||||
|
} = 42,
|
||||||
|
r: "PASS",
|
||||||
|
} ];
|
||||||
|
console.log(a.r);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
[ {
|
||||||
|
p: {},
|
||||||
|
...a
|
||||||
|
} ] = [ {
|
||||||
|
p: [ a = 42["q"] ],
|
||||||
|
r: "PASS",
|
||||||
|
} ];
|
||||||
|
console.log(a.r);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5100_2: {
|
||||||
|
options = {
|
||||||
|
passes: 2,
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
[ {
|
||||||
|
p: {},
|
||||||
|
...a
|
||||||
|
} ] = [ {
|
||||||
|
p: (console.log("PASS"), {
|
||||||
|
q: a,
|
||||||
|
} = 42),
|
||||||
|
} ];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
[ {
|
||||||
|
p: {},
|
||||||
|
...a
|
||||||
|
} ] = [ {
|
||||||
|
p: [ console.log("PASS"), a = 42["q"] ],
|
||||||
|
} ];
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=10"
|
||||||
|
}
|
||||||
|
|||||||
@@ -198,6 +198,36 @@ global_fns: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
global_constructors: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
Map;
|
||||||
|
new Map(console.log("foo"));
|
||||||
|
Set;
|
||||||
|
new Set(console.log("bar"));
|
||||||
|
WeakMap;
|
||||||
|
new WeakMap(console.log("baz"));
|
||||||
|
WeakSet;
|
||||||
|
new WeakSet(console.log("moo"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("foo");
|
||||||
|
console.log("bar");
|
||||||
|
console.log("baz");
|
||||||
|
console.log("moo");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"baz",
|
||||||
|
"moo",
|
||||||
|
]
|
||||||
|
node_version: ">=0.12"
|
||||||
|
}
|
||||||
|
|
||||||
unsafe_builtin_1: {
|
unsafe_builtin_1: {
|
||||||
options = {
|
options = {
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
|
|||||||
@@ -945,78 +945,6 @@ issue_4556: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_4560_1: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 0;
|
|
||||||
(function(...{
|
|
||||||
[a++]: {},
|
|
||||||
}) {})(2);
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 0;
|
|
||||||
(function(...{
|
|
||||||
[a++]: {},
|
|
||||||
}) {})(2);
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "1"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4560_2: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 0;
|
|
||||||
(function(...{
|
|
||||||
[a++]: {},
|
|
||||||
}) {})(2);
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 0;
|
|
||||||
(function(...{
|
|
||||||
[a++]: {},
|
|
||||||
}) {})(2);
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "1"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4560_3: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 0, b;
|
|
||||||
[ ...{
|
|
||||||
[a++]: b,
|
|
||||||
} ] = [ "PASS" ];
|
|
||||||
console.log(b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 0, b;
|
|
||||||
[ ...{
|
|
||||||
[a++]: b,
|
|
||||||
} ] = [ "PASS" ];
|
|
||||||
console.log(b);
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4614: {
|
issue_4614: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
@@ -1068,3 +996,111 @@ issue_4849: {
|
|||||||
expect_stdout: "object"
|
expect_stdout: "object"
|
||||||
node_version: ">=8"
|
node_version: ">=8"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4882_1: {
|
||||||
|
options = {
|
||||||
|
objects: true,
|
||||||
|
spreads: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
p: "PASS",
|
||||||
|
... {
|
||||||
|
__proto__: {
|
||||||
|
p: "FAIL 1",
|
||||||
|
q: "FAIL 2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(o.p);
|
||||||
|
console.log(o.q);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
p: "PASS",
|
||||||
|
};
|
||||||
|
console.log(o.p);
|
||||||
|
console.log(o.q);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4882_2: {
|
||||||
|
options = {
|
||||||
|
objects: true,
|
||||||
|
spreads: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(null == Object.getPrototypeOf({
|
||||||
|
... {
|
||||||
|
__proto__: (console.log(42), null),
|
||||||
|
},
|
||||||
|
}) ? "FAIL" : "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(null == Object.getPrototypeOf({
|
||||||
|
... {
|
||||||
|
__proto__: (console.log(42), null),
|
||||||
|
},
|
||||||
|
}) ? "FAIL" : "PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"42",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4882_3: {
|
||||||
|
options = {
|
||||||
|
objects: true,
|
||||||
|
spreads: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
__proto__: { p: 42 },
|
||||||
|
... {
|
||||||
|
set __proto__(v) {},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(o.__proto__ === Object.getPrototypeOf(o) ? "FAIL" : "PASS");
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
__proto__: { p: 42 },
|
||||||
|
["__proto__"]: void 0,
|
||||||
|
};
|
||||||
|
console.log(o.__proto__ === Object.getPrototypeOf(o) ? "FAIL" : "PASS");
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"42",
|
||||||
|
]
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5006: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(b, c) {
|
||||||
|
c = "FAIL 2";
|
||||||
|
return arguments[1];
|
||||||
|
}(...[], "FAIL 1") || "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(b, c) {
|
||||||
|
c = "FAIL 2";
|
||||||
|
return arguments[1];
|
||||||
|
}(...[], "FAIL 1") || "PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ constant_switch_5: {
|
|||||||
// the break inside the if ruins our job
|
// the break inside the if ruins our job
|
||||||
// we can still get rid of irrelevant cases.
|
// we can still get rid of irrelevant cases.
|
||||||
switch (1) {
|
switch (1) {
|
||||||
case 1:
|
default:
|
||||||
x();
|
x();
|
||||||
if (foo) break;
|
if (foo) break;
|
||||||
y();
|
y();
|
||||||
@@ -300,6 +300,37 @@ drop_default_2: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drop_default_3: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
console.log("PASS");
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
|
switch (42) {
|
||||||
|
case f():
|
||||||
|
break;
|
||||||
|
case void console.log("FAIL"):
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
console.log("PASS");
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
|
switch (42) {
|
||||||
|
case f():
|
||||||
|
case void console.log("FAIL"):
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
keep_default: {
|
keep_default: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
@@ -423,7 +454,6 @@ drop_case_3: {
|
|||||||
switch ({}.p) {
|
switch ({}.p) {
|
||||||
default:
|
default:
|
||||||
case void 0:
|
case void 0:
|
||||||
break;
|
|
||||||
case c = "FAIL":
|
case c = "FAIL":
|
||||||
}
|
}
|
||||||
console.log(c);
|
console.log(c);
|
||||||
@@ -454,7 +484,168 @@ drop_case_4: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
keep_case: {
|
drop_case_5: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (42) {
|
||||||
|
case void console.log("PASS 1"):
|
||||||
|
console.log("FAIL 1");
|
||||||
|
case 42:
|
||||||
|
case console.log("FAIL 2"):
|
||||||
|
console.log("PASS 2");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch (42) {
|
||||||
|
default:
|
||||||
|
void console.log("PASS 1");
|
||||||
|
console.log("PASS 2");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS 1",
|
||||||
|
"PASS 2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_case_6: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (console.log("PASS 1"), 2) {
|
||||||
|
case 0:
|
||||||
|
console.log("FAIL 1");
|
||||||
|
case (console.log("PASS 2"), 1):
|
||||||
|
console.log("FAIL 2");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch (console.log("PASS 1"), 2) {
|
||||||
|
case (console.log("PASS 2"), 1):
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS 1",
|
||||||
|
"PASS 2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_case_7: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (2) {
|
||||||
|
case 0:
|
||||||
|
console.log("FAIL 1");
|
||||||
|
case (console.log("PASS 1"), 1):
|
||||||
|
console.log("FAIL 2");
|
||||||
|
case 2:
|
||||||
|
console.log("PASS 2");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch (2) {
|
||||||
|
default:
|
||||||
|
console.log("PASS 1"), 1;
|
||||||
|
console.log("PASS 2");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS 1",
|
||||||
|
"PASS 2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_case_8: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function log(msg) {
|
||||||
|
console.log(msg);
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
switch (log("foo")) {
|
||||||
|
case "bar":
|
||||||
|
log("moo");
|
||||||
|
break;
|
||||||
|
case log("baz"):
|
||||||
|
log("moo");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
log("moo");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function log(msg) {
|
||||||
|
console.log(msg);
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
switch (log("foo")) {
|
||||||
|
case "bar":
|
||||||
|
case log("baz"):
|
||||||
|
default:
|
||||||
|
log("moo");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"baz",
|
||||||
|
"moo",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_case_9: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function log(msg) {
|
||||||
|
console.log(msg);
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
switch (log("foo")) {
|
||||||
|
case log("bar"):
|
||||||
|
log("moo");
|
||||||
|
break;
|
||||||
|
case "baz":
|
||||||
|
log("moo");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
log("moo");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function log(msg) {
|
||||||
|
console.log(msg);
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
switch (log("foo")) {
|
||||||
|
default:
|
||||||
|
log("bar");
|
||||||
|
log("moo");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"moo",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_case_1: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
switches: true,
|
switches: true,
|
||||||
@@ -474,6 +665,76 @@ keep_case: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
keep_case_2: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch ("foo") {
|
||||||
|
case console.log("bar"):
|
||||||
|
case console.log("baz"), "moo":
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch ("foo") {
|
||||||
|
case console.log("bar"):
|
||||||
|
case console.log("baz"), "moo":
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"bar",
|
||||||
|
"baz",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_case_3: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
switch (void console.log("PASS")) {
|
||||||
|
case a:
|
||||||
|
case console.log("FAIL"), 42:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
switch (void console.log("PASS")) {
|
||||||
|
case a:
|
||||||
|
case console.log("FAIL"), 42:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_case_4: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
switch (void console.log("PASS")) {
|
||||||
|
case a:
|
||||||
|
case void console.log("FAIL"):
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
switch (void console.log("PASS")) {
|
||||||
|
case a:
|
||||||
|
case void console.log("FAIL"):
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
issue_376: {
|
issue_376: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
@@ -661,7 +922,7 @@ issue_1680_1: {
|
|||||||
case f(0):
|
case f(0):
|
||||||
case f(1):
|
case f(1):
|
||||||
f(2);
|
f(2);
|
||||||
case 2:
|
default:
|
||||||
f(5);
|
f(5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -924,7 +1185,6 @@ issue_2535: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
w(), 42;
|
w(), 42;
|
||||||
42;
|
|
||||||
y();
|
y();
|
||||||
z();
|
z();
|
||||||
}
|
}
|
||||||
@@ -950,7 +1210,6 @@ issue_1750: {
|
|||||||
expect: {
|
expect: {
|
||||||
var a = 0, b = 1;
|
var a = 0, b = 1;
|
||||||
true;
|
true;
|
||||||
a, true;
|
|
||||||
b = 2;
|
b = 2;
|
||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
}
|
}
|
||||||
@@ -1088,7 +1347,8 @@ drop_switch_6: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
A === B;
|
A;
|
||||||
|
B;
|
||||||
x();
|
x();
|
||||||
C !== D;
|
C !== D;
|
||||||
y();
|
y();
|
||||||
@@ -1181,3 +1441,170 @@ issue_4059: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5008_1: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
switches: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f() {
|
||||||
|
switch (f) {
|
||||||
|
case f:
|
||||||
|
return "PASS";
|
||||||
|
default:
|
||||||
|
return "FAIL";
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function f() {
|
||||||
|
switch (f) {
|
||||||
|
default:
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5008_2: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
switches: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
switch (a) {
|
||||||
|
case a:
|
||||||
|
return "PASS";
|
||||||
|
default:
|
||||||
|
return "FAIL";
|
||||||
|
}
|
||||||
|
}([]));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
switch (a) {
|
||||||
|
default:
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
}([]));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5008_3: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
switches: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
switch (a) {
|
||||||
|
case a:
|
||||||
|
return "PASS";
|
||||||
|
default:
|
||||||
|
return "FAIL";
|
||||||
|
}
|
||||||
|
}({}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
switch (a) {
|
||||||
|
default:
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
}({}));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5008_4: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
switch (a) {
|
||||||
|
case a:
|
||||||
|
return "PASS";
|
||||||
|
default:
|
||||||
|
return "FAIL";
|
||||||
|
}
|
||||||
|
}(/foo/));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
switch (a) {
|
||||||
|
default:
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
}(/foo/));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5010: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
switch (42) {
|
||||||
|
case console.log("PASS"):
|
||||||
|
case a:
|
||||||
|
console.log("FAIL");
|
||||||
|
case 42:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
switch (42) {
|
||||||
|
case console.log("PASS"):
|
||||||
|
case a:
|
||||||
|
console.log("FAIL");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5012: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (void 0) {
|
||||||
|
case console.log("PASS"):
|
||||||
|
break;
|
||||||
|
case void 0:
|
||||||
|
case 42:
|
||||||
|
console.log("FAIL");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch (void 0) {
|
||||||
|
case console.log("PASS"):
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
console.log("FAIL");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
@@ -62,6 +62,23 @@ tag_parentheses_arrow: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tag_parentheses_binary: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = function() {
|
||||||
|
console.log("PASS");
|
||||||
|
} || console
|
||||||
|
f``;
|
||||||
|
}
|
||||||
|
expect_exact: '(function(){console.log("PASS")}||console)``;'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
tag_parentheses_new: {
|
tag_parentheses_new: {
|
||||||
input: {
|
input: {
|
||||||
(new function() {
|
(new function() {
|
||||||
@@ -87,6 +104,21 @@ tag_parentheses_sequence: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tag_parentheses_unary: {
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
try {
|
||||||
|
(~a)``;
|
||||||
|
(a++)``;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: 'var a;try{(~a)``;(a++)``}catch(e){console.log("PASS")}'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
malformed_escape: {
|
malformed_escape: {
|
||||||
input: {
|
input: {
|
||||||
(function(s) {
|
(function(s) {
|
||||||
@@ -283,6 +315,21 @@ unsafe_side_effects: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pure_funcs: {
|
||||||
|
options = {
|
||||||
|
pure_funcs: "Math.random",
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
Math.random`${console.log("PASS")}`;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
issue_4604: {
|
issue_4604: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
@@ -343,7 +390,7 @@ issue_4676: {
|
|||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
templates: true,
|
templates: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unsafe:true,
|
unsafe: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -366,3 +413,24 @@ issue_4676: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4931: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
templates: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(String.raw`${typeof A} ${"\r"}`);
|
||||||
|
console.log(String.raw`${"\\"} ${"`"}`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(String.raw`${typeof A} ${"\r"}`);
|
||||||
|
console.log("\\ `");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined \r",
|
||||||
|
"\\ `",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ while_if_break: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
for(; a && (b && c && d, !e););
|
for (; a && (b && c && d, !e););
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -523,3 +523,93 @@ default_init: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4933_1: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(f());
|
||||||
|
function f() {
|
||||||
|
var a;
|
||||||
|
for (console in a = [ f ]) {
|
||||||
|
const b = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function f() {
|
||||||
|
var a;
|
||||||
|
for (console in a = [ f ]) {
|
||||||
|
const b = a;
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4933_2: {
|
||||||
|
options = {
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(f());
|
||||||
|
function f() {
|
||||||
|
var a;
|
||||||
|
for (console in a = [ f ]) {
|
||||||
|
const b = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function f() {
|
||||||
|
for (console in [ f ]);
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4954: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
(function() {
|
||||||
|
{
|
||||||
|
let a = console;
|
||||||
|
console.log(typeof a);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
let a = function() {};
|
||||||
|
a && console.log(typeof a);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
(function() {
|
||||||
|
var a = console;
|
||||||
|
console.log(typeof a);
|
||||||
|
{
|
||||||
|
let a = function() {};
|
||||||
|
a && console.log(typeof a);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"object",
|
||||||
|
"function",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ lambda_name_mangle: {
|
|||||||
|
|
||||||
lambda_name_mangle_ie8: {
|
lambda_name_mangle_ie8: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -95,7 +95,7 @@ function_name_mangle_ie8: {
|
|||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -150,6 +150,27 @@ for_await_of: {
|
|||||||
node_version: ">=10"
|
node_version: ">=10"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
comment_newline: {
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function*() {
|
||||||
|
yield (
|
||||||
|
/* */
|
||||||
|
"PASS"
|
||||||
|
);
|
||||||
|
}().next().value);
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"console.log(function*(){",
|
||||||
|
"/* */",
|
||||||
|
'yield"PASS"}().next().value);',
|
||||||
|
]
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
collapse_vars_1: {
|
collapse_vars_1: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
@@ -1062,3 +1083,195 @@ issue_4769_2: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5019_1: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
return a = function*() {
|
||||||
|
console.log(typeof a);
|
||||||
|
}();
|
||||||
|
})().next();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
return a = function*() {
|
||||||
|
console.log(typeof a);
|
||||||
|
}();
|
||||||
|
})().next();
|
||||||
|
}
|
||||||
|
expect_stdout: "object"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5019_2: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [];
|
||||||
|
for (var b in "foo")
|
||||||
|
a.push(function(c) {
|
||||||
|
return function*() {
|
||||||
|
console.log(c);
|
||||||
|
}();
|
||||||
|
}(b));
|
||||||
|
a.map(function(d) {
|
||||||
|
return d.next();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = [];
|
||||||
|
for (var b in "foo")
|
||||||
|
a.push(function(c) {
|
||||||
|
return function*() {
|
||||||
|
console.log(c);
|
||||||
|
}();
|
||||||
|
}(b));
|
||||||
|
a.map(function(d) {
|
||||||
|
return d.next();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"0",
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5032_normal: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
webkit: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function log(value) {
|
||||||
|
console.log(value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
function *f(a) {
|
||||||
|
var b = log(a), c = b;
|
||||||
|
log(b);
|
||||||
|
log(c);
|
||||||
|
}
|
||||||
|
f("PASS").next();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function log(value) {
|
||||||
|
console.log(value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
function *f(c) {
|
||||||
|
var b = log(c), c = b;
|
||||||
|
log(b);
|
||||||
|
log(c);
|
||||||
|
}
|
||||||
|
f("PASS").next();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"PASS",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5032_webkit: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
webkit: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function log(value) {
|
||||||
|
console.log(value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
function *f(a) {
|
||||||
|
var b = log(a), c = b;
|
||||||
|
log(b);
|
||||||
|
log(c);
|
||||||
|
}
|
||||||
|
f("PASS").next();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function log(value) {
|
||||||
|
console.log(value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
function *f(a) {
|
||||||
|
var b = log(a), c = b;
|
||||||
|
log(b);
|
||||||
|
log(c);
|
||||||
|
}
|
||||||
|
f("PASS").next();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"PASS",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5034: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var yield = function f() {
|
||||||
|
return function*() {
|
||||||
|
return f;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return yield()().next().value === yield;
|
||||||
|
}() ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
var yield = function f() {
|
||||||
|
return function*() {
|
||||||
|
return f;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return yield()().next().value === yield;
|
||||||
|
}() ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5076: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
passes: 2,
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
yields: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log("PASS");
|
||||||
|
var b = function*({
|
||||||
|
p: {},
|
||||||
|
}) {}({
|
||||||
|
p: { a } = 42,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
console.log("PASS");
|
||||||
|
a = 42["a"];
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
++null
|
console.log(4 || (null = 4));
|
||||||
|
|||||||
1
test/input/invalid/assign_5.js
Normal file
1
test/input/invalid/assign_5.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
console.log(5 || ([]?.length ^= 5));
|
||||||
@@ -58,22 +58,29 @@ if (typeof phantom == "undefined") {
|
|||||||
}).listen();
|
}).listen();
|
||||||
server.on("listening", function() {
|
server.on("listening", function() {
|
||||||
var port = server.address().port;
|
var port = server.address().port;
|
||||||
if (debug) {
|
if (debug) return console.log("http://localhost:" + port + "/");
|
||||||
console.log("http://localhost:" + port + "/");
|
var cmd = process.platform == "win32" ? "npm.cmd" : "npm";
|
||||||
} else (function install() {
|
|
||||||
child_process.spawn(process.platform == "win32" ? "npm.cmd" : "npm", [
|
function npm(args, done) {
|
||||||
|
child_process.spawn(cmd, args, { stdio: [ "ignore", 1, 2 ] }).on("exit", done);
|
||||||
|
}
|
||||||
|
|
||||||
|
(function install() {
|
||||||
|
npm([
|
||||||
"install",
|
"install",
|
||||||
"phantomjs-prebuilt@2.1.14",
|
"phantomjs-prebuilt@2.1.14",
|
||||||
"--no-audit",
|
"--no-audit",
|
||||||
"--no-optional",
|
"--no-optional",
|
||||||
"--no-save",
|
"--no-save",
|
||||||
"--no-update-notifier",
|
"--no-update-notifier",
|
||||||
], {
|
], function(code) {
|
||||||
stdio: [ "ignore", 1, 2 ]
|
|
||||||
}).on("exit", function(code) {
|
|
||||||
if (code) {
|
if (code) {
|
||||||
console.log("npm install failed with code", code);
|
console.log("npm install failed with code", code);
|
||||||
return install();
|
return npm([
|
||||||
|
"cache",
|
||||||
|
"clean",
|
||||||
|
"--force",
|
||||||
|
], install);
|
||||||
}
|
}
|
||||||
var program = require("phantomjs-prebuilt").exec(process.argv[1], port);
|
var program = require("phantomjs-prebuilt").exec(process.argv[1], port);
|
||||||
program.stdout.pipe(process.stdout);
|
program.stdout.pipe(process.stdout);
|
||||||
|
|||||||
@@ -427,16 +427,30 @@ describe("bin/uglifyjs", function() {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Should throw syntax error (++null)", function(done) {
|
it("Should throw syntax error (null = 4)", function(done) {
|
||||||
var command = uglifyjscmd + " test/input/invalid/assign_4.js";
|
var command = uglifyjscmd + " test/input/invalid/assign_4.js";
|
||||||
exec(command, function(err, stdout, stderr) {
|
exec(command, function(err, stdout, stderr) {
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
"Parse error at test/input/invalid/assign_4.js:1,0",
|
"Parse error at test/input/invalid/assign_4.js:1,23",
|
||||||
"++null",
|
"console.log(4 || (null = 4));",
|
||||||
"^",
|
" ^",
|
||||||
"ERROR: Invalid use of ++ operator",
|
"ERROR: Invalid assignment",
|
||||||
|
].join("\n"));
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("Should throw syntax error ([]?.length ^= 5)", function(done) {
|
||||||
|
var command = uglifyjscmd + " test/input/invalid/assign_5.js";
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
|
assert.ok(err);
|
||||||
|
assert.strictEqual(stdout, "");
|
||||||
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
|
"Parse error at test/input/invalid/assign_5.js:1,29",
|
||||||
|
"console.log(5 || ([]?.length ^= 5));",
|
||||||
|
" ^",
|
||||||
|
"ERROR: Invalid assignment",
|
||||||
].join("\n"));
|
].join("\n"));
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
var assert = require("assert");
|
|
||||||
var UglifyJS = require("../..");
|
|
||||||
|
|
||||||
describe("ie8", function() {
|
|
||||||
it("Should be able to minify() with undefined as catch parameter in a try...catch statement", function() {
|
|
||||||
assert.strictEqual(
|
|
||||||
UglifyJS.minify([
|
|
||||||
"function a(b){",
|
|
||||||
" try {",
|
|
||||||
" throw 'Stuff';",
|
|
||||||
" } catch (undefined) {",
|
|
||||||
" console.log('caught: ' + undefined);",
|
|
||||||
" }",
|
|
||||||
" console.log('undefined is ' + undefined);",
|
|
||||||
" return b === undefined;",
|
|
||||||
"};",
|
|
||||||
].join("\n")).code,
|
|
||||||
'function a(o){try{throw"Stuff"}catch(o){console.log("caught: "+o)}return console.log("undefined is "+void 0),void 0===o}'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -7,11 +7,11 @@ describe("let", function() {
|
|||||||
// Produce a lot of variables in a function and run it through mangle.
|
// Produce a lot of variables in a function and run it through mangle.
|
||||||
var s = '"dddddeeeeelllllooooottttt"; function foo() {';
|
var s = '"dddddeeeeelllllooooottttt"; function foo() {';
|
||||||
for (var i = 0; i < 18000; i++) {
|
for (var i = 0; i < 18000; i++) {
|
||||||
s += "var v" + i + "=0;";
|
s += "var v" + i + "=[];";
|
||||||
}
|
}
|
||||||
s += '}';
|
s += '}';
|
||||||
var result = UglifyJS.minify(s, {
|
var result = UglifyJS.minify(s, {
|
||||||
compress: false
|
compress: false,
|
||||||
}).code;
|
}).code;
|
||||||
|
|
||||||
// Verify that select keywords and reserved keywords not produced
|
// Verify that select keywords and reserved keywords not produced
|
||||||
@@ -41,7 +41,7 @@ describe("let", function() {
|
|||||||
}
|
}
|
||||||
var result = UglifyJS.minify(s, {
|
var result = UglifyJS.minify(s, {
|
||||||
compress: false,
|
compress: false,
|
||||||
ie8: true,
|
ie: true,
|
||||||
mangle: {
|
mangle: {
|
||||||
properties: true,
|
properties: true,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -101,6 +101,19 @@ describe("sourcemaps", function() {
|
|||||||
var map = JSON.parse(result.map);
|
var map = JSON.parse(result.map);
|
||||||
assert.deepEqual(map.names, []);
|
assert.deepEqual(map.names, []);
|
||||||
});
|
});
|
||||||
|
it("Should mark class properties", function() {
|
||||||
|
var result = UglifyJS.minify([
|
||||||
|
"class A {",
|
||||||
|
" static P = 42",
|
||||||
|
" set #q(v) {}",
|
||||||
|
"}",
|
||||||
|
].join("\n"), {
|
||||||
|
sourceMap: true,
|
||||||
|
});
|
||||||
|
if (result.error) throw result.error;
|
||||||
|
assert.strictEqual(result.code, "class A{static P=42;set#q(s){}}");
|
||||||
|
assert.strictEqual(result.map, '{"version":3,"sources":["0"],"names":["A","P","#q","v"],"mappings":"MAAMA,EACFC,SAAW,GACXC,MAAOC"}');
|
||||||
|
});
|
||||||
it("Should mark array/object literals", function() {
|
it("Should mark array/object literals", function() {
|
||||||
var result = UglifyJS.minify([
|
var result = UglifyJS.minify([
|
||||||
"var obj = {};",
|
"var obj = {};",
|
||||||
|
|||||||
@@ -5,23 +5,23 @@ var acorn = require("acorn");
|
|||||||
var ufuzz = require("./ufuzz");
|
var ufuzz = require("./ufuzz");
|
||||||
var UglifyJS = require("..");
|
var UglifyJS = require("..");
|
||||||
|
|
||||||
function try_beautify(code) {
|
function beautify(ast) {
|
||||||
var beautified = UglifyJS.minify(code, {
|
var beautified = UglifyJS.minify(ast, {
|
||||||
compress: false,
|
compress: false,
|
||||||
mangle: false,
|
mangle: false,
|
||||||
output: {
|
output: {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
braces: true
|
braces: true,
|
||||||
}
|
},
|
||||||
|
});
|
||||||
|
if (beautified.error) return beautified;
|
||||||
|
return UglifyJS.minify(beautified.code, {
|
||||||
|
compress: false,
|
||||||
|
mangle: false,
|
||||||
|
output: {
|
||||||
|
ast: true,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
if (beautified.error) {
|
|
||||||
console.log("// !!! beautify failed !!!");
|
|
||||||
console.log(beautified.error.stack);
|
|
||||||
console.log(code);
|
|
||||||
} else {
|
|
||||||
console.log("// (beautified)");
|
|
||||||
console.log(beautified.code);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function validate(ast) {
|
function validate(ast) {
|
||||||
@@ -35,16 +35,55 @@ function validate(ast) {
|
|||||||
return UglifyJS.minify(ast, {
|
return UglifyJS.minify(ast, {
|
||||||
compress: false,
|
compress: false,
|
||||||
mangle: false,
|
mangle: false,
|
||||||
|
output: {
|
||||||
|
ast: true,
|
||||||
|
},
|
||||||
|
validate: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function test(original, estree, description) {
|
function patch_import(code) {
|
||||||
var transformed = validate(UglifyJS.AST_Node.from_mozilla_ast(estree));
|
return code.replace(/\bimport\s*\{\s*\}\s*from\s*(['"])/g, "import$1")
|
||||||
if (transformed.error || original !== transformed.code) {
|
.replace(/\b(import\b.*?)\s*,\s*\{\s*\}\s*(from\s*['"])/g, "$1 $2");
|
||||||
|
}
|
||||||
|
|
||||||
|
function equals(input, transformed) {
|
||||||
|
if (input.code === transformed.code) return true;
|
||||||
|
return patch_import(input.code) === patch_import(transformed.code);
|
||||||
|
}
|
||||||
|
|
||||||
|
function test(input, to_moz, description, skip_on_error, beautified) {
|
||||||
|
try {
|
||||||
|
var ast = UglifyJS.AST_Node.from_mozilla_ast(to_moz(input));
|
||||||
|
} catch (e) {
|
||||||
|
if (skip_on_error) return true;
|
||||||
|
console.log("//=============================================================");
|
||||||
|
console.log("//", description, "failed... round", round);
|
||||||
|
console.log(e);
|
||||||
|
console.log("// original code");
|
||||||
|
if (beautified === true) console.log("// (beautified)");
|
||||||
|
console.log(input.code);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var transformed = validate(ast);
|
||||||
|
if (transformed.error || !equals(input, transformed)) {
|
||||||
|
if (!beautified) {
|
||||||
|
beautified = beautify(input.ast);
|
||||||
|
if (!beautified.error) {
|
||||||
|
beautified.raw = beautified.code;
|
||||||
|
if (!test(beautified, to_moz, description, skip_on_error, true)) return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
console.log("//=============================================================");
|
console.log("//=============================================================");
|
||||||
console.log("// !!!!!! Failed... round", round);
|
console.log("// !!!!!! Failed... round", round);
|
||||||
console.log("// original code");
|
console.log("// original code");
|
||||||
try_beautify(original);
|
if (beautified.error) {
|
||||||
|
console.log("// !!! beautify failed !!!");
|
||||||
|
console.log(beautified.error.stack);
|
||||||
|
} else if (beautified === true) {
|
||||||
|
console.log("// (beautified)");
|
||||||
|
}
|
||||||
|
console.log(input.raw);
|
||||||
console.log();
|
console.log();
|
||||||
console.log();
|
console.log();
|
||||||
console.log("//-------------------------------------------------------------");
|
console.log("//-------------------------------------------------------------");
|
||||||
@@ -52,7 +91,15 @@ function test(original, estree, description) {
|
|||||||
if (transformed.error) {
|
if (transformed.error) {
|
||||||
console.log(transformed.error.stack);
|
console.log(transformed.error.stack);
|
||||||
} else {
|
} else {
|
||||||
try_beautify(transformed.code);
|
beautified = beautify(transformed.ast);
|
||||||
|
if (beautified.error) {
|
||||||
|
console.log("// !!! beautify failed !!!");
|
||||||
|
console.log(beautified.error.stack);
|
||||||
|
console.log(transformed.code);
|
||||||
|
} else {
|
||||||
|
console.log("// (beautified)");
|
||||||
|
console.log(beautified.code);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
console.log("!!!!!! Failed... round", round);
|
console.log("!!!!!! Failed... round", round);
|
||||||
return false;
|
return false;
|
||||||
@@ -67,24 +114,33 @@ for (var round = 1; round <= num_iterations; round++) {
|
|||||||
process.stdout.write(round + " of " + num_iterations + "\r");
|
process.stdout.write(round + " of " + num_iterations + "\r");
|
||||||
var code = ufuzz.createTopLevelCode();
|
var code = ufuzz.createTopLevelCode();
|
||||||
minify_options.forEach(function(options) {
|
minify_options.forEach(function(options) {
|
||||||
var input = options ? UglifyJS.minify(code, JSON.parse(options)).code : code;
|
var ok = true;
|
||||||
var uglified = UglifyJS.minify(input, {
|
var input = UglifyJS.minify(options ? UglifyJS.minify(code, JSON.parse(options)).code : code, {
|
||||||
compress: false,
|
compress: false,
|
||||||
mangle: false,
|
mangle: false,
|
||||||
output: {
|
output: {
|
||||||
ast: true
|
ast: true,
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
var ok = test(uglified.code, uglified.ast.to_mozilla_ast(), "AST_Node.to_mozilla_ast()");
|
input.raw = options ? input.code : code;
|
||||||
try {
|
if (input.error) {
|
||||||
ok = test(uglified.code, acorn.parse(input), "acorn.parse()") && ok;
|
ok = false;
|
||||||
} catch (e) {
|
|
||||||
console.log("//=============================================================");
|
console.log("//=============================================================");
|
||||||
console.log("// acorn parser failed... round", round);
|
console.log("// minify() failed... round", round);
|
||||||
console.log(e);
|
console.log(input.error);
|
||||||
console.log("// original code");
|
console.log("// original code");
|
||||||
console.log(input);
|
console.log(code);
|
||||||
}
|
}
|
||||||
|
if (ok) ok = test(input, function(input) {
|
||||||
|
return input.ast.to_mozilla_ast();
|
||||||
|
}, "AST_Node.to_mozilla_ast()");
|
||||||
|
if (ok) ok = test(input, function(input) {
|
||||||
|
return acorn.parse(input.raw, {
|
||||||
|
ecmaVersion: "latest",
|
||||||
|
locations: true,
|
||||||
|
sourceType: "module",
|
||||||
|
});
|
||||||
|
}, "acorn.parse()", !ufuzz.verbose);
|
||||||
if (!ok) process.exit(1);
|
if (!ok) process.exit(1);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ module.exports = function reduce_test(testcase, minify_options, reduce_options)
|
|||||||
reduce_options = reduce_options || {};
|
reduce_options = reduce_options || {};
|
||||||
var print_options = {};
|
var print_options = {};
|
||||||
[
|
[
|
||||||
"ie8",
|
"ie",
|
||||||
"v8",
|
"v8",
|
||||||
"webkit",
|
"webkit",
|
||||||
].forEach(function(name) {
|
].forEach(function(name) {
|
||||||
@@ -46,7 +46,7 @@ module.exports = function reduce_test(testcase, minify_options, reduce_options)
|
|||||||
if (verbose) {
|
if (verbose) {
|
||||||
log("// Node.js " + process.version + " on " + os.platform() + " " + os.arch());
|
log("// Node.js " + process.version + " on " + os.platform() + " " + os.arch());
|
||||||
}
|
}
|
||||||
if (differs.error && [ "DefaultsError", "SyntaxError" ].indexOf(differs.error.name) < 0) {
|
if (differs && differs.error && [ "DefaultsError", "SyntaxError" ].indexOf(differs.error.name) < 0) {
|
||||||
test_for_diff = test_minify;
|
test_for_diff = test_minify;
|
||||||
differs = test_for_diff(testcase, minify_options, result_cache, max_timeout);
|
differs = test_for_diff(testcase, minify_options, result_cache, max_timeout);
|
||||||
}
|
}
|
||||||
@@ -132,6 +132,8 @@ module.exports = function reduce_test(testcase, minify_options, reduce_options)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (parent instanceof U.AST_VarDef && parent.name === node) return;
|
if (parent instanceof U.AST_VarDef && parent.name === node) return;
|
||||||
|
// preserve class methods
|
||||||
|
if (parent instanceof U.AST_ClassMethod && parent.value === node) return;
|
||||||
// preserve exports
|
// preserve exports
|
||||||
if (parent instanceof U.AST_ExportDeclaration) return;
|
if (parent instanceof U.AST_ExportDeclaration) return;
|
||||||
if (parent instanceof U.AST_ExportDefault) return;
|
if (parent instanceof U.AST_ExportDefault) return;
|
||||||
@@ -147,6 +149,9 @@ module.exports = function reduce_test(testcase, minify_options, reduce_options)
|
|||||||
if (parent instanceof U.AST_For && parent.init === node && node instanceof U.AST_Definitions) return node;
|
if (parent instanceof U.AST_For && parent.init === node && node instanceof U.AST_Definitions) return node;
|
||||||
// preserve for (xxx in/of ...)
|
// preserve for (xxx in/of ...)
|
||||||
if (parent instanceof U.AST_ForEnumeration && parent.init === node) return node;
|
if (parent instanceof U.AST_ForEnumeration && parent.init === node) return node;
|
||||||
|
// preserve super(...)
|
||||||
|
if (node.TYPE == "Call" && node.expression instanceof U.AST_Super) return;
|
||||||
|
if (node instanceof U.AST_Super && parent.TYPE == "Call" && parent.expression === node) return node;
|
||||||
|
|
||||||
// node specific permutations with no parent logic
|
// node specific permutations with no parent logic
|
||||||
|
|
||||||
@@ -721,7 +726,7 @@ function to_statement_init(node) {
|
|||||||
return node instanceof U.AST_Const || node instanceof U.AST_Let ? new U.AST_BlockStatement({
|
return node instanceof U.AST_Const || node instanceof U.AST_Let ? new U.AST_BlockStatement({
|
||||||
body: [ node ],
|
body: [ node ],
|
||||||
start: {},
|
start: {},
|
||||||
}) : to_statement(node);;
|
}) : to_statement(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
function wrap_with_console_log(node) {
|
function wrap_with_console_log(node) {
|
||||||
|
|||||||
@@ -14,6 +14,13 @@ minify_in_situ() {
|
|||||||
uglify-js $ARGS
|
uglify-js $ARGS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
npm_install() {
|
||||||
|
PKG="$1"
|
||||||
|
while !(npm install $PKG); do
|
||||||
|
while !(npm cache clean --force); do echo "'npm cache clean' failed - retrying..."; done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
rm -rf tmp/acorn \
|
rm -rf tmp/acorn \
|
||||||
&& git clone https://github.com/acornjs/acorn.git tmp/acorn \
|
&& git clone https://github.com/acornjs/acorn.git tmp/acorn \
|
||||||
&& cd tmp/acorn \
|
&& cd tmp/acorn \
|
||||||
@@ -89,7 +96,7 @@ minify_in_situ "acorn/src" \
|
|||||||
&& minify_in_situ "acorn-loose/src" \
|
&& minify_in_situ "acorn-loose/src" \
|
||||||
&& minify_in_situ "acorn-walk/src" \
|
&& minify_in_situ "acorn-walk/src" \
|
||||||
&& rm -rf node_modules \
|
&& rm -rf node_modules \
|
||||||
&& npm install \
|
&& npm_install \
|
||||||
&& rm -rf acorn/dist acorn-loose/dist acorn-walk/dist \
|
&& rm -rf acorn/dist acorn-loose/dist acorn-walk/dist \
|
||||||
&& npm run build \
|
&& npm run build \
|
||||||
&& minify_in_situ "acorn/dist" \
|
&& minify_in_situ "acorn/dist" \
|
||||||
|
|||||||
@@ -14,6 +14,13 @@ minify_in_situ() {
|
|||||||
uglify-js $ARGS
|
uglify-js $ARGS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
npm_install() {
|
||||||
|
PKG="$1"
|
||||||
|
while !(npm install $PKG); do
|
||||||
|
while !(npm cache clean --force); do echo "'npm cache clean' failed - retrying..."; done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
rm -rf tmp/bootstrap \
|
rm -rf tmp/bootstrap \
|
||||||
&& git clone --depth 1 --branch v5.0.0-beta2 https://github.com/twbs/bootstrap.git tmp/bootstrap \
|
&& git clone --depth 1 --branch v5.0.0-beta2 https://github.com/twbs/bootstrap.git tmp/bootstrap \
|
||||||
&& cd tmp/bootstrap \
|
&& cd tmp/bootstrap \
|
||||||
@@ -171,7 +178,7 @@ rm -rf tmp/bootstrap \
|
|||||||
EOF
|
EOF
|
||||||
ERR=$?; if [ "$ERR" != "0" ]; then echo "Error: $ERR"; exit $ERR; fi
|
ERR=$?; if [ "$ERR" != "0" ]; then echo "Error: $ERR"; exit $ERR; fi
|
||||||
rm -rf node_modules \
|
rm -rf node_modules \
|
||||||
&& npm ci \
|
&& npm_install \
|
||||||
&& minify_in_situ "node_modules/@popperjs/core" \
|
&& minify_in_situ "node_modules/@popperjs/core" \
|
||||||
&& rm -rf dist/js/* \
|
&& rm -rf dist/js/* \
|
||||||
&& minify_in_situ "build" \
|
&& minify_in_situ "build" \
|
||||||
|
|||||||
@@ -14,6 +14,13 @@ minify_in_situ() {
|
|||||||
uglify-js $ARGS
|
uglify-js $ARGS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
npm_install() {
|
||||||
|
PKG="$1"
|
||||||
|
while !(npm install $PKG); do
|
||||||
|
while !(npm cache clean --force); do echo "'npm cache clean' failed - retrying..."; done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
rm -rf tmp/buble \
|
rm -rf tmp/buble \
|
||||||
&& git clone https://github.com/bublejs/buble.git tmp/buble \
|
&& git clone https://github.com/bublejs/buble.git tmp/buble \
|
||||||
&& cd tmp/buble \
|
&& cd tmp/buble \
|
||||||
@@ -38,7 +45,7 @@ EOF
|
|||||||
ERR=$?; if [ "$ERR" != "0" ]; then echo "Error: $ERR"; exit $ERR; fi
|
ERR=$?; if [ "$ERR" != "0" ]; then echo "Error: $ERR"; exit $ERR; fi
|
||||||
minify_in_situ "src" \
|
minify_in_situ "src" \
|
||||||
&& rm -rf node_modules \
|
&& rm -rf node_modules \
|
||||||
&& npm ci \
|
&& npm_install \
|
||||||
&& rm -rf dist \
|
&& rm -rf dist \
|
||||||
&& npm run build \
|
&& npm run build \
|
||||||
&& minify_in_situ "dist" \
|
&& minify_in_situ "dist" \
|
||||||
|
|||||||
@@ -14,6 +14,13 @@ minify_in_situ() {
|
|||||||
uglify-js $ARGS
|
uglify-js $ARGS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
npm_install() {
|
||||||
|
PKG="$1"
|
||||||
|
while !(npm install $PKG); do
|
||||||
|
while !(npm cache clean --force); do echo "'npm cache clean' failed - retrying..."; done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
rm -rf tmp/butternut \
|
rm -rf tmp/butternut \
|
||||||
&& git clone https://github.com/Rich-Harris/butternut.git tmp/butternut \
|
&& git clone https://github.com/Rich-Harris/butternut.git tmp/butternut \
|
||||||
&& cd tmp/butternut \
|
&& cd tmp/butternut \
|
||||||
@@ -38,7 +45,7 @@ EOF
|
|||||||
ERR=$?; if [ "$ERR" != "0" ]; then echo "Error: $ERR"; exit $ERR; fi
|
ERR=$?; if [ "$ERR" != "0" ]; then echo "Error: $ERR"; exit $ERR; fi
|
||||||
minify_in_situ "src" \
|
minify_in_situ "src" \
|
||||||
&& rm -rf node_modules \
|
&& rm -rf node_modules \
|
||||||
&& npm install \
|
&& npm_install \
|
||||||
&& rm -rf dist \
|
&& rm -rf dist \
|
||||||
&& npm run build \
|
&& npm run build \
|
||||||
&& minify_in_situ "dist" \
|
&& minify_in_situ "dist" \
|
||||||
|
|||||||
@@ -36,7 +36,9 @@ EOF
|
|||||||
}
|
}
|
||||||
if [ $NATIVE ]; then unset -f timeout; fi
|
if [ $NATIVE ]; then unset -f timeout; fi
|
||||||
|
|
||||||
git clone --branch v1.6.0 --depth 1 https://github.com/jasongin/nvs.git ~/.nvs
|
while !(git clone --branch v1.6.0 --depth 1 https://github.com/jasongin/nvs.git ~/.nvs); do
|
||||||
|
rm -rf ~/.nvs
|
||||||
|
done
|
||||||
while ! timeout 60 bash -c ". ~/.nvs/nvs.sh add $NODE && nvs use $NODE"; do
|
while ! timeout 60 bash -c ". ~/.nvs/nvs.sh add $NODE && nvs use $NODE"; do
|
||||||
cd ~/.nvs
|
cd ~/.nvs
|
||||||
while !(git clean -xdf); do echo "'git clean' failed - retrying..."; done
|
while !(git clean -xdf); do echo "'git clean' failed - retrying..."; done
|
||||||
@@ -51,4 +53,6 @@ npm config set save false
|
|||||||
npm config set strict-ssl false
|
npm config set strict-ssl false
|
||||||
npm config set update-notifier false
|
npm config set update-notifier false
|
||||||
npm --version
|
npm --version
|
||||||
while !(npm install); do echo "'npm install' failed - retrying..."; done
|
while !(npm install); do
|
||||||
|
while !(npm cache clean --force); do echo "'npm cache clean' failed - retrying..."; done
|
||||||
|
done
|
||||||
|
|||||||
@@ -18,6 +18,13 @@ minify_in_situ() {
|
|||||||
uglify-js $ARGS
|
uglify-js $ARGS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
npm_install() {
|
||||||
|
PKG="$1"
|
||||||
|
while !(npm install $PKG); do
|
||||||
|
while !(npm cache clean --force); do echo "'npm cache clean' failed - retrying..."; done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
rm -rf tmp/mathjs \
|
rm -rf tmp/mathjs \
|
||||||
&& git clone --depth 1 --branch v9.2.0 https://github.com/josdejong/mathjs.git tmp/mathjs \
|
&& git clone --depth 1 --branch v9.2.0 https://github.com/josdejong/mathjs.git tmp/mathjs \
|
||||||
&& cd tmp/mathjs \
|
&& cd tmp/mathjs \
|
||||||
@@ -191,7 +198,7 @@ minify_in_situ "bin" \
|
|||||||
&& minify_in_situ "test" \
|
&& minify_in_situ "test" \
|
||||||
&& minify_in_situ "tools" \
|
&& minify_in_situ "tools" \
|
||||||
&& rm -rf node_modules \
|
&& rm -rf node_modules \
|
||||||
&& npm ci \
|
&& npm_install \
|
||||||
&& rm -rf lib \
|
&& rm -rf lib \
|
||||||
&& npm run build \
|
&& npm run build \
|
||||||
&& minify_in_situ "lib" \
|
&& minify_in_situ "lib" \
|
||||||
|
|||||||
@@ -14,6 +14,13 @@ minify_in_situ() {
|
|||||||
uglify-js $ARGS
|
uglify-js $ARGS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
npm_install() {
|
||||||
|
PKG="$1"
|
||||||
|
while !(npm install $PKG); do
|
||||||
|
while !(npm cache clean --force); do echo "'npm cache clean' failed - retrying..."; done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
rm -rf tmp/rollup \
|
rm -rf tmp/rollup \
|
||||||
&& git clone https://github.com/rollup/rollup.git tmp/rollup \
|
&& git clone https://github.com/rollup/rollup.git tmp/rollup \
|
||||||
&& cd tmp/rollup \
|
&& cd tmp/rollup \
|
||||||
@@ -77,7 +84,7 @@ minify_in_situ "bin" \
|
|||||||
&& minify_in_situ "browser" \
|
&& minify_in_situ "browser" \
|
||||||
&& minify_in_situ "src" \
|
&& minify_in_situ "src" \
|
||||||
&& rm -rf node_modules \
|
&& rm -rf node_modules \
|
||||||
&& npm ci \
|
&& npm_install \
|
||||||
&& rm -rf dist \
|
&& rm -rf dist \
|
||||||
&& npm run build \
|
&& npm run build \
|
||||||
&& minify_in_situ "dist" \
|
&& minify_in_situ "dist" \
|
||||||
|
|||||||
@@ -6,17 +6,28 @@ UGLIFY_OPTIONS=$@
|
|||||||
minify_in_situ() {
|
minify_in_situ() {
|
||||||
ARGS="$UGLIFY_OPTIONS --validate --in-situ"
|
ARGS="$UGLIFY_OPTIONS --validate --in-situ"
|
||||||
DIRS="$1"
|
DIRS="$1"
|
||||||
|
echo '> esbuild' $DIRS
|
||||||
|
for i in `find $DIRS -type f -name '*.ts' | grep -v '\.d\.ts'`
|
||||||
|
do
|
||||||
|
echo "$i"
|
||||||
|
CODE=`cat "$i"`
|
||||||
|
node_modules/.bin/esbuild --loader=ts --target=esnext > "$i" <<EOF
|
||||||
|
$CODE
|
||||||
|
EOF
|
||||||
|
ARGS="$ARGS $i"
|
||||||
|
done
|
||||||
echo '> uglify-js' $DIRS $UGLIFY_OPTIONS
|
echo '> uglify-js' $DIRS $UGLIFY_OPTIONS
|
||||||
for i in `find $DIRS -type f -name '*.js'`
|
for i in `find $DIRS -type f -name '*.js'`
|
||||||
do
|
do
|
||||||
ARGS="$ARGS $i"
|
ARGS="$ARGS $i"
|
||||||
done
|
done
|
||||||
uglify-js $ARGS
|
uglify-js $ARGS
|
||||||
for i in `find $DIRS -type f -name '*.ts' | grep -v '\.d\.ts'`
|
}
|
||||||
do
|
|
||||||
echo "$i"
|
npm_install() {
|
||||||
node_modules/.bin/esbuild --loader=ts --target=node14 < "$i" \
|
PKG="$1"
|
||||||
| uglify-js $UGLIFY_OPTIONS -o "$i"
|
while !(npm install $PKG); do
|
||||||
|
while !(npm cache clean --force); do echo "'npm cache clean' failed - retrying..."; done
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,6 +43,9 @@ rm -rf tmp/rollup \
|
|||||||
- "postpublish": "pinst --enable",
|
- "postpublish": "pinst --enable",
|
||||||
- "prepare": "npm run build",
|
- "prepare": "npm run build",
|
||||||
- "prepublishOnly": "pinst --disable && npm ci && npm run lint:nofix && npm run security && npm run build:bootstrap && npm run test:all",
|
- "prepublishOnly": "pinst --disable && npm ci && npm run lint:nofix && npm run security && npm run build:bootstrap && npm run test:all",
|
||||||
|
@@ -93 +89 @@
|
||||||
|
- "is-reference": "lukastaegert/is-reference#update-class-features",
|
||||||
|
+ "is-reference": "3.0.0",
|
||||||
--- a/test/cli/index.js
|
--- a/test/cli/index.js
|
||||||
+++ b/test/cli/index.js
|
+++ b/test/cli/index.js
|
||||||
@@ -13,0 +14,3 @@ sander.rimrafSync(__dirname, 'node_modules');
|
@@ -13,0 +14,3 @@ sander.rimrafSync(__dirname, 'node_modules');
|
||||||
@@ -40,11 +54,11 @@ rm -rf tmp/rollup \
|
|||||||
+sander.rimrafSync(__dirname, 'samples', 'watch', 'watch-config-initial-error');
|
+sander.rimrafSync(__dirname, 'samples', 'watch', 'watch-config-initial-error');
|
||||||
EOF
|
EOF
|
||||||
ERR=$?; if [ "$ERR" != "0" ]; then echo "Error: $ERR"; exit $ERR; fi
|
ERR=$?; if [ "$ERR" != "0" ]; then echo "Error: $ERR"; exit $ERR; fi
|
||||||
npm install esbuild-wasm@0.8.56 \
|
npm_install esbuild-wasm@0.8.56 \
|
||||||
&& minify_in_situ "cli" \
|
&& minify_in_situ "cli" \
|
||||||
&& minify_in_situ "src" \
|
&& minify_in_situ "src" \
|
||||||
&& rm -rf node_modules \
|
&& rm -rf node_modules \
|
||||||
&& npm ci \
|
&& npm_install \
|
||||||
&& rm -rf dist \
|
&& rm -rf dist \
|
||||||
&& npm run build \
|
&& npm run build \
|
||||||
&& minify_in_situ "dist" \
|
&& minify_in_situ "dist" \
|
||||||
|
|||||||
@@ -6,6 +6,16 @@ UGLIFY_OPTIONS=$@
|
|||||||
minify_in_situ() {
|
minify_in_situ() {
|
||||||
ARGS="$UGLIFY_OPTIONS --validate --in-situ"
|
ARGS="$UGLIFY_OPTIONS --validate --in-situ"
|
||||||
DIRS="$1"
|
DIRS="$1"
|
||||||
|
echo '> esbuild' $DIRS
|
||||||
|
for i in `find $DIRS -type f -name '*.ts' | grep -v '\.d\.ts'`
|
||||||
|
do
|
||||||
|
echo "$i"
|
||||||
|
CODE=`cat "$i"`
|
||||||
|
node_modules/.bin/esbuild --loader=ts --target=esnext > "$i" <<EOF
|
||||||
|
$CODE
|
||||||
|
EOF
|
||||||
|
ARGS="$ARGS $i"
|
||||||
|
done
|
||||||
echo '> uglify-js' $DIRS $UGLIFY_OPTIONS
|
echo '> uglify-js' $DIRS $UGLIFY_OPTIONS
|
||||||
for i in `find $DIRS -type f -name '*.js'`
|
for i in `find $DIRS -type f -name '*.js'`
|
||||||
do
|
do
|
||||||
@@ -16,11 +26,12 @@ minify_in_situ() {
|
|||||||
ARGS="$ARGS $i"
|
ARGS="$ARGS $i"
|
||||||
done
|
done
|
||||||
uglify-js $ARGS
|
uglify-js $ARGS
|
||||||
for i in `find $DIRS -type f -name '*.ts' | grep -v '\.d\.ts'`
|
}
|
||||||
do
|
|
||||||
echo "$i"
|
npm_install() {
|
||||||
node_modules/.bin/esbuild --loader=ts --target=node14 < "$i" \
|
PKG="$1"
|
||||||
| uglify-js $UGLIFY_OPTIONS -o "$i"
|
while !(npm install $PKG); do
|
||||||
|
while !(npm cache clean --force); do echo "'npm cache clean' failed - retrying..."; done
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,10 +90,10 @@ rm -rf tmp/sucrase \
|
|||||||
+export { getJSXPragmaInfo as HACK };
|
+export { getJSXPragmaInfo as HACK };
|
||||||
EOF
|
EOF
|
||||||
ERR=$?; if [ "$ERR" != "0" ]; then echo "Error: $ERR"; exit $ERR; fi
|
ERR=$?; if [ "$ERR" != "0" ]; then echo "Error: $ERR"; exit $ERR; fi
|
||||||
npm install esbuild-wasm@0.8.56 \
|
npm_install esbuild-wasm@0.8.56 \
|
||||||
&& minify_in_situ "src" \
|
&& minify_in_situ "src" \
|
||||||
&& rm -rf node_modules \
|
&& rm -rf node_modules \
|
||||||
&& npm install \
|
&& npm_install \
|
||||||
&& npm run clean \
|
&& npm run clean \
|
||||||
&& npm run build \
|
&& npm run build \
|
||||||
&& minify_in_situ "dist" \
|
&& minify_in_situ "dist" \
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
alias uglify-js="node --max-old-space-size=4096 $PWD/bin/uglifyjs"
|
alias uglify-js="node --max-old-space-size=8192 $PWD/bin/uglifyjs"
|
||||||
UGLIFY_OPTIONS=$@
|
UGLIFY_OPTIONS=$@
|
||||||
|
|
||||||
minify_in_situ() {
|
minify_in_situ() {
|
||||||
@@ -14,6 +14,13 @@ minify_in_situ() {
|
|||||||
uglify-js $ARGS
|
uglify-js $ARGS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
npm_install() {
|
||||||
|
PKG="$1"
|
||||||
|
while !(npm install $PKG); do
|
||||||
|
while !(npm cache clean --force); do echo "'npm cache clean' failed - retrying..."; done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
rm -rf tmp/web-tooling-benchmark \
|
rm -rf tmp/web-tooling-benchmark \
|
||||||
&& git clone --depth 1 --branch v0.5.3 https://github.com/v8/web-tooling-benchmark.git tmp/web-tooling-benchmark \
|
&& git clone --depth 1 --branch v0.5.3 https://github.com/v8/web-tooling-benchmark.git tmp/web-tooling-benchmark \
|
||||||
&& cd tmp/web-tooling-benchmark \
|
&& cd tmp/web-tooling-benchmark \
|
||||||
@@ -23,6 +30,17 @@ rm -rf tmp/web-tooling-benchmark \
|
|||||||
+++ b/package.json
|
+++ b/package.json
|
||||||
@@ -12 +11,0 @@
|
@@ -12 +11,0 @@
|
||||||
- "postinstall": "npm run build:terser-bundled && npm run build:uglify-js-bundled && npm run build",
|
- "postinstall": "npm run build:terser-bundled && npm run build:uglify-js-bundled && npm run build",
|
||||||
|
--- a/src/bootstrap.js
|
||||||
|
+++ b/src/bootstrap.js
|
||||||
|
@@ -6 +6 @@ const gmean = require("compute-gmean");
|
||||||
|
-const package = require("../package.json");
|
||||||
|
+const package_json = require("../package.json");
|
||||||
|
@@ -65 +65 @@ function initialize() {
|
||||||
|
- document.title = \`Web Tooling Benchmark v\${package.version}\`;
|
||||||
|
+ document.title = \`Web Tooling Benchmark v\${package_json.version}\`;
|
||||||
|
@@ -68 +68 @@ function initialize() {
|
||||||
|
- versionDiv.innerHTML = \`v\${package.version}\`;
|
||||||
|
+ versionDiv.innerHTML = \`v\${package_json.version}\`;
|
||||||
--- a/src/cli-flags-helper.js
|
--- a/src/cli-flags-helper.js
|
||||||
+++ b/src/cli-flags-helper.js
|
+++ b/src/cli-flags-helper.js
|
||||||
@@ -7 +6,0 @@ const targetList = new Set([
|
@@ -7 +6,0 @@ const targetList = new Set([
|
||||||
@@ -36,7 +54,7 @@ ERR=$?; if [ "$ERR" != "0" ]; then echo "Error: $ERR"; exit $ERR; fi
|
|||||||
minify_in_situ "src" \
|
minify_in_situ "src" \
|
||||||
&& minify_in_situ "third_party" \
|
&& minify_in_situ "third_party" \
|
||||||
&& rm -rf node_modules \
|
&& rm -rf node_modules \
|
||||||
&& npm ci \
|
&& npm_install \
|
||||||
&& rm -rf build/* \
|
&& rm -rf build/* \
|
||||||
&& npm run build:terser-bundled \
|
&& npm run build:terser-bundled \
|
||||||
&& npm run build:uglify-js-bundled \
|
&& npm run build:uglify-js-bundled \
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ exports.run_code = semver.satisfies(process.version, "0.8") ? function(code, top
|
|||||||
} : semver.satisfies(process.version, "<0.12") ? run_code_vm : function(code, toplevel, timeout) {
|
} : semver.satisfies(process.version, "<0.12") ? run_code_vm : function(code, toplevel, timeout) {
|
||||||
if ([
|
if ([
|
||||||
/\basync[ \t]*\([\s\S]*?\)[ \t]*=>/,
|
/\basync[ \t]*\([\s\S]*?\)[ \t]*=>/,
|
||||||
/\b(async[ \t]+function|setImmediate|setInterval|setTimeout)\b/,
|
/\b(async[ \t]+function|Promise|setImmediate|setInterval|setTimeout)\b/,
|
||||||
/\basync([ \t]+|[ \t]*\*[ \t]*)[^\s()[\]{},.&|!~=*%/+-]+(\s*\(|[ \t]*=>)/,
|
/\basync([ \t]+|[ \t]*#|[ \t]*\*[ \t]*)[^\s()[\]{},.&|!~=*%/+-]+(\s*\(|[ \t]*=>)/,
|
||||||
].some(function(pattern) {
|
].some(function(pattern) {
|
||||||
return pattern.test(code);
|
return pattern.test(code);
|
||||||
})) {
|
})) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
var get = require("https").get;
|
var get = require("https").get;
|
||||||
var parse = require("url").parse;
|
var parse = require("url").parse;
|
||||||
|
|
||||||
var base, token, run_number, eldest = true;
|
var base, token, run_number;
|
||||||
exports.init = function(url, auth, num) {
|
exports.init = function(url, auth, num) {
|
||||||
base = url;
|
base = url;
|
||||||
token = auth;
|
token = auth;
|
||||||
@@ -19,14 +19,14 @@ exports.should_stop = function(callback) {
|
|||||||
do {
|
do {
|
||||||
workflow = runs.pop();
|
workflow = runs.pop();
|
||||||
if (!workflow) return;
|
if (!workflow) return;
|
||||||
if (workflow.event == "schedule" && workflow.run_number == run_number) found = true;
|
if (is_cron(workflow) && workflow.run_number == run_number) found = true;
|
||||||
} while (!found && workflow.status == "completed");
|
} while (!found && workflow.status == "completed");
|
||||||
read(workflow.jobs_url, function(reply) {
|
read(workflow.jobs_url, function(reply) {
|
||||||
if (!reply || !Array.isArray(reply.jobs)) return;
|
if (!reply || !Array.isArray(reply.jobs)) return;
|
||||||
if (!reply.jobs.every(function(job) {
|
if (!reply.jobs.every(function(job) {
|
||||||
if (job.status == "completed") return true;
|
if (job.status == "completed") return true;
|
||||||
remaining--;
|
remaining--;
|
||||||
return found || workflow.event != "schedule";
|
return found || !is_cron(workflow);
|
||||||
})) return;
|
})) return;
|
||||||
if (remaining >= 0) {
|
if (remaining >= 0) {
|
||||||
next();
|
next();
|
||||||
@@ -38,6 +38,10 @@ exports.should_stop = function(callback) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function is_cron(workflow) {
|
||||||
|
return /^(schedule|workflow_dispatch|workflow_run)$/.test(workflow.event);
|
||||||
|
}
|
||||||
|
|
||||||
function read(url, callback) {
|
function read(url, callback) {
|
||||||
var done = function(reply) {
|
var done = function(reply) {
|
||||||
done = function() {};
|
done = function() {};
|
||||||
@@ -56,7 +60,7 @@ function read(url, callback) {
|
|||||||
}).on("end", function() {
|
}).on("end", function() {
|
||||||
var reply;
|
var reply;
|
||||||
try {
|
try {
|
||||||
reply = JSON.parse(chunks.join(""))
|
reply = JSON.parse(chunks.join(""));
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
done(reply);
|
done(reply);
|
||||||
}).on("error", function() {
|
}).on("error", function() {
|
||||||
|
|||||||
@@ -152,6 +152,7 @@ var SUPPORT = function(matrix) {
|
|||||||
logical_assignment: "[].p ??= 0;",
|
logical_assignment: "[].p ??= 0;",
|
||||||
new_target: "function f() { new.target; }",
|
new_target: "function f() { new.target; }",
|
||||||
nullish: "0 ?? 0",
|
nullish: "0 ?? 0",
|
||||||
|
optional_chaining: "0?.p",
|
||||||
rest: "var [...a] = [];",
|
rest: "var [...a] = [];",
|
||||||
rest_object: "var {...a} = {};",
|
rest_object: "var {...a} = {};",
|
||||||
spread: "[...[]];",
|
spread: "[...[]];",
|
||||||
@@ -355,6 +356,7 @@ var block_vars = [];
|
|||||||
var lambda_vars = [];
|
var lambda_vars = [];
|
||||||
var unique_vars = [];
|
var unique_vars = [];
|
||||||
var classes = [];
|
var classes = [];
|
||||||
|
var allow_this = true;
|
||||||
var async = false;
|
var async = false;
|
||||||
var has_await = false;
|
var has_await = false;
|
||||||
var export_default = false;
|
var export_default = false;
|
||||||
@@ -401,6 +403,7 @@ function createTopLevelCode() {
|
|||||||
lambda_vars.length = 0;
|
lambda_vars.length = 0;
|
||||||
unique_vars.length = 0;
|
unique_vars.length = 0;
|
||||||
classes.length = 0;
|
classes.length = 0;
|
||||||
|
allow_this = true;
|
||||||
async = false;
|
async = false;
|
||||||
has_await = false;
|
has_await = false;
|
||||||
export_default = false;
|
export_default = false;
|
||||||
@@ -445,9 +448,9 @@ function addTrailingComma(list) {
|
|||||||
|
|
||||||
function createParams(was_async, was_generator, noDuplicate) {
|
function createParams(was_async, was_generator, noDuplicate) {
|
||||||
var save_async = async;
|
var save_async = async;
|
||||||
if (was_async) async = true;
|
if (!async) async = was_async;
|
||||||
var save_generator = generator;
|
var save_generator = generator;
|
||||||
if (was_generator) generator = true;
|
if (!generator) generator = was_generator;
|
||||||
var len = unique_vars.length;
|
var len = unique_vars.length;
|
||||||
var params = [];
|
var params = [];
|
||||||
for (var n = rng(4); --n >= 0;) {
|
for (var n = rng(4); --n >= 0;) {
|
||||||
@@ -569,9 +572,9 @@ function createAssignmentPairs(recurmax, stmtDepth, canThrow, nameLenBefore, was
|
|||||||
function createName() {
|
function createName() {
|
||||||
unique_vars.push("a", "b", "c", "undefined", "NaN", "Infinity");
|
unique_vars.push("a", "b", "c", "undefined", "NaN", "Infinity");
|
||||||
var save_async = async;
|
var save_async = async;
|
||||||
if (was_async) async = true;
|
if (!async) async = was_async;
|
||||||
var save_generator = generator;
|
var save_generator = generator;
|
||||||
if (was_generator) generator = true;
|
if (!generator) generator = was_generator;
|
||||||
var name = createVarName(MANDATORY);
|
var name = createVarName(MANDATORY);
|
||||||
generator = save_generator;
|
generator = save_generator;
|
||||||
async = save_async;
|
async = save_async;
|
||||||
@@ -982,8 +985,17 @@ function createStatement(recurmax, canThrow, canBreak, canContinue, cannotReturn
|
|||||||
var label = createLabel(canBreak, canContinue);
|
var label = createLabel(canBreak, canContinue);
|
||||||
canBreak = label.break || enableLoopControl(canBreak, CAN_BREAK);
|
canBreak = label.break || enableLoopControl(canBreak, CAN_BREAK);
|
||||||
canContinue = label.continue || enableLoopControl(canContinue, CAN_CONTINUE);
|
canContinue = label.continue || enableLoopControl(canContinue, CAN_CONTINUE);
|
||||||
var key = rng(10) ? "key" + loop : getVarName(NO_CONST);
|
|
||||||
var of = SUPPORT.for_of && rng(20) == 0;
|
var of = SUPPORT.for_of && rng(20) == 0;
|
||||||
|
var key;
|
||||||
|
if (rng(10)) {
|
||||||
|
key = "key" + loop;
|
||||||
|
} else if (bug_for_of_async && of) {
|
||||||
|
addAvoidVar("async");
|
||||||
|
key = getVarName(NO_CONST);
|
||||||
|
removeAvoidVar("async");
|
||||||
|
} else {
|
||||||
|
key = getVarName(NO_CONST);
|
||||||
|
}
|
||||||
var init = "";
|
var init = "";
|
||||||
if (!/^key/.test(key)) {
|
if (!/^key/.test(key)) {
|
||||||
if (!(of && bug_for_of_var) && rng(10) == 0) init = "var ";
|
if (!(of && bug_for_of_var) && rng(10) == 0) init = "var ";
|
||||||
@@ -1179,7 +1191,7 @@ function createStatement(recurmax, canThrow, canBreak, canContinue, cannotReturn
|
|||||||
|
|
||||||
function createSwitchParts(recurmax, n, canThrow, canBreak, canContinue, cannotReturn, stmtDepth) {
|
function createSwitchParts(recurmax, n, canThrow, canBreak, canContinue, cannotReturn, stmtDepth) {
|
||||||
var hadDefault = false;
|
var hadDefault = false;
|
||||||
var s = [""];
|
var s = [ "" ];
|
||||||
canBreak = enableLoopControl(canBreak, CAN_BREAK);
|
canBreak = enableLoopControl(canBreak, CAN_BREAK);
|
||||||
while (n-- > 0) {
|
while (n-- > 0) {
|
||||||
//hadDefault = n > 0; // disables weird `default` clause positioning (use when handling destabilizes)
|
//hadDefault = n > 0; // disables weird `default` clause positioning (use when handling destabilizes)
|
||||||
@@ -1478,12 +1490,16 @@ function _createExpression(recurmax, noComma, stmtDepth, canThrow) {
|
|||||||
return createValue() + " in " + createObjectLiteral(recurmax, stmtDepth, canThrow);
|
return createValue() + " in " + createObjectLiteral(recurmax, stmtDepth, canThrow);
|
||||||
case p++:
|
case p++:
|
||||||
var name = getVarName();
|
var name = getVarName();
|
||||||
var s = name + "[" + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + "]";
|
var prop = "[" + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + "]";
|
||||||
return canThrow && rng(20) == 0 ? s : name + " && " + s;
|
if (SUPPORT.optional_chaining && rng(50) == 0) return name + "?." + prop;
|
||||||
|
if (canThrow && rng(20) == 0) return name + prop;
|
||||||
|
return name + " && " + name + prop;
|
||||||
case p++:
|
case p++:
|
||||||
var name = getVarName();
|
var name = getVarName();
|
||||||
var s = name + "." + getDotKey();
|
var prop = getDotKey();
|
||||||
return canThrow && rng(20) == 0 ? s : name + " && " + s;
|
if (SUPPORT.optional_chaining && rng(50) == 0) return name + "?." + prop;
|
||||||
|
if (canThrow && rng(20) == 0) return name + "." + prop;
|
||||||
|
return name + " && " + name + "." + prop;
|
||||||
case p++:
|
case p++:
|
||||||
case p++:
|
case p++:
|
||||||
var name = getVarName();
|
var name = getVarName();
|
||||||
@@ -1525,7 +1541,16 @@ function _createExpression(recurmax, noComma, stmtDepth, canThrow) {
|
|||||||
name = rng(3) == 0 ? getVarName() : "f" + rng(funcs + 2);
|
name = rng(3) == 0 ? getVarName() : "f" + rng(funcs + 2);
|
||||||
} while (name in called && !called[name]);
|
} while (name in called && !called[name]);
|
||||||
called[name] = true;
|
called[name] = true;
|
||||||
return mayDefer("typeof " + name + ' == "function" && --_calls_ >= 0 && ' + name + createArgs(recurmax, stmtDepth, canThrow));
|
var args = createArgs(recurmax, stmtDepth, canThrow);
|
||||||
|
var call = "typeof " + name + ' == "function" && --_calls_ >= 0 && ' + name + args;
|
||||||
|
if (canThrow) {
|
||||||
|
if (SUPPORT.optional_chaining && args[0] != "`" && rng(50) == 0) {
|
||||||
|
call = "--_calls_ >= 0 && " + name + "?." + args;
|
||||||
|
} else if (rng(20) == 0) {
|
||||||
|
call = "--_calls_ >= 0 && " + name + args;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mayDefer(call);
|
||||||
}
|
}
|
||||||
_createExpression.N = p;
|
_createExpression.N = p;
|
||||||
return _createExpression(recurmax, noComma, stmtDepth, canThrow);
|
return _createExpression(recurmax, noComma, stmtDepth, canThrow);
|
||||||
@@ -1610,6 +1635,10 @@ var KEYS = [
|
|||||||
"1.5",
|
"1.5",
|
||||||
"3",
|
"3",
|
||||||
].concat(SAFE_KEYS);
|
].concat(SAFE_KEYS);
|
||||||
|
SAFE_KEYS = SAFE_KEYS.concat(SAFE_KEYS);
|
||||||
|
SAFE_KEYS = SAFE_KEYS.concat(SAFE_KEYS);
|
||||||
|
SAFE_KEYS = SAFE_KEYS.concat(SAFE_KEYS);
|
||||||
|
SAFE_KEYS.push("__proto__");
|
||||||
|
|
||||||
function getDotKey(assign) {
|
function getDotKey(assign) {
|
||||||
var key;
|
var key;
|
||||||
@@ -1704,6 +1733,8 @@ function createObjectFunction(recurmax, stmtDepth, canThrow, internal, isClazz)
|
|||||||
fn = function(defns) {
|
fn = function(defns) {
|
||||||
if (generator) name = "*" + name;
|
if (generator) name = "*" + name;
|
||||||
if (async) name = "async "+ name;
|
if (async) name = "async "+ name;
|
||||||
|
var save_allow = allow_this;
|
||||||
|
if (internal == "super") allow_this = false;
|
||||||
s = [
|
s = [
|
||||||
name + "(" + createParams(save_async, save_generator, NO_DUPLICATE) + "){",
|
name + "(" + createParams(save_async, save_generator, NO_DUPLICATE) + "){",
|
||||||
strictMode(),
|
strictMode(),
|
||||||
@@ -1711,6 +1742,7 @@ function createObjectFunction(recurmax, stmtDepth, canThrow, internal, isClazz)
|
|||||||
];
|
];
|
||||||
s.push(_createStatements(2, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CANNOT_RETURN, stmtDepth));
|
s.push(_createStatements(2, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CANNOT_RETURN, stmtDepth));
|
||||||
if (internal == "super") s.push("super" + createArgs(recurmax, stmtDepth, canThrow, NO_TEMPLATE) + ";");
|
if (internal == "super") s.push("super" + createArgs(recurmax, stmtDepth, canThrow, NO_TEMPLATE) + ";");
|
||||||
|
allow_this = save_allow;
|
||||||
if (/^(constructor|super)$/.test(internal) || rng(10) == 0) for (var i = rng(4); --i >= 0;) {
|
if (/^(constructor|super)$/.test(internal) || rng(10) == 0) for (var i = rng(4); --i >= 0;) {
|
||||||
s.push(rng(2) ? createSuperAssignment(recurmax, stmtDepth, canThrow) : createThisAssignment(recurmax, stmtDepth, canThrow));
|
s.push(rng(2) ? createSuperAssignment(recurmax, stmtDepth, canThrow) : createThisAssignment(recurmax, stmtDepth, canThrow));
|
||||||
}
|
}
|
||||||
@@ -1727,8 +1759,9 @@ function createObjectFunction(recurmax, stmtDepth, canThrow, internal, isClazz)
|
|||||||
|
|
||||||
function createObjectLiteral(recurmax, stmtDepth, canThrow) {
|
function createObjectLiteral(recurmax, stmtDepth, canThrow) {
|
||||||
recurmax--;
|
recurmax--;
|
||||||
var obj = ["({"];
|
var obj = [ "({" ];
|
||||||
var offset = SUPPORT.spread_object ? 0 : SUPPORT.computed_key ? 2 : 4;
|
var offset = SUPPORT.spread_object ? 0 : SUPPORT.computed_key ? 2 : 4;
|
||||||
|
var has_proto = false;
|
||||||
for (var i = rng(6); --i >= 0;) switch (offset + rng(50 - offset)) {
|
for (var i = rng(6); --i >= 0;) switch (offset + rng(50 - offset)) {
|
||||||
case 0:
|
case 0:
|
||||||
obj.push("..." + getVarName() + ",");
|
obj.push("..." + getVarName() + ",");
|
||||||
@@ -1744,7 +1777,12 @@ function createObjectLiteral(recurmax, stmtDepth, canThrow) {
|
|||||||
obj.push(createObjectFunction(recurmax, stmtDepth, canThrow) + ",");
|
obj.push(createObjectFunction(recurmax, stmtDepth, canThrow) + ",");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
obj.push(createObjectKey(recurmax, stmtDepth, canThrow) + ": " + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + ",");
|
if (has_proto || rng(200)) {
|
||||||
|
obj.push(createObjectKey(recurmax, stmtDepth, canThrow) + ": " + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + ",");
|
||||||
|
} else {
|
||||||
|
obj.push("__proto__: " + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + " || {},");
|
||||||
|
has_proto = true;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
obj.push("})");
|
obj.push("})");
|
||||||
@@ -1787,7 +1825,7 @@ function createClassLiteral(recurmax, stmtDepth, canThrow, name) {
|
|||||||
if (SUPPORT.class_field && rng(2)) {
|
if (SUPPORT.class_field && rng(2)) {
|
||||||
s += internal || createObjectKey(recurmax, stmtDepth, canThrow);
|
s += internal || createObjectKey(recurmax, stmtDepth, canThrow);
|
||||||
if (rng(5)) {
|
if (rng(5)) {
|
||||||
async = false;
|
async = bug_async_class_await && fixed && 0;
|
||||||
generator = false;
|
generator = false;
|
||||||
s += " = " + createExpression(recurmax, NO_COMMA, stmtDepth, fixed ? canThrow : CANNOT_THROW);
|
s += " = " + createExpression(recurmax, NO_COMMA, stmtDepth, fixed ? canThrow : CANNOT_THROW);
|
||||||
generator = save_generator;
|
generator = save_generator;
|
||||||
@@ -1941,7 +1979,7 @@ function createValue() {
|
|||||||
var v;
|
var v;
|
||||||
do {
|
do {
|
||||||
v = VALUES[rng(VALUES.length)];
|
v = VALUES[rng(VALUES.length)];
|
||||||
} while (v == "new.target" && rng(200));
|
} while (v == "new.target" && rng(200) || !allow_this && v == "this");
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1991,7 +2029,7 @@ function isBannedKeyword(name) {
|
|||||||
case "arguments":
|
case "arguments":
|
||||||
return in_class;
|
return in_class;
|
||||||
case "await":
|
case "await":
|
||||||
return async;
|
return async !== false;
|
||||||
case "yield":
|
case "yield":
|
||||||
return generator || in_class;
|
return generator || in_class;
|
||||||
}
|
}
|
||||||
@@ -2036,6 +2074,7 @@ function createVarName(maybe, dontStore) {
|
|||||||
if (require.main !== module) {
|
if (require.main !== module) {
|
||||||
exports.createTopLevelCode = createTopLevelCode;
|
exports.createTopLevelCode = createTopLevelCode;
|
||||||
exports.num_iterations = num_iterations;
|
exports.num_iterations = num_iterations;
|
||||||
|
exports.verbose = verbose;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2217,7 +2256,7 @@ function sort_globals(code) {
|
|||||||
return (typeof global[n] == "function") - (typeof global[m] == "function")
|
return (typeof global[n] == "function") - (typeof global[m] == "function")
|
||||||
|| (m < n ? -1 : m > n ? 1 : 0);
|
|| (m < n ? -1 : m > n ? 1 : 0);
|
||||||
};
|
};
|
||||||
} + "(this));" + code);
|
} + "(this));\n" + code);
|
||||||
if (!Array.isArray(globals)) {
|
if (!Array.isArray(globals)) {
|
||||||
errorln();
|
errorln();
|
||||||
errorln();
|
errorln();
|
||||||
@@ -2255,6 +2294,20 @@ function fuzzy_match(original, uglified) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function patch_proto() {
|
||||||
|
[ Array, Boolean, Error, Function, Number, Object, RegExp, String ].forEach(function(type) {
|
||||||
|
[ "toString", "valueOf" ].forEach(function(prop) {
|
||||||
|
type.prototype[prop] = function(fn) {
|
||||||
|
return function() {
|
||||||
|
try {
|
||||||
|
return fn.apply(this, arguments);
|
||||||
|
} catch (e) {}
|
||||||
|
};
|
||||||
|
}(type.prototype[prop]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function is_error_timeout(ex) {
|
function is_error_timeout(ex) {
|
||||||
return /timed out/.test(ex.message);
|
return /timed out/.test(ex.message);
|
||||||
}
|
}
|
||||||
@@ -2264,7 +2317,7 @@ function is_error_in(ex) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function is_error_spread(ex) {
|
function is_error_spread(ex) {
|
||||||
return ex.name == "TypeError" && /Found non-callable @@iterator| is not iterable| is not a function/.test(ex.message);
|
return ex.name == "TypeError" && /Found non-callable @@iterator| is not iterable| not a function/.test(ex.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
function is_error_recursion(ex) {
|
function is_error_recursion(ex) {
|
||||||
@@ -2383,6 +2436,8 @@ if (SUPPORT.arrow && SUPPORT.async && SUPPORT.rest && typeof sandbox.run_code("a
|
|||||||
return ex.name == "SyntaxError" && ex.message == "Rest parameter must be last formal parameter";
|
return ex.name == "SyntaxError" && ex.message == "Rest parameter must be last formal parameter";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
var bug_async_class_await = SUPPORT.async && SUPPORT.class_field && typeof sandbox.run_code("var await; async function f() { class A { static p = await; } }") != "string";
|
||||||
|
var bug_for_of_async = SUPPORT.for_await_of && typeof sandbox.run_code("var async; for (async of []);") != "string";
|
||||||
var bug_for_of_var = SUPPORT.for_of && SUPPORT.let && typeof sandbox.run_code("try {} catch (e) { for (var e of []); }") != "string";
|
var bug_for_of_var = SUPPORT.for_of && SUPPORT.let && typeof sandbox.run_code("try {} catch (e) { for (var e of []); }") != "string";
|
||||||
if (SUPPORT.destructuring && typeof sandbox.run_code("console.log([ 1 ], {} = 2);") != "string") {
|
if (SUPPORT.destructuring && typeof sandbox.run_code("console.log([ 1 ], {} = 2);") != "string") {
|
||||||
beautify_options.output.v8 = true;
|
beautify_options.output.v8 = true;
|
||||||
@@ -2459,8 +2514,8 @@ for (var round = 1; round <= num_iterations; round++) {
|
|||||||
if (!ok && errored && uglify_result.name == "ReferenceError" && original_result.name == "ReferenceError") ok = true;
|
if (!ok && errored && uglify_result.name == "ReferenceError" && original_result.name == "ReferenceError") ok = true;
|
||||||
// ignore difference due to implicit strict-mode in `class`
|
// ignore difference due to implicit strict-mode in `class`
|
||||||
if (!ok && /\bclass\b/.test(original_code)) {
|
if (!ok && /\bclass\b/.test(original_code)) {
|
||||||
var original_strict = run_code('"use strict";' + original_code, toplevel);
|
var original_strict = run_code('"use strict";\n' + original_code, toplevel);
|
||||||
var uglify_strict = run_code('"use strict";' + uglify_code, toplevel);
|
var uglify_strict = run_code('"use strict";\n' + uglify_code, toplevel);
|
||||||
if (typeof original_strict != "string") {
|
if (typeof original_strict != "string") {
|
||||||
ok = typeof uglify_strict != "string";
|
ok = typeof uglify_strict != "string";
|
||||||
} else {
|
} else {
|
||||||
@@ -2471,6 +2526,12 @@ for (var round = 1; round <= num_iterations; round++) {
|
|||||||
if (!ok && errored && /\bimport\b/.test(original_code)) {
|
if (!ok && errored && /\bimport\b/.test(original_code)) {
|
||||||
if (is_error_redeclaration(uglify_result) && is_error_redeclaration(original_result)) ok = true;
|
if (is_error_redeclaration(uglify_result) && is_error_redeclaration(original_result)) ok = true;
|
||||||
}
|
}
|
||||||
|
// ignore difference due to `__proto__` assignment
|
||||||
|
if (!ok && /\b__proto__\b/.test(original_code)) {
|
||||||
|
var original_proto = run_code("(" + patch_proto + ")();\n" + original_code, toplevel);
|
||||||
|
var uglify_proto = run_code("(" + patch_proto + ")();\n" + uglify_code, toplevel);
|
||||||
|
ok = sandbox.same_stdout(original_proto, uglify_proto);
|
||||||
|
}
|
||||||
// ignore difference in error message caused by `in`
|
// ignore difference in error message caused by `in`
|
||||||
if (!ok && errored && is_error_in(uglify_result) && is_error_in(original_result)) ok = true;
|
if (!ok && errored && is_error_in(uglify_result) && is_error_in(original_result)) ok = true;
|
||||||
// ignore difference in error message caused by spread syntax
|
// ignore difference in error message caused by spread syntax
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
},
|
},
|
||||||
{},
|
{},
|
||||||
{
|
{
|
||||||
"ie8": true,
|
"ie": true,
|
||||||
"toplevel": true
|
"toplevel": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -56,6 +56,9 @@ if (+process.env["UGLIFY_BUG_REPORT"]) exports.minify = function(files, options)
|
|||||||
|
|
||||||
function describe_ast() {
|
function describe_ast() {
|
||||||
var out = OutputStream({ beautify: true });
|
var out = OutputStream({ beautify: true });
|
||||||
|
doitem(AST_Node);
|
||||||
|
return out.get() + "\n";
|
||||||
|
|
||||||
function doitem(ctor) {
|
function doitem(ctor) {
|
||||||
out.print("AST_" + ctor.TYPE);
|
out.print("AST_" + ctor.TYPE);
|
||||||
var props = ctor.SELF_PROPS.filter(function(prop) {
|
var props = ctor.SELF_PROPS.filter(function(prop) {
|
||||||
@@ -86,9 +89,7 @@ function describe_ast() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
doitem(AST_Node);
|
|
||||||
return out + "\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function infer_options(options) {
|
function infer_options(options) {
|
||||||
|
|||||||
Reference in New Issue
Block a user