MethodDecorator.Fody.MethodDecorator.GetCallInitInstructions C# (CSharp) Method

GetCallInitInstructions() private static method

private static GetCallInitInstructions ( Mono.Cecil.Cil.ILProcessor processor, Mono.Cecil.TypeDefinition typeDefinition, Mono.Cecil.MethodDefinition memberDefinition, Mono.Cecil.Cil.VariableDefinition attributeVariableDefinition, Mono.Cecil.Cil.VariableDefinition methodVariableDefinition, Mono.Cecil.Cil.VariableDefinition parametersVariableDefinition, MethodReference initMethodRef ) : IEnumerable
processor Mono.Cecil.Cil.ILProcessor
typeDefinition Mono.Cecil.TypeDefinition
memberDefinition Mono.Cecil.MethodDefinition
attributeVariableDefinition Mono.Cecil.Cil.VariableDefinition
methodVariableDefinition Mono.Cecil.Cil.VariableDefinition
parametersVariableDefinition Mono.Cecil.Cil.VariableDefinition
initMethodRef Mono.Cecil.MethodReference
return IEnumerable
        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;
        }