Skip to content

Commit 4888360

Browse files
authored
Move type check to after the null ref branch in out marshalling of blittable classes. (#50735)
1 parent 27591f5 commit 4888360

3 files changed

Lines changed: 37 additions & 3 deletions

File tree

src/coreclr/vm/ilmarshalers.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2466,12 +2466,12 @@ void ILBlittablePtrMarshaler::EmitConvertContentsNativeToCLR(ILCodeStream* pslIL
24662466
UINT uNativeSize = m_pargs->m_pMT->GetNativeSize();
24672467
int fieldDef = pslILEmit->GetToken(CoreLibBinder::GetField(FIELD__RAW_DATA__DATA));
24682468

2469-
ILCodeLabel* isNotMatchingTypeLabel = pslILEmit->NewCodeLabel();
2470-
bool emittedTypeCheck = EmitExactTypeCheck(pslILEmit, isNotMatchingTypeLabel);
2471-
24722469
EmitLoadManagedValue(pslILEmit);
24732470
pslILEmit->EmitBRFALSE(pNullRefLabel);
24742471

2472+
ILCodeLabel* isNotMatchingTypeLabel = pslILEmit->NewCodeLabel();
2473+
bool emittedTypeCheck = EmitExactTypeCheck(pslILEmit, isNotMatchingTypeLabel);
2474+
24752475
EmitLoadManagedValue(pslILEmit);
24762476
pslILEmit->EmitLDFLDA(fieldDef); // dest
24772477

src/tests/Interop/LayoutClass/LayoutClassNative.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ DLL_EXPORT BOOL STDMETHODCALLTYPE SimpleSeqLayoutClassByRef(SeqClass* p)
5555
return TRUE;
5656
}
5757

58+
extern "C"
59+
DLL_EXPORT BOOL STDMETHODCALLTYPE SimpleSeqLayoutClassByRefNull(SeqClass* p)
60+
{
61+
return p == NULL ? TRUE : FALSE;
62+
}
63+
5864
extern "C"
5965
DLL_EXPORT BOOL STDMETHODCALLTYPE DerivedSeqLayoutClassByRef(EmptyBase* p, int expected)
6066
{
@@ -90,6 +96,12 @@ DLL_EXPORT BOOL STDMETHODCALLTYPE SimpleBlittableSeqLayoutClass_UpdateField(Blit
9096
return TRUE;
9197
}
9298

99+
extern "C"
100+
DLL_EXPORT BOOL STDMETHODCALLTYPE SimpleBlittableSeqLayoutClass_Null(BlittableClass* p)
101+
{
102+
return p == NULL ? TRUE : FALSE;
103+
}
104+
93105
extern "C"
94106
DLL_EXPORT BOOL STDMETHODCALLTYPE SimpleNestedLayoutClassByValue(NestedLayoutClass v)
95107
{

src/tests/Interop/LayoutClass/LayoutClassTest.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,18 @@ class StructureTests
128128
[DllImport("LayoutClassNative")]
129129
private static extern bool SimpleSeqLayoutClassByRef(SeqClass p);
130130

131+
[DllImport("LayoutClassNative")]
132+
private static extern bool SimpleSeqLayoutClassByRefNull([In, Out] SeqClass p);
133+
131134
[DllImport("LayoutClassNative")]
132135
private static extern bool DerivedSeqLayoutClassByRef(EmptyBase p, int expected);
133136

134137
[DllImport("LayoutClassNative")]
135138
private static extern bool SimpleExpLayoutClassByRef(ExpClass p);
136139

140+
[DllImport("LayoutClassNative")]
141+
private static extern bool SimpleBlittableSeqLayoutClass_Null(Blittable p);
142+
137143
[DllImport("LayoutClassNative", EntryPoint = SimpleBlittableSeqLayoutClass_UpdateField)]
138144
private static extern bool SimpleBlittableSeqLayoutClassByRef(Blittable p);
139145

@@ -167,6 +173,13 @@ public static void SequentialClass()
167173
Assert.IsTrue(SimpleSeqLayoutClassByRef(p));
168174
}
169175

176+
public static void SequentialClassNull()
177+
{
178+
Console.WriteLine($"Running {nameof(SequentialClassNull)}...");
179+
180+
Assert.IsTrue(SimpleSeqLayoutClassByRefNull(null));
181+
}
182+
170183
public static void DerivedClassWithEmptyBase()
171184
{
172185
Console.WriteLine($"Running {nameof(DerivedClassWithEmptyBase)}...");
@@ -200,6 +213,13 @@ public static void BlittableClass()
200213
ValidateBlittableClassInOut(SimpleBlittableSeqLayoutClassByRef);
201214
}
202215

216+
public static void BlittableClassNull()
217+
{
218+
// [Compat] Marshalled with [In, Out] behaviour by default
219+
Console.WriteLine($"Running {nameof(BlittableClassNull)}...");
220+
Assert.IsTrue(SimpleBlittableSeqLayoutClass_Null(null));
221+
}
222+
203223
public static void BlittableClassByInAttr()
204224
{
205225
// [Compat] Marshalled with [In, Out] behaviour even when only [In] is specified
@@ -269,9 +289,11 @@ public static int Main(string[] argv)
269289
try
270290
{
271291
SequentialClass();
292+
SequentialClassNull();
272293
DerivedClassWithEmptyBase();
273294
ExplicitClass();
274295
BlittableClass();
296+
BlittableClassNull();
275297
SealedBlittableClass();
276298
BlittableClassByInAttr();
277299
SealedBlittableClassByInAttr();

0 commit comments

Comments
 (0)