/// <summary> /// </summary> /// <param name="llvmWriter"> /// </param> /// <param name="objectResult"> /// </param> /// <param name="methodResult"> /// </param> /// <param name="invokeMethod"> /// </param> /// <param name="isStatic"> /// </param> /// <returns> /// </returns> public static FullyDefinedReference WriteCallInvokeMethod( this LlvmWriter llvmWriter, FullyDefinedReference objectResult, FullyDefinedReference methodResult, IMethod invokeMethod, bool isStatic) { var writer = llvmWriter.Output; var method = new SynthesizedInvokeMethod(llvmWriter, objectResult, methodResult, invokeMethod, isStatic); var opCodeNope = OpCodePart.CreateNop; opCodeNope.OpCodeOperands = Enumerable.Range(0, invokeMethod.GetParameters().Count()).Select(p => new OpCodeInt32Part(OpCodesEmit.Ldarg, 0, 0, p + 1)).ToArray(); foreach (var generatedOperand in opCodeNope.OpCodeOperands) { llvmWriter.ActualWrite(writer, generatedOperand); } writer.WriteLine(string.Empty); // bitcast object to method var opCodeNopeForBitCast = OpCodePart.CreateNop; opCodeNopeForBitCast.OpCodeOperands = new[] { OpCodePart.CreateNop }; opCodeNopeForBitCast.OpCodeOperands[0].Result = methodResult; llvmWriter.UnaryOper(writer, opCodeNopeForBitCast, "bitcast", methodResult.Type, options: LlvmWriter.OperandOptions.GenerateResult); writer.Write(" to "); llvmWriter.WriteMethodPointerType(writer, method); writer.WriteLine(string.Empty); method.MethodResult = opCodeNopeForBitCast.Result; // actual call llvmWriter.WriteCall(opCodeNope, method, false, !isStatic, false, objectResult, llvmWriter.tryScopes.Count > 0 ? llvmWriter.tryScopes.Peek() : null); writer.WriteLine(string.Empty); return opCodeNope.Result; }
/// <summary> /// </summary> /// <param name="llvmWriter"> /// </param> /// <param name="objectResult"> /// </param> /// <param name="methodResult"> /// </param> /// <param name="invokeMethod"> /// </param> /// <param name="isStatic"> /// </param> /// <returns> /// </returns> public static FullyDefinedReference WriteCallInvokeMethod( this LlvmWriter llvmWriter, FullyDefinedReference objectResult, FullyDefinedReference methodResult, IMethod invokeMethod, bool isStatic) { var writer = llvmWriter.Output; var method = new SynthesizedInvokeMethod(llvmWriter, objectResult, methodResult, invokeMethod, isStatic); var opCodeNope = OpCodePart.CreateNop; opCodeNope.OpCodeOperands = Enumerable.Range(0, invokeMethod.GetParameters().Count()) .Select(p => new OpCodeInt32Part(OpCodesEmit.Ldarg, 0, 0, p + 1)) .ToArray(); foreach (var generatedOperand in opCodeNope.OpCodeOperands) { llvmWriter.ActualWrite(writer, generatedOperand); } writer.WriteLine(string.Empty); // bitcast object to method var opCodeNopeForBitCast = OpCodePart.CreateNop; opCodeNopeForBitCast.OpCodeOperands = new[] { OpCodePart.CreateNop }; opCodeNopeForBitCast.OpCodeOperands[0].Result = methodResult; llvmWriter.UnaryOper( writer, opCodeNopeForBitCast, "bitcast", methodResult.Type, options: LlvmWriter.OperandOptions.GenerateResult); writer.Write(" to "); llvmWriter.WriteMethodPointerType(writer, method); writer.WriteLine(string.Empty); method.MethodResult = opCodeNopeForBitCast.Result; // actual call llvmWriter.WriteCall( opCodeNope, method, false, !isStatic, false, objectResult, llvmWriter.tryScopes.Count > 0 ? llvmWriter.tryScopes.Peek() : null); writer.WriteLine(string.Empty); return(opCodeNope.Result); }