public TemporaryReturn ( ) : |
||
리턴 |
protected override void DoEmit (EmitContext ec) { if (Expr != null) { Expr.Emit (ec); if (unwind_protect) ec.Emit (OpCodes.Stloc, ec.TemporaryReturn ()); } if (unwind_protect) ec.Emit (OpCodes.Leave, ec.ReturnLabel); else ec.Emit (OpCodes.Ret); }
public override void Emit (EmitContext ec) { if (Report.Errors > 0) return; #if PRODUCTION try { #endif if (ec.HasReturnLabel) ec.ReturnLabel = ec.DefineLabel (); base.Emit (ec); ec.Mark (EndLocation); if (ec.HasReturnLabel) ec.MarkLabel (ec.ReturnLabel); if (ec.return_value != null) { ec.Emit (OpCodes.Ldloc, ec.return_value); ec.Emit (OpCodes.Ret); } else { // // If `HasReturnLabel' is set, then we already emitted a // jump to the end of the method, so we must emit a `ret' // there. // // Unfortunately, System.Reflection.Emit automatically emits // a leave to the end of a finally block. This is a problem // if no code is following the try/finally block since we may // jump to a point after the end of the method. // As a workaround, we're always creating a return label in // this case. // if (ec.HasReturnLabel || !unreachable) { if (ec.ReturnType != TypeManager.void_type) ec.Emit (OpCodes.Ldloc, ec.TemporaryReturn ()); ec.Emit (OpCodes.Ret); } } #if PRODUCTION } catch (Exception e){ Console.WriteLine ("Exception caught by the compiler while emitting:"); Console.WriteLine (" Block that caused the problem begin at: " + block.loc); Console.WriteLine (e.GetType ().FullName + ": " + e.Message); throw; } #endif }