Program (script) @2:1
├─ FunctionDeclaration "basic_catch" @2:1
│  └─ body
│     └─ FunctionBody @3:5
│        └─ TryStatement @3:5
│           ├─ block
│           │  └─ BlockStatement @3:9
│           │     └─ ThrowStatement @4:9
│           │        └─ NumericLiteral 1 @4:15
│           └─ handler
│              └─ CatchClause @5:7
│                 ├─ parameter
│                 │  └─ Identifier "err" [variable:0] @5:14
│                 └─ BlockStatement @5:19
│                    └─ ReturnStatement @6:9
│                       └─ Identifier "err" [variable:0] @6:16
├─ FunctionDeclaration "catch_destruct" @11:1
│  └─ body
│     └─ FunctionBody @12:5
│        └─ TryStatement @12:5
│           ├─ block
│           │  └─ BlockStatement @12:9
│           │     └─ ThrowStatement @13:9
│           │        └─ ObjectExpression @13:15
│           │           ├─ ObjectProperty @13:15
│           │           │  ├─ StringLiteral "msg" @13:17
│           │           │  └─ StringLiteral "oops" @13:28
│           │           └─ ObjectProperty @13:15
│           │              ├─ StringLiteral "code" @13:30
│           │              └─ NumericLiteral 42 @13:36
│           └─ handler
│              └─ CatchClause @14:7
│                 ├─ parameter
│                 │  └─ BindingPattern (object)
│                 │     ├─ entry
│                 │     │  └─ name
│                 │     │     └─ Identifier "msg" [variable:0] @14:16
│                 │     └─ entry
│                 │        └─ name
│                 │           └─ Identifier "code" [variable:1] @14:21
│                 └─ BlockStatement @14:29
│                    └─ ReturnStatement @15:9
│                       └─ BinaryExpression (+) @15:20
│                          ├─ Identifier "msg" [variable:0] @15:16
│                          └─ Identifier "code" [variable:1] @15:22
├─ FunctionDeclaration "catch_shadow" @20:1
│  └─ body
│     └─ FunctionBody @21:5
│        ├─ VariableDeclaration (let) @21:5
│        │  └─ VariableDeclarator @21:5
│        │     ├─ Identifier "err" [variable:1] (let) @21:9
│        │     └─ StringLiteral "outer" @21:22
│        ├─ TryStatement @22:5
│        │  ├─ block
│        │  │  └─ BlockStatement @22:9
│        │  │     └─ ThrowStatement @23:9
│        │  │        └─ StringLiteral "inner" @23:22
│        │  └─ handler
│        │     └─ CatchClause @24:7
│        │        ├─ parameter
│        │        │  └─ Identifier "err" [variable:0] @24:14
│        │        └─ BlockStatement @24:19
│        │           └─ ExpressionStatement @25:9
│        │              └─ Identifier "err" [variable:0] @25:9
│        └─ ReturnStatement @27:5
│           └─ Identifier "err" [variable:1] (let) @27:12
├─ FunctionDeclaration "catch_no_param" @31:1
│  └─ body
│     └─ FunctionBody @32:5
│        └─ TryStatement @32:5
│           ├─ block
│           │  └─ BlockStatement @32:9
│           │     └─ ThrowStatement @33:9
│           │        └─ NumericLiteral 1 @33:15
│           └─ handler
│              └─ CatchClause @34:7
│                 └─ BlockStatement @34:13
│                    └─ ReturnStatement @35:9
│                       └─ NumericLiteral 2 @35:16
├─ FunctionDeclaration "multiple_catch_destruct" @41:1
│  └─ body
│     └─ FunctionBody @42:5
│        └─ TryStatement @42:5
│           ├─ block
│           │  └─ BlockStatement @42:9
│           │     ├─ TryStatement @43:9
│           │     │  ├─ block
│           │     │  │  └─ BlockStatement @43:13
│           │     │  │     └─ ThrowStatement @44:13
│           │     │  │        └─ ObjectExpression @44:19
│           │     │  │           └─ ObjectProperty @44:19
│           │     │  │              ├─ StringLiteral "a" @44:21
│           │     │  │              └─ NumericLiteral 1 @44:24
│           │     │  └─ handler
│           │     │     └─ CatchClause @45:11
│           │     │        ├─ parameter
│           │     │        │  └─ BindingPattern (object)
│           │     │        │     └─ entry
│           │     │        │        └─ name
│           │     │        │           └─ Identifier "a" [variable:0] @45:20
│           │     │        └─ BlockStatement @45:25
│           │     │           └─ ExpressionStatement @46:13
│           │     │              └─ Identifier "a" [variable:0] @46:13
│           │     └─ ThrowStatement @48:9
│           │        └─ ObjectExpression @48:15
│           │           └─ ObjectProperty @48:15
│           │              ├─ StringLiteral "b" @48:17
│           │              └─ NumericLiteral 2 @48:20
│           └─ handler
│              └─ CatchClause @49:7
│                 ├─ parameter
│                 │  └─ BindingPattern (object)
│                 │     └─ entry
│                 │        └─ name
│                 │           └─ Identifier "b" [variable:1] @49:16
│                 └─ BlockStatement @49:21
│                    └─ ReturnStatement @50:9
│                       └─ Identifier "b" [variable:1] @50:16
└─ FunctionDeclaration "catch_with_eval" [direct-eval] [uses-this] [might-need-arguments] @55:1
   └─ body
      └─ FunctionBody @56:5
         └─ TryStatement @56:5
            ├─ block
            │  └─ BlockStatement @56:9
            │     └─ ThrowStatement @57:9
            │        └─ NumericLiteral 1 @57:15
            └─ handler
               └─ CatchClause @58:7
                  ├─ parameter
                  │  └─ Identifier "err" @58:14
                  └─ BlockStatement @58:19
                     ├─ ExpressionStatement @59:9
                     │  └─ CallExpression @59:13
                     │     ├─ Identifier "eval" [in-eval-scope] @59:9
                     │     └─ StringLiteral "" @59:16
                     └─ ReturnStatement @60:9
                        └─ Identifier "err" [in-eval-scope] @60:16
