aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2020-12-19 21:47:01 +0000
committerGitHub <noreply@github.com>2020-12-20 05:47:01 +0800
commit87cf7152135281a4b1a1163b26ea918a0a264f0b (patch)
tree41dd955905f0eebf5cd9f2f215bb26653cbb2a4e
parent2c9c72e06c674ae313001d0b5878fe2ccfc31492 (diff)
downloadtracifyjs-87cf7152135281a4b1a1163b26ea918a0a264f0b.tar.gz
tracifyjs-87cf7152135281a4b1a1163b26ea918a0a264f0b.zip
fix corner case with destructuring `catch` (#4421)
fixes #4420
-rw-r--r--README.md14
-rw-r--r--lib/scope.js8
-rw-r--r--test/compress/destructured.js33
3 files changed, 55 insertions, 0 deletions
diff --git a/README.md b/README.md
index c23116bd..fa02e71f 100644
--- a/README.md
+++ b/README.md
@@ -1209,6 +1209,20 @@ To allow for better optimizations, the compiler makes various assumptions:
`function({}, arguments) {}` will result in `SyntaxError` in earlier versions
of Chrome and Node.js - UglifyJS may modify the input which in turn may
suppress those errors.
+- Earlier versions of Chrome and Node.js will throw `ReferenceError` with the
+ following:
+ ```js
+ var a;
+ try {
+ throw 42;
+ } catch ({
+ [a]: b,
+ // ReferenceError: a is not defined
+ }) {
+ let a;
+ }
+ ```
+ UglifyJS may modify the input which in turn may suppress those errors.
- Later versions of JavaScript will throw `SyntaxError` with the following:
```js
a => {
diff --git a/lib/scope.js b/lib/scope.js
index fac673bc..779637cb 100644
--- a/lib/scope.js
+++ b/lib/scope.js
@@ -208,6 +208,14 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
self.globals = new Dictionary();
var in_arg = [];
var tw = new TreeWalker(function(node) {
+ if (node instanceof AST_Catch) {
+ if (!(node.argname instanceof AST_Destructured)) return;
+ in_arg.push(node);
+ node.argname.walk(tw);
+ in_arg.pop();
+ walk_body(node, tw);
+ return true;
+ }
if (node instanceof AST_Lambda) {
in_arg.push(node);
node.argnames.forEach(function(argname) {
diff --git a/test/compress/destructured.js b/test/compress/destructured.js
index 4c36e451..06c9fddb 100644
--- a/test/compress/destructured.js
+++ b/test/compress/destructured.js
@@ -1968,3 +1968,36 @@ issue_4399: {
expect_stdout: "PASS"
node_version: ">=6"
}
+
+issue_4420: {
+ options = {
+ unused: true,
+ }
+ input: {
+ console.log(function() {
+ var a = 1;
+ try {
+ throw [ "FAIL", "PASS" ];
+ } catch ({
+ [a]: b,
+ }) {
+ let a = 0;
+ return b;
+ }
+ }());
+ }
+ expect: {
+ console.log(function() {
+ var a = 1;
+ try {
+ throw [ "FAIL", "PASS" ];
+ } catch ({
+ [a]: b,
+ }) {
+ return b;
+ }
+ }());
+ }
+ expect_stdout: "PASS"
+ node_version: ">=8"
+}