private void DoEmitStatic(ObjExpr fn, TypeBuilder tb)
{
MethodAttributes attribs = MethodAttributes.Static | MethodAttributes.Public;
string methodName = "invokeStatic";
Type returnType = ReturnType;
MethodBuilder baseMB = tb.DefineMethod(methodName, attribs, returnType, _argTypes);
CljILGen baseIlg = new CljILGen(baseMB.GetILGenerator());
try
{
Label loopLabel = baseIlg.DefineLabel();
Var.pushThreadBindings(RT.map(Compiler.LoopLabelVar, loopLabel, Compiler.MethodVar, this));
GenContext.EmitDebugInfo(baseIlg, SpanMap);
baseIlg.MarkLabel(loopLabel);
EmitBody(Objx, baseIlg, _retType, Body);
if (Body.HasNormalExit())
baseIlg.Emit(OpCodes.Ret);
}
finally
{
Var.popThreadBindings();
}
// Generate the regular invoke, calling the static method
{
MethodBuilder regularMB = tb.DefineMethod(MethodName, MethodAttributes.ReuseSlot | MethodAttributes.Public | MethodAttributes.Virtual, typeof(Object), ArgTypes);
SetCustomAttributes(regularMB);
CljILGen regIlg = new CljILGen(regularMB.GetILGenerator());
for (int i = 0; i < _argTypes.Length; i++)
{
regIlg.EmitLoadArg(i + 1);
HostExpr.EmitUnboxArg(fn, regIlg, _argTypes[i]);
}
GenContext.EmitDebugInfo(baseIlg, SpanMap);
regIlg.Emit(OpCodes.Call, baseMB);
if (ReturnType.IsValueType)
regIlg.Emit(OpCodes.Box, ReturnType);
regIlg.Emit(OpCodes.Ret);
}
// Generate primInvoke if prim
if (Prim != null)
{
MethodAttributes primAttribs = MethodAttributes.ReuseSlot | MethodAttributes.Public | MethodAttributes.Virtual;
string primMethodName = "invokePrim";
Type primReturnType;
if (_retType == typeof(double) || _retType == typeof(long))
primReturnType = ReturnType;
else
primReturnType = typeof(object);
MethodBuilder primMB = tb.DefineMethod(primMethodName, primAttribs, primReturnType, _argTypes);
SetCustomAttributes(primMB);
CljILGen primIlg = new CljILGen(primMB.GetILGenerator());
for (int i = 0; i < _argTypes.Length; i++)
{
primIlg.EmitLoadArg(i + 1);
//HostExpr.EmitUnboxArg(fn, primIlg, _argTypes[i]);
}
primIlg.Emit(OpCodes.Call, baseMB);
if (Body.HasNormalExit())
primIlg.Emit(OpCodes.Ret);
}
}