Beispiel #1
0
 private void InsertActivateCall(MethodEditor cil, Instruction insertionPoint,
                                 Instruction loadReferenceInstruction, ActivationPurpose activationPurpose)
 {
     cil.InsertBefore(insertionPoint, loadReferenceInstruction);
     cil.InsertBefore(insertionPoint, cil.Create(OpCodes.Ldc_I4, (int)activationPurpose));
     cil.InsertBefore(insertionPoint, cil.Create(OpCodes.Callvirt, ActivateMethodRef()));
 }
Beispiel #2
0
        private static VariableDefinition SaveStackTop(MethodEditor cil, Instruction instruction)
        {
            VariableDefinition oldStackTop = cil.AddVariable(Resolve(instruction).FieldType);

            cil.InsertBefore(GetInsertionPoint(instruction), cil.Create(OpCodes.Stloc, oldStackTop));

            return(oldStackTop);
        }
Beispiel #3
0
        private void ProcessFieldSetter(Instruction instruction, MethodEditor cil)
        {
            VariableDefinition oldStackTop = SaveStackTop(cil, instruction);

            Instruction insertionPoint = GetInsertionPoint(instruction);

            InsertActivateCall(cil, insertionPoint, ActivationPurpose.Write);
            cil.InsertBefore(insertionPoint, cil.Create(OpCodes.Ldloc, oldStackTop));
        }
Beispiel #4
0
        private void InsertActivateCall(MethodEditor cil, Instruction insertionPoint, ActivationPurpose activationPurpose)
        {
            Instruction previous = insertionPoint.Previous;

            if (previous.OpCode == OpCodes.Ldarg)
            {
                Instruction newLoadInstruction = cil.Create(previous.OpCode, (ParameterDefinition)previous.Operand);
                InsertActivateCall(cil,
                                   previous,
                                   newLoadInstruction,
                                   activationPurpose);
            }
            else
            {
                InsertActivateCall(cil,
                                   insertionPoint,
                                   cil.Create(OpCodes.Dup),
                                   activationPurpose);
            }
        }