diff --git a/lib/nodes.js b/lib/nodes.js index 0fd6c228..1bdcf86d 100644 --- a/lib/nodes.js +++ b/lib/nodes.js @@ -1822,7 +1822,7 @@ var catchPart, errorPart; o.indent += TAB; errorPart = this.error ? " (" + (this.error.compile(o)) + ") " : ' '; - catchPart = this.recovery ? " catch" + errorPart + "{\n" + (this.recovery.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}" : !(this.ensure || this.recovery) ? ' catch (_e) {}' : void 0; + catchPart = this.recovery ? (o.scope.add(this.error.value, 'param'), " catch" + errorPart + "{\n" + (this.recovery.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}") : !(this.ensure || this.recovery) ? ' catch (_e) {}' : void 0; return ("" + this.tab + "try {\n" + (this.attempt.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}" + (catchPart || '')) + (this.ensure ? " finally {\n" + (this.ensure.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}" : ''); }; return Try; diff --git a/src/nodes.coffee b/src/nodes.coffee index 1d72ca45..a69b7710 100644 --- a/src/nodes.coffee +++ b/src/nodes.coffee @@ -1402,6 +1402,7 @@ exports.Try = class Try extends Base o.indent += TAB errorPart = if @error then " (#{ @error.compile o }) " else ' ' catchPart = if @recovery + o.scope.add @error.value, 'param' " catch#{errorPart}{\n#{ @recovery.compile o, LEVEL_TOP }\n#{@tab}}" else unless @ensure or @recovery ' catch (_e) {}' diff --git a/test/scope.coffee b/test/scope.coffee index a32c34d5..a2379935 100644 --- a/test/scope.coffee +++ b/test/scope.coffee @@ -26,3 +26,9 @@ test "siblings of variadic arguments shouldn't break out.", -> oops = (x,args...) -> oops(20, 1,2,3) eq x, 10 + +test "catch statements should introduce their argument to scope", -> + try throw '' + catch e + do -> e = 5 + eq 5, e