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); }); } }
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); }
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); }
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); }
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)); }
internal override void EmitStmt(ILGenerator ilg) { Stmt.Emit(ilg); }
internal override void Emit(ILGenerator ilg) { ilg.BeginFinallyBlock(); Stmt.Emit(ilg); }