private void DoEmit(ObjExpr fn, TypeBuilder tb)
{
MethodAttributes attribs = MethodAttributes.ReuseSlot | MethodAttributes.Public | MethodAttributes.Virtual;
MethodBuilder mb = tb.DefineMethod(MethodName, attribs, ReturnType, ArgTypes);
SetCustomAttributes(mb);
CljILGen baseIlg = new CljILGen(mb.GetILGenerator());
try
{
Label loopLabel = baseIlg.DefineLabel();
Var.pushThreadBindings(RT.map(Compiler.LoopLabelVar, loopLabel, Compiler.MethodVar, this));
GenContext.EmitDebugInfo(baseIlg, SpanMap);
baseIlg.MarkLabel(loopLabel);
Body.Emit(RHC.Return, fn, baseIlg);
if (Body.HasNormalExit())
baseIlg.Emit(OpCodes.Ret);
}
finally
{
Var.popThreadBindings();
}
if (IsExplicit)
tb.DefineMethodOverride(mb, ExplicitMethodInfo);
}