@@ -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