From 9b8318ef85204906dd68d1617f0681803ae6fc28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Sun, 24 Nov 2019 22:02:11 +0100 Subject: [PATCH 1/2] Fix marshalling null delegates Null delegates marshal as null pointers and vice versa. --- .../tools/Common/TypeSystem/Interop/IL/Marshaller.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/coreclr/src/tools/Common/TypeSystem/Interop/IL/Marshaller.cs b/src/coreclr/src/tools/Common/TypeSystem/Interop/IL/Marshaller.cs index f037e12b7808c4..b1db8e166ac430 100644 --- a/src/coreclr/src/tools/Common/TypeSystem/Interop/IL/Marshaller.cs +++ b/src/coreclr/src/tools/Common/TypeSystem/Interop/IL/Marshaller.cs @@ -1913,7 +1913,11 @@ class DelegateMarshaller : Marshaller { protected override void AllocAndTransformManagedToNative(ILCodeStream codeStream) { + ILCodeLabel lNullPointer = _ilCodeStreams.Emitter.NewCodeLabel(); + LoadManagedValue(codeStream); + codeStream.Emit(ILOpcode.dup); + codeStream.Emit(ILOpcode.brfalse, lNullPointer); codeStream.Emit(ILOpcode.call, _ilCodeStreams.Emitter.NewToken( InteropTypes.GetMarshal(Context).GetKnownMethod("GetFunctionPointerForDelegate", @@ -1921,12 +1925,18 @@ protected override void AllocAndTransformManagedToNative(ILCodeStream codeStream new TypeDesc[] { Context.GetWellKnownType(WellKnownType.MulticastDelegate).BaseType } )))); + codeStream.EmitLabel(lNullPointer); + StoreNativeValue(codeStream); } protected override void TransformNativeToManaged(ILCodeStream codeStream) { + ILCodeLabel lNullPointer = _ilCodeStreams.Emitter.NewCodeLabel(); + LoadNativeValue(codeStream); + codeStream.Emit(ILOpcode.dup); + codeStream.Emit(ILOpcode.brfalse, lNullPointer); TypeDesc systemType = Context.SystemModule.GetKnownType("System", "Type"); @@ -1939,6 +1949,8 @@ protected override void TransformNativeToManaged(ILCodeStream codeStream) new TypeDesc[] { Context.GetWellKnownType(WellKnownType.IntPtr), systemType } )))); + codeStream.EmitLabel(lNullPointer); + StoreManagedValue(codeStream); } From 61586061aadea97e0ab92cda523377d167cab697 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Mon, 25 Nov 2019 15:06:32 +0100 Subject: [PATCH 2/2] Oops --- .../Common/TypeSystem/Interop/IL/Marshaller.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/coreclr/src/tools/Common/TypeSystem/Interop/IL/Marshaller.cs b/src/coreclr/src/tools/Common/TypeSystem/Interop/IL/Marshaller.cs index 6e5623e64ca618..18c2d2cb787f69 100644 --- a/src/coreclr/src/tools/Common/TypeSystem/Interop/IL/Marshaller.cs +++ b/src/coreclr/src/tools/Common/TypeSystem/Interop/IL/Marshaller.cs @@ -1825,6 +1825,7 @@ class DelegateMarshaller : Marshaller protected override void AllocAndTransformManagedToNative(ILCodeStream codeStream) { ILCodeLabel lNullPointer = _ilCodeStreams.Emitter.NewCodeLabel(); + ILCodeLabel lDone = _ilCodeStreams.Emitter.NewCodeLabel(); LoadManagedValue(codeStream); codeStream.Emit(ILOpcode.dup); @@ -1836,14 +1837,21 @@ protected override void AllocAndTransformManagedToNative(ILCodeStream codeStream new TypeDesc[] { Context.GetWellKnownType(WellKnownType.MulticastDelegate).BaseType } )))); + codeStream.Emit(ILOpcode.br, lDone); + codeStream.EmitLabel(lNullPointer); + codeStream.Emit(ILOpcode.pop); + codeStream.EmitLdc(0); + codeStream.Emit(ILOpcode.conv_i); + codeStream.EmitLabel(lDone); StoreNativeValue(codeStream); } protected override void TransformNativeToManaged(ILCodeStream codeStream) { ILCodeLabel lNullPointer = _ilCodeStreams.Emitter.NewCodeLabel(); + ILCodeLabel lDone = _ilCodeStreams.Emitter.NewCodeLabel(); LoadNativeValue(codeStream); codeStream.Emit(ILOpcode.dup); @@ -1860,8 +1868,13 @@ protected override void TransformNativeToManaged(ILCodeStream codeStream) new TypeDesc[] { Context.GetWellKnownType(WellKnownType.IntPtr), systemType } )))); + codeStream.Emit(ILOpcode.br, lDone); + codeStream.EmitLabel(lNullPointer); + codeStream.Emit(ILOpcode.pop); + codeStream.Emit(ILOpcode.ldnull); + codeStream.EmitLabel(lDone); StoreManagedValue(codeStream); }