提交 0953da23 编写于 作者: M Michal Strehovský 提交者: Jan Kotas

Fix marshalling null delegates (#241)

Null delegates marshal as null pointers and vice versa.
上级 4842a7ec
......@@ -1824,7 +1824,12 @@ 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);
codeStream.Emit(ILOpcode.brfalse, lNullPointer);
codeStream.Emit(ILOpcode.call, _ilCodeStreams.Emitter.NewToken(
InteropTypes.GetMarshal(Context).GetKnownMethod("GetFunctionPointerForDelegate",
......@@ -1832,12 +1837,25 @@ 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);
codeStream.Emit(ILOpcode.brfalse, lNullPointer);
TypeDesc systemType = Context.SystemModule.GetKnownType("System", "Type");
......@@ -1850,6 +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);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册