本文整理汇总了C#中CodeGen.BeginFinallyBlock方法的典型用法代码示例。如果您正苦于以下问题:C# CodeGen.BeginFinallyBlock方法的具体用法?C# CodeGen.BeginFinallyBlock怎么用?C# CodeGen.BeginFinallyBlock使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CodeGen
的用法示例。
在下文中一共展示了CodeGen.BeginFinallyBlock方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: EmitWithFinallyBlock
private void EmitWithFinallyBlock(CodeGen cg, Slot exc, Slot exit, Slot isTryYielded)
{
// we are certain that Finally will never yield
cg.PushFinallyBlock(null, null);
cg.BeginFinallyBlock();
//finally body
Label endOfFinally = cg.DefineLabel();
// isTryYielded == True ?
isTryYielded.EmitGet(cg);
cg.EmitTestTrue();
cg.Emit(OpCodes.Brtrue, endOfFinally);
// exc == False ?
exc.EmitGet(cg);
cg.EmitTestTrue();
cg.Emit(OpCodes.Brfalse, endOfFinally);
//exit(None, None, None)
cg.EmitCallerContext();
exit.EmitGet(cg);
cg.Emit(OpCodes.Ldnull);
cg.Emit(OpCodes.Ldnull);
cg.Emit(OpCodes.Ldnull);
cg.EmitCall(typeof(Ops), "CallWithContext", new Type[] { typeof(ICallerContext), typeof(object), typeof(object), typeof(object), typeof(object) });
cg.Emit(OpCodes.Pop);
cg.MarkLabel(endOfFinally);
cg.PopTargets();
// finally end
}
示例2: EmitSimpleTry
private void EmitSimpleTry(CodeGen cg, TryFlowResult flow)
{
//
// Initialize the flow control flag
//
Slot flowControlFlag = null;
if (flow.Any) {
Debug.Assert(_finally != null);
flowControlFlag = cg.GetLocalTmp(typeof(int));
cg.EmitInt(CodeGen.FinallyExitsNormally);
flowControlFlag.EmitSet(cg);
// If there is a control flow in finally, emit outer:
// try {
// // try block body and all catch handling
// } catch (Exception all) {
// saved = all;
// } finally {
// finally_body
// if (saved != null) {
// throw saved;
// }
// }
if (HaveHandlers()) {
cg.PushExceptionBlock(TargetBlockType.Try, flowControlFlag);
cg.BeginExceptionBlock();
}
}
//******************************************************************
// 1. ENTERING TRY
//******************************************************************
cg.PushExceptionBlock(TargetBlockType.Try, flowControlFlag);
cg.BeginExceptionBlock();
//******************************************************************
// 2. Emit the try statement body
//******************************************************************
_body.Emit(cg);
//cg.EmitSequencePointNone();
//******************************************************************
// 3. Emit the catch blocks
//******************************************************************
if (HaveHandlers()) {
cg.PushExceptionBlock(TargetBlockType.Catch, flowControlFlag);
foreach (CatchBlock cb in _handlers) {
// Begin the strongly typed exception block
cg.BeginCatchBlock(cb.Test);
// Save the exception (if the catch block asked for it) or pop
EmitSaveExceptionOrPop(cg, cb);
//
// Emit the catch block body
//
cb.Body.Emit(cg);
}
cg.PopTargets(TargetBlockType.Catch);
}
//******************************************************************
// 4. Emit the finally block
//******************************************************************
if (_finally != null) {
Slot rethrow = null;
if (flow.Any) {
// If there is a control flow in finally, end the catch
// statement and emit the catch-all and finally clause
// with rethrow at the end.
if (HaveHandlers()) {
cg.EndExceptionBlock();
cg.PopTargets(TargetBlockType.Try);
}
cg.PushExceptionBlock(TargetBlockType.Catch, flowControlFlag);
cg.BeginCatchBlock(typeof(Exception));
rethrow = cg.GetLocalTmp(typeof(Exception));
rethrow.EmitSet(cg);
cg.PopTargets(TargetBlockType.Catch);
}
cg.PushExceptionBlock(TargetBlockType.Finally, flowControlFlag);
cg.BeginFinallyBlock();
//
// Emit the finally block body
//
_finally.Emit(cg);
//.........这里部分代码省略.........
示例3: Emit
//.........这里部分代码省略.........
}
if (handler.Target != null) {
tmpExc.EmitGet(cg);
handler.Target.EmitSet(cg);
}
if (IsBlockYieldable(finallyYieldTargets) || returnInFinally) {
cg.Emit(OpCodes.Ldnull);
exception.EmitSet(cg);
}
EmitYieldDispatch(catchYieldTargets, isCatchYielded, catchChoiceVar, cg);
handler.Body.Emit(cg);
cg.EmitCallerContext();
cg.EmitCall(typeof(Ops), "ClearException", new Type[] { typeof(ICallerContext) });
cg.EmitSetTraceBackUpdateStatus(false);
cg.Emit(OpCodes.Leave, afterFinally);
cg.MarkLabel(next);
}
cg.FreeLocalTmp(tmpExc);
cg.FreeLocalTmp(pyExc);
cg.Emit(OpCodes.Rethrow);
cg.PopTargets(Targets.TargetBlockType.Catch);
}
if (finallyStmt != null) {
cg.PushExceptionBlock(Targets.TargetBlockType.Finally, flowControlVar, isFinallyYielded);
cg.BeginFinallyBlock();
Label endOfFinally = cg.DefineLabel();
// if try yielded
EmitOnYieldBranchToLabel(tryYieldTargets, isTryYielded, endOfFinally, cg);
// if catch yielded
EmitOnYieldBranchToLabel(catchYieldTargets, isCatchYielded, endOfFinally, cg);
//if else yielded
EmitOnYieldBranchToLabel(elseYieldTargets, isElseYielded, endOfFinally, cg);
EmitYieldDispatch(finallyYieldTargets, isFinallyYielded, finallyChoiceVar, cg);
finallyStmt.Emit(cg);
if (IsBlockYieldable(finallyYieldTargets) || returnInFinally) {
Label nothrow = cg.DefineLabel();
exception.EmitGet(cg);
cg.Emit(OpCodes.Dup);
cg.Emit(OpCodes.Brfalse_S, nothrow);
cg.Emit(OpCodes.Throw);
cg.MarkLabel(nothrow);
cg.Emit(OpCodes.Pop);
}
cg.MarkLabel(endOfFinally);
cg.EndExceptionBlock();
cg.PopTargets(Targets.TargetBlockType.Finally);
} else {
cg.EndExceptionBlock();
}
cg.PopTargets(Targets.TargetBlockType.Try);
cg.MarkLabel(afterFinally);
示例4: EmitGeneratorTry
//.........这里部分代码省略.........
cg.BeginCatchBlock(cb.Test);
if (cb.Yield) {
// The catch block body contains yield, therefore
// delay the body emit till after the try block.
Slot slot = cg.GetLocalTmp(cb.Test);
slot.EmitSet(cg);
catches.Add(new CatchRecord(slot, cb));
} else {
// Save the exception (if the catch block asked for it) or pop
EmitSaveExceptionOrPop(cg, cb);
// Emit the body right now, since it doesn't contain yield
cb.Body.Emit(cg);
}
}
cg.PopTargets(TargetBlockType.Catch);
cg.EndExceptionBlock();
cg.PopTargets(TargetBlockType.Try);
//******************************************************************
// Emit the postponed catch block bodies (with yield in them)
//******************************************************************
foreach (CatchRecord cr in catches) {
Label next = cg.DefineLabel();
cr.Slot.EmitGet(cg);
cg.EmitNull();
cg.Emit(OpCodes.Beq, next);
if (cr.Block.Slot != null) {
cr.Block.Slot.EmitSet(cg, cr.Slot);
}
cg.FreeLocalTmp(cr.Slot);
cr.Block.Body.Emit(cg);
cg.MarkLabel(next);
//cg.EmitSequencePointNone();
}
}
//******************************************************************
// Emit the finally body
//******************************************************************
if (_finally != null) {
cg.MarkLabel(endFinallyBlock);
cg.PushExceptionBlock(TargetBlockType.Catch, flowControlFlag);
cg.BeginCatchBlock(typeof(Exception));
exception.EmitSet(cg);
cg.PopTargets(TargetBlockType.Catch);
cg.PushExceptionBlock(TargetBlockType.Finally, flowControlFlag);
cg.BeginFinallyBlock();
Label noExit = cg.DefineLabel();
cg.GotoRouter.EmitGet(cg);
cg.EmitInt(CodeGen.GotoRouterYielding);
cg.Emit(OpCodes.Bne_Un_S, noExit);
cg.Emit(OpCodes.Endfinally);
cg.MarkLabel(noExit);
EmitYieldDispatch(_finallyYields, cg);
// Emit the finally body
_finally.Emit(cg);
// Rethrow the exception, if any
Label noThrow = cg.DefineLabel();
exception.EmitGet(cg);
cg.EmitNull();
cg.Emit(OpCodes.Beq, noThrow);
exception.EmitGet(cg);
cg.Emit(OpCodes.Throw);
cg.MarkLabel(noThrow);
cg.FreeLocalTmp(exception);
cg.EndExceptionBlock();
cg.PopTargets(TargetBlockType.Finally);
cg.PopTargets(TargetBlockType.Try);
//
// Emit the flow control for finally, if there was any.
//
EmitFinallyFlowControl(cg, flow, flowControlFlag);
//cg.EmitSequencePointNone();
}
// Clear the target labels
ClearLabels(_tryYields);
ClearLabels(_catchYields);
if (_target != null) {
_target.Clear();
}
}