本文整理汇总了C#中CodeGen.IsGenerator方法的典型用法代码示例。如果您正苦于以下问题:C# CodeGen.IsGenerator方法的具体用法?C# CodeGen.IsGenerator怎么用?C# CodeGen.IsGenerator使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CodeGen
的用法示例。
在下文中一共展示了CodeGen.IsGenerator方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Emit
// ***WITH STATEMENT CODE GENERATION ALGORITHM***
//
//GRAMMAR :=
//with EXPR as VAR:
// BLOCK
//
//CODE GEN :=
//
//mgr = (EXPR)
//exit = mgr.__exit__ # Not calling it yet
//value = mgr.__enter__()
//exc = True
//isTryYielded = False
//try:
//
// VAR = value # Only if "as VAR" is present
// BLOCK
// // if yield happens in the Block,
// // then isTryYielded is set to True by Yield's Code Gen
//except:
// # The exceptional case is handled here
// exc = False
// if not exit(*sys.exc_info()):
// raise
// # The exception is consumed if exit() returns true
//finally:
// # The normal and non-local-goto cases are handled here
// if isTryYielded = False && exc == True :
// exit(None, None, None)
internal override void Emit(CodeGen cg)
{
Slot exc = null;
Slot isTryYielded = null;
Slot exit = null;
if (cg.IsGenerator()) {
exc = cg.Names.GetTempSlot("with", typeof(object));
isTryYielded = cg.Names.GetTempSlot("with", typeof(object));
exit = cg.Names.GetTempSlot("with", typeof(object));
} else {
exc = cg.GetLocalTmp(typeof(object));
isTryYielded = cg.GetLocalTmp(typeof(object));
exit = cg.GetLocalTmp(typeof(object));
}
// mgr = (EXPR)
Slot mgr = cg.GetLocalTmp(typeof(object));
contextManager.Emit(cg);
mgr.EmitSet(cg);
// exit = mgr.__exit__ # not calling it yet
cg.EmitCallerContext();
mgr.EmitGet(cg);
cg.EmitSymbolId("__exit__");
cg.EmitCall(typeof(Ops), "GetAttr");
exit.EmitSet(cg);
mgr.EmitGet(cg);
cg.FreeLocalTmp(mgr);
cg.EmitSymbolId("__enter__");
cg.EmitObjectArray(new Expression[0]);
cg.EmitCall(typeof(Ops), "Invoke", new Type[] { typeof(object), typeof(SymbolId), typeof(object[]) });
Slot value = cg.GetLocalTmp(typeof(object));
value.EmitSet(cg);
// exc = True
cg.EmitConstantBoxed(true);
exc.EmitSet(cg);
Slot choiceVar = null;
if (yieldTargets != null && yieldTargets.Count > 0) {
Label startOfBlock = cg.DefineLabel();
choiceVar = cg.GetLocalTmp(typeof(int));
cg.EmitInt(-1);
choiceVar.EmitSet(cg);
cg.Emit(OpCodes.Br, startOfBlock);
int index = 0;
foreach (YieldTarget yt in yieldTargets) {
cg.MarkLabel(yt.TopBranchTarget);
cg.EmitInt(index++);
choiceVar.EmitSet(cg);
cg.Emit(OpCodes.Br, startOfBlock);
}
cg.MarkLabel(startOfBlock);
}
cg.EmitConstantBoxed(false);
isTryYielded.EmitSet(cg);
Label beforeFinally = cg.DefineLabel();
cg.PushWithTryBlock(isTryYielded);
cg.BeginExceptionBlock();
if (yieldTargets != null && yieldTargets.Count > 0) {
int index = 0;
foreach (YieldTarget yt in yieldTargets) {
//.........这里部分代码省略.........