コード例 #1
0
 internal override void EmitStmt(ILGenerator ilg)
 {
     if (IterDecl != null)
     {
         IterDecl.Emit(ilg);
     }
     else
     {
         IterInit.Emit(ilg, false);
     }
     Begin = ilg.DefineLabel();
     End   = ilg.DefineLabel();
     ilg.MarkLabel(Begin);
     WhileExpr.Emit(ilg, true);
     ilg.Emit(OpCodes.Brfalse, End);
     InnerDecl?.Emit(ilg);
     Stmt.Emit(ilg);
     if (Cont != null)
     {
         ilg.MarkLabel(Cont.Value);
     }
     IncrExpr?.Emit(ilg, false);
     ilg.Emit(OpCodes.Br, Begin);
     ilg.MarkLabel(End);
     if (Dispose)
     {
         FinallyClauses.Add(() => {
             var loc = IterDecl.Symbol as LocalSymbol;
             ilg.Emit(OpCodes.Ldloc, loc.Index);
             ilg.Emit(OpCodes.Isinst, Compilation.Get(WellKnownTypes.System_IDisposable).Type);
             ilg.Emit(OpCodes.Callvirt, (Compilation.Get(WellKnownMembers.System_IDisposable_Dispose) as MethodSymbol).Method);
         });
     }
 }
コード例 #2
0
 internal override void Emit(ILGenerator ilg)
 {
     ExVar.Declare(ilg);
     ilg.BeginCatchBlock(ExVar.Type.Type);
     ilg.Emit(OpCodes.Isinst, ExVar.Type.Type);
     ilg.Emit(OpCodes.Stloc, ExVar.Index);
     Stmt.Emit(ilg);
 }
コード例 #3
0
        internal void Emit(ILGenerator ilg, Label end)
        {
            Cond.Emit(ilg, true);
            var lf = ilg.DefineLabel();

            ilg.Emit(OpCodes.Brfalse, lf);
            Stmt.Emit(ilg);
            ilg.Emit(OpCodes.Br, end);
            ilg.MarkLabel(lf);
        }
コード例 #4
0
 internal override void EmitStmt(ILGenerator ilg)
 {
     Begin = ilg.DefineLabel();
     End   = ilg.DefineLabel();
     ilg.MarkLabel(Begin);
     Cond.Emit(ilg, true);
     ilg.Emit(OpCodes.Brfalse, End);
     Stmt.Emit(ilg);
     ilg.Emit(OpCodes.Br, Begin);
     ilg.MarkLabel(End);
 }
コード例 #5
0
 internal virtual void Emit(ILGenerator ilg, Label end)
 {
     ilg.MarkLabel(Entry(ilg));
     if (Stmt != null)
     {
         Stmt?.Emit(ilg);
         ilg.Emit(OpCodes.Br, end);
     }
     else
     {
         ilg.Emit(OpCodes.Br, NextBlock.Entry(ilg));
     }
     ilg.MarkLabel(Exit(ilg));
 }
コード例 #6
0
 internal override void EmitStmt(ILGenerator ilg)
 {
     Stmt.Emit(ilg);
 }
コード例 #7
0
 internal override void Emit(ILGenerator ilg)
 {
     ilg.BeginFinallyBlock();
     Stmt.Emit(ilg);
 }