private static IEnumerable<Instruction> GetCallInitInstructions(
ILProcessor processor,
TypeDefinition typeDefinition,
MethodDefinition memberDefinition,
VariableDefinition attributeVariableDefinition,
VariableDefinition methodVariableDefinition,
VariableDefinition parametersVariableDefinition,
MethodReference initMethodRef)
{
// Call __fody$attribute.Init(this, methodBase, args)
// start with the attribute reference
var list = new List<Instruction>
{
processor.Create(OpCodes.Ldloc, attributeVariableDefinition),
};
// then push the instance reference onto the stack
if (memberDefinition.IsConstructor || memberDefinition.IsStatic) {
list.Add(processor.Create(OpCodes.Ldnull));
}
else {
list.Add(processor.Create(OpCodes.Ldarg_0));
if (typeDefinition.IsValueType) {
list.Add(processor.Create(OpCodes.Box, typeDefinition));
}
}
// finally push the method base and arguments then call Init
list.AddRange(new[]
{
processor.Create(OpCodes.Ldloc, methodVariableDefinition),
processor.Create(OpCodes.Ldloc, parametersVariableDefinition),
processor.Create(OpCodes.Callvirt, initMethodRef),
});
return list;
}