예제 #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()));
 }
예제 #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);
        }
예제 #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));
        }