/// <summary> /// Generates the and replace invoke with return method. /// </summary> /// <param name="type">The type.</param> private void GenerateAndReplaceInvokeWithReturnMethod(RuntimeType type) { RuntimeParameter[] parameters = new RuntimeParameter[type.Methods[1].Parameters.Count]; type.Methods[1].Parameters.CopyTo(parameters, 0); var stubInvoke = delegateStub.Methods[2]; var invokeMethod = new CilRuntimeMethod(delegateStub.Module, InvokeMethodName, type.Methods[1].Signature, stubInvoke.Token, type, stubInvoke.Attributes, stubInvoke.ImplAttributes, stubInvoke.Rva); foreach (var parameter in parameters) invokeMethod.Parameters.Add(parameter); SearchAndReplaceMethod(type, InvokeMethodName, invokeMethod); }
/// <summary> /// Creates a new local variable <see cref="Operand"/>. /// </summary> /// <param name="type">The type.</param> /// <param name="register">The register.</param> /// <param name="param">The param.</param> /// <returns></returns> public static Operand CreateParameter(SigType type, Register register, RuntimeParameter param, int index) { Operand operand = new Operand(type, OperandType.MemoryAddress | OperandType.Parameter); operand.register = register; operand.index = index; // param.Position; operand.offset = new IntPtr(param.Position * 4); return operand; }
/// <summary> /// Generates the and replace end invoke method. /// </summary> /// <param name="type">The type.</param> private void GenerateAndReplaceEndInvokeMethod(RuntimeType type) { RuntimeParameter[] parameters = new RuntimeParameter[type.Methods[3].Parameters.Count]; type.Methods[3].Parameters.CopyTo(parameters, 0); var stubMethod = delegateStub.Methods[3]; var method = new CilRuntimeMethod(delegateStub.Module, EndInvokeMethodName, type.Methods[3].Signature, stubMethod.Token, type, stubMethod.Attributes, stubMethod.ImplAttributes, stubMethod.Rva); foreach (var parameter in parameters) method.Parameters.Add(parameter); SearchAndReplaceMethod(type, EndInvokeMethodName, method); }
/// <summary> /// Generates and replace constructor. /// </summary> /// <param name="type">The type.</param> private void GenerateAndReplaceConstructor(RuntimeType type) { RuntimeParameter[] parameters = new RuntimeParameter[type.Methods[0].Parameters.Count]; type.Methods[0].Parameters.CopyTo(parameters, 0); var stubConstructor = delegateStub.Methods[0]; var constructor = new CilRuntimeMethod(delegateStub.Module, ConstructorName, type.Methods[0].Signature, stubConstructor.Token, type, stubConstructor.Attributes, stubConstructor.ImplAttributes, stubConstructor.Rva); foreach (var parameter in parameters) constructor.Parameters.Add(parameter); SearchAndReplaceMethod(type, ConstructorName, constructor); }
/// <summary> /// Initializes a new instance of <see cref="ParameterOperand"/>. /// </summary> /// <param name="register">The stack frame register.</param> /// <param name="param">The runtime parameter object, that represents this parameter.</param> /// <param name="type">The parameter type.</param> public ParameterOperand(Register register, RuntimeParameter param, SigType type) : base(type, register, param.Position) { this.parameter = param; }
/// <summary> /// Sets the stack parameter. /// </summary> /// <param name="index">The index.</param> /// <param name="param">The param.</param> /// <param name="type">The type.</param> /// <returns></returns> public ParameterOperand SetStackParameter(int index, RuntimeParameter param, SigType type) { parameters[index] = new ParameterOperand(architecture.StackFrameRegister, param, type); return parameters[index]; }
/// <summary> /// Sets the stack parameter. /// </summary> /// <param name="index">The index.</param> /// <param name="param">The param.</param> /// <param name="type">The type.</param> /// <returns></returns> public Operand SetStackParameter(int index, RuntimeParameter param, SigType type) { parameters[index] = Operand.CreateParameter(type, architecture.StackFrameRegister, param, index); return parameters[index]; }