private JsBlockStatement CompileCatchClause(LocalResolveResult catchVariable, CatchClause catchClause, bool isCatchAll, bool isOnly) { SetRegion(catchClause.GetRegion()); JsStatement variableDeclaration = null; if (!catchClause.VariableNameToken.IsNull) { JsExpression compiledAssignment; if (isCatchAll) // If this is the only handler we need to construct the exception compiledAssignment = isOnly ? _runtimeLibrary.MakeException(JsExpression.Identifier(_variables[catchVariable.Variable].Name), this) : JsExpression.Identifier(_variables[catchVariable.Variable].Name); else compiledAssignment = _runtimeLibrary.Downcast(JsExpression.Identifier(_variables[catchVariable.Variable].Name), _compilation.FindType(KnownTypeCode.Exception), _resolver.Resolve(catchClause.Type).Type, this); variableDeclaration = JsStatement.Var(_variables[((LocalResolveResult)_resolver.Resolve(catchClause.VariableNameToken)).Variable].Name, compiledAssignment); } var result = CreateInnerCompiler().Compile(catchClause.Body); if (variableDeclaration != null) result = JsStatement.Block(new[] { variableDeclaration }.Concat(result.Statements)); return result; }