示例#1
0
 public CodeTryCatchFinallyStatement(CodeStatement [] tryStatements,
                                     CodeCatchClause [] catchClauses,
                                     CodeStatement [] finallyStatements)
 {
     TryStatements.AddRange(tryStatements);
     CatchClauses.AddRange(catchClauses);
     FinallyStatements.AddRange(finallyStatements);
 }
        protected override void GenerateInner(CodeGenerator generator, CodeStatementEmitOptions emitOptions)
        {
            generator.WriteBlankLineBeforeEnteringBlock();
            generator.Write(TokenType.Keyword, "try");
            generator.WriteOpeningBrace();
            generator.Indent++;
            generator.EnterLocalScope();
            TryStatements.ReserveLocals(generator, default(CodeStatementEmitOptions));
            TryStatements.Generate(generator, default(CodeStatementEmitOptions));
            generator.ExitLocalScope();
            generator.Indent--;

            foreach (var catchClause in CatchClauses)
            {
                generator.WriteMiddleClosingBrace();
                generator.Write(TokenType.Keyword, "catch");
                generator.Write(TokenType.Space, ' ');
                generator.Write(TokenType.Punctuation, '(');
                catchClause.CatchExceptionType.Generate(generator);
                generator.Write(TokenType.Space, ' ');
                generator.OutputIdentifier(TokenType.Identifier, catchClause.LocalName);
                generator.Write(TokenType.Punctuation, ')');
                generator.WriteOpeningBrace();
                generator.Indent++;
                generator.EnterLocalScope();
                generator.ReserveLocal(catchClause.LocalName);
                catchClause.Statements.ReserveLocals(generator, default(CodeStatementEmitOptions));
                catchClause.Statements.Generate(generator, default(CodeStatementEmitOptions));
                generator.ExitLocalScope();
                generator.Indent--;
            }

            if (FinallyStatements.Count > 0)
            {
                generator.WriteMiddleClosingBrace();
                generator.Write(TokenType.Keyword, "finally");
                generator.WriteOpeningBrace();
                generator.Indent++;
                generator.EnterLocalScope();
                FinallyStatements.ReserveLocals(generator, default(CodeStatementEmitOptions));
                FinallyStatements.Generate(generator, default(CodeStatementEmitOptions));
                generator.ExitLocalScope();
                generator.Indent--;
            }
            generator.WriteClosingBrace();
        }
示例#3
0
 public FunctionBody(FunctionExpression parent, CallDepthProtection protection, bool hasCatch)
 {
     parent.Require(GlobalVariable.CSUM);
     if (hasCatch)
     {
         CatchStatement = new CodeStatement($"return {CaughtErrorIdentifier};");
     }
     TryBody = new Block(parent);
     if (protection != null)
     {
         TryBody.Statements.Add(protection.Check);
         TryBody.Statements.Add(new ReturnStatement(parent.DefaultReturnValue));
         FinallyStatements.Add(_incrementCallSumDepth);
         //FinallyStatements.Add(protection.Cleanup);
     }
     else
     {
         FinallyStatements.Add(_incrementCallSum);
     }
 }
 public CodeTryStatement(IEnumerable <CodeStatement> tryStatements, IEnumerable <CodeCatchClause> catchClauses, IEnumerable <CodeStatement> finallyStatements)
 {
     TryStatements.AddRange(tryStatements);
     CatchClauses.AddRange(catchClauses);
     FinallyStatements.AddRange(finallyStatements);
 }
示例#5
0
 public CodeTryCatchFinallyStatement(ILInstruction inline, CodeStatement[] tryStatements, CodeCatchClause[] catchClauses, CodeStatement[] finallyStatements) : base(inline)
 {
     TryStatements.AddRange(tryStatements);
     CatchClauses.AddRange(catchClauses);
     FinallyStatements.AddRange(finallyStatements);
 }