/// <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);
        }
示例#2
0
 /// <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;
 }
示例#6
0
 /// <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];
 }
示例#7
0
 /// <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];
 }