protected virtual void GenerateAdapter(SupertypingAdapter adapter)
{
ilGenerator = adapter.Constructor.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldarg_1);
ilGenerator.Emit(OpCodes.Stfld, adapter.AdapteeField);
ilGenerator.Emit(OpCodes.Ret);
foreach (SupertypingAdapterMethod method in adapter.Methods) {
ilGenerator = method.MethodBuilder.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldfld, adapter.AdapteeField);
for (int i = 1; i <= method.ParameterCount; i++) {
ilGenerator.Emit(OpCodes.Ldarg, i);
}
ilGenerator.Emit(OpCodes.Tailcall);
if (adapter.AdapteeType.IsAbstract)
ilGenerator.EmitCall(OpCodes.Callvirt,
method.AdapteeMethod,
null);
else
ilGenerator.EmitCall(OpCodes.Call,
method.AdapteeMethod,
null);
ilGenerator.Emit(OpCodes.Ret);
}
adapter.TypeBuilder.CreateType();
}