From 658bc65a42fac8eef005f0470e89a1070ded106e Mon Sep 17 00:00:00 2001 From: Ivan Cronyn Date: Thu, 16 Nov 2017 02:37:22 +0000 Subject: [PATCH] Added EmitCalli overload (#15040) --- .../src/System/Reflection/Emit/ILGenerator.cs | 45 ++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/mscorlib/src/System/Reflection/Emit/ILGenerator.cs b/src/mscorlib/src/System/Reflection/Emit/ILGenerator.cs index 75a282a..14f3a38 100644 --- a/src/mscorlib/src/System/Reflection/Emit/ILGenerator.cs +++ b/src/mscorlib/src/System/Reflection/Emit/ILGenerator.cs @@ -531,6 +531,51 @@ namespace System.Reflection.Emit PutInteger4(modBuilder.GetSignatureToken(sig).Token); } + public virtual void EmitCalli(OpCode opcode, CallingConvention unmanagedCallConv, Type returnType, Type[] parameterTypes) + { + int stackchange = 0; + int cParams = 0; + int i; + SignatureHelper sig; + + ModuleBuilder modBuilder = (ModuleBuilder)m_methodBuilder.Module; + + if (parameterTypes != null) + { + cParams = parameterTypes.Length; + } + + sig = SignatureHelper.GetMethodSigHelper( + modBuilder, + unmanagedCallConv, + returnType); + + if (parameterTypes != null) + { + for (i = 0; i < cParams; i++) + { + sig.AddArgument(parameterTypes[i]); + } + } + + // If there is a non-void return type, push one. + if (returnType != typeof(void)) + stackchange++; + + // Pop off arguments if any. + if (parameterTypes != null) + stackchange -= cParams; + + // Pop the native function pointer. + stackchange--; + UpdateStackSize(OpCodes.Calli, stackchange); + + EnsureCapacity(7); + Emit(OpCodes.Calli); + RecordTokenFixup(); + PutInteger4(modBuilder.GetSignatureToken(sig).Token); + } + public virtual void EmitCall(OpCode opcode, MethodInfo methodInfo, Type[] optionalParameterTypes) { if (methodInfo == null) -- 2.7.4