Added EmitCalli overload (#15040)
authorIvan Cronyn <ivan.cronyn@gmail.com>
Thu, 16 Nov 2017 02:37:22 +0000 (02:37 +0000)
committerJan Kotas <jkotas@microsoft.com>
Thu, 16 Nov 2017 02:37:22 +0000 (18:37 -0800)
src/mscorlib/src/System/Reflection/Emit/ILGenerator.cs

index 75a282a..14f3a38 100644 (file)
@@ -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)