Skip to content

Commit 0953da2

Browse files
MichalStrehovskyjkotas
authored andcommitted
Fix marshalling null delegates (dotnet#241)
Null delegates marshal as null pointers and vice versa.
1 parent 4842a7e commit 0953da2

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

src/coreclr/src/tools/Common/TypeSystem/Interop/IL/Marshaller.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1824,20 +1824,38 @@ class DelegateMarshaller : Marshaller
18241824
{
18251825
protected override void AllocAndTransformManagedToNative(ILCodeStream codeStream)
18261826
{
1827+
ILCodeLabel lNullPointer = _ilCodeStreams.Emitter.NewCodeLabel();
1828+
ILCodeLabel lDone = _ilCodeStreams.Emitter.NewCodeLabel();
1829+
18271830
LoadManagedValue(codeStream);
1831+
codeStream.Emit(ILOpcode.dup);
1832+
codeStream.Emit(ILOpcode.brfalse, lNullPointer);
18281833

18291834
codeStream.Emit(ILOpcode.call, _ilCodeStreams.Emitter.NewToken(
18301835
InteropTypes.GetMarshal(Context).GetKnownMethod("GetFunctionPointerForDelegate",
18311836
new MethodSignature(MethodSignatureFlags.Static, 0, Context.GetWellKnownType(WellKnownType.IntPtr),
18321837
new TypeDesc[] { Context.GetWellKnownType(WellKnownType.MulticastDelegate).BaseType }
18331838
))));
18341839

1840+
codeStream.Emit(ILOpcode.br, lDone);
1841+
1842+
codeStream.EmitLabel(lNullPointer);
1843+
codeStream.Emit(ILOpcode.pop);
1844+
codeStream.EmitLdc(0);
1845+
codeStream.Emit(ILOpcode.conv_i);
1846+
1847+
codeStream.EmitLabel(lDone);
18351848
StoreNativeValue(codeStream);
18361849
}
18371850

18381851
protected override void TransformNativeToManaged(ILCodeStream codeStream)
18391852
{
1853+
ILCodeLabel lNullPointer = _ilCodeStreams.Emitter.NewCodeLabel();
1854+
ILCodeLabel lDone = _ilCodeStreams.Emitter.NewCodeLabel();
1855+
18401856
LoadNativeValue(codeStream);
1857+
codeStream.Emit(ILOpcode.dup);
1858+
codeStream.Emit(ILOpcode.brfalse, lNullPointer);
18411859

18421860
TypeDesc systemType = Context.SystemModule.GetKnownType("System", "Type");
18431861

@@ -1850,6 +1868,13 @@ protected override void TransformNativeToManaged(ILCodeStream codeStream)
18501868
new TypeDesc[] { Context.GetWellKnownType(WellKnownType.IntPtr), systemType }
18511869
))));
18521870

1871+
codeStream.Emit(ILOpcode.br, lDone);
1872+
1873+
codeStream.EmitLabel(lNullPointer);
1874+
codeStream.Emit(ILOpcode.pop);
1875+
codeStream.Emit(ILOpcode.ldnull);
1876+
1877+
codeStream.EmitLabel(lDone);
18531878
StoreManagedValue(codeStream);
18541879
}
18551880

0 commit comments

Comments
 (0)