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