Skip to content

Commit 1329252

Browse files
authored
Revert "[release/5.0] When marshalling a layout class, fall-back to dynamically marshalling the type if it doesn't match the static type in the signature. (#50138)"
This reverts commit 718c0ed.
1 parent 718c0ed commit 1329252

File tree

7 files changed

+23
-276
lines changed

7 files changed

+23
-276
lines changed

src/coreclr/src/vm/corelib.h

-5
Original file line numberDiff line numberDiff line change
@@ -488,11 +488,6 @@ DEFINE_METHOD(MARSHAL, ALLOC_CO_TASK_MEM, AllocCoTa
488488
DEFINE_METHOD(MARSHAL, FREE_CO_TASK_MEM, FreeCoTaskMem, SM_IntPtr_RetVoid)
489489
DEFINE_FIELD(MARSHAL, SYSTEM_MAX_DBCS_CHAR_SIZE, SystemMaxDBCSCharSize)
490490

491-
DEFINE_METHOD(MARSHAL, STRUCTURE_TO_PTR, StructureToPtr, SM_Obj_IntPtr_Bool_RetVoid)
492-
DEFINE_METHOD(MARSHAL, PTR_TO_STRUCTURE, PtrToStructure, SM_IntPtr_Obj_RetVoid)
493-
DEFINE_METHOD(MARSHAL, DESTROY_STRUCTURE, DestroyStructure, SM_IntPtr_Type_RetVoid)
494-
DEFINE_METHOD(MARSHAL, SIZEOF_TYPE, SizeOf, SM_Type_RetInt)
495-
496491
DEFINE_CLASS(NATIVELIBRARY, Interop, NativeLibrary)
497492
DEFINE_METHOD(NATIVELIBRARY, LOADLIBRARYCALLBACKSTUB, LoadLibraryCallbackStub, SM_Str_AssemblyBase_Bool_UInt_RetIntPtr)
498493

src/coreclr/src/vm/ilmarshalers.cpp

+3-126
Original file line numberDiff line numberDiff line change
@@ -2149,30 +2149,14 @@ void ILLayoutClassPtrMarshalerBase::EmitConvertSpaceCLRToNative(ILCodeStream* ps
21492149

21502150
EmitLoadManagedValue(pslILEmit);
21512151
pslILEmit->EmitBRFALSE(pNullRefLabel);
2152-
ILCodeLabel* pTypeMismatchedLabel = pslILEmit->NewCodeLabel();
2153-
bool emittedTypeCheck = EmitExactTypeCheck(pslILEmit, pTypeMismatchedLabel);
2154-
DWORD sizeLocal = pslILEmit->NewLocal(LocalDesc(ELEMENT_TYPE_I4));
2155-
21562152
pslILEmit->EmitLDC(uNativeSize);
2157-
if (emittedTypeCheck)
2158-
{
2159-
ILCodeLabel* pHaveSizeLabel = pslILEmit->NewCodeLabel();
2160-
pslILEmit->EmitBR(pHaveSizeLabel);
2161-
pslILEmit->EmitLabel(pTypeMismatchedLabel);
2162-
EmitLoadManagedValue(pslILEmit);
2163-
pslILEmit->EmitCALL(METHOD__OBJECT__GET_TYPE, 1, 1);
2164-
pslILEmit->EmitCALL(METHOD__MARSHAL__SIZEOF_TYPE, 1, 1);
2165-
pslILEmit->EmitLabel(pHaveSizeLabel);
2166-
}
2167-
pslILEmit->EmitSTLOC(sizeLocal);
2168-
pslILEmit->EmitLDLOC(sizeLocal);
21692153
pslILEmit->EmitCALL(METHOD__MARSHAL__ALLOC_CO_TASK_MEM, 1, 1);
21702154
pslILEmit->EmitDUP(); // for INITBLK
21712155
EmitStoreNativeValue(pslILEmit);
21722156

21732157
// initialize local block we just allocated
21742158
pslILEmit->EmitLDC(0);
2175-
pslILEmit->EmitLDLOC(sizeLocal);
2159+
pslILEmit->EmitLDC(uNativeSize);
21762160
pslILEmit->EmitINITBLK();
21772161

21782162
pslILEmit->EmitLabel(pNullRefLabel);
@@ -2196,30 +2180,15 @@ void ILLayoutClassPtrMarshalerBase::EmitConvertSpaceCLRToNativeTemp(ILCodeStream
21962180

21972181
EmitLoadManagedValue(pslILEmit);
21982182
pslILEmit->EmitBRFALSE(pNullRefLabel);
2199-
ILCodeLabel* pTypeMismatchedLabel = pslILEmit->NewCodeLabel();
2200-
bool emittedTypeCheck = EmitExactTypeCheck(pslILEmit, pTypeMismatchedLabel);
2201-
DWORD sizeLocal = pslILEmit->NewLocal(LocalDesc(ELEMENT_TYPE_I4));
22022183

22032184
pslILEmit->EmitLDC(uNativeSize);
2204-
if (emittedTypeCheck)
2205-
{
2206-
ILCodeLabel* pHaveSizeLabel = pslILEmit->NewCodeLabel();
2207-
pslILEmit->EmitBR(pHaveSizeLabel);
2208-
pslILEmit->EmitLabel(pTypeMismatchedLabel);
2209-
EmitLoadManagedValue(pslILEmit);
2210-
pslILEmit->EmitCALL(METHOD__OBJECT__GET_TYPE, 1, 1);
2211-
pslILEmit->EmitCALL(METHOD__MARSHAL__SIZEOF_TYPE, 1, 1);
2212-
pslILEmit->EmitLabel(pHaveSizeLabel);
2213-
}
2214-
pslILEmit->EmitSTLOC(sizeLocal);
2215-
pslILEmit->EmitLDLOC(sizeLocal);
22162185
pslILEmit->EmitLOCALLOC();
22172186
pslILEmit->EmitDUP(); // for INITBLK
22182187
EmitStoreNativeValue(pslILEmit);
22192188

22202189
// initialize local block we just allocated
22212190
pslILEmit->EmitLDC(0);
2222-
pslILEmit->EmitLDLOC(sizeLocal);
2191+
pslILEmit->EmitLDC(uNativeSize);
22232192
pslILEmit->EmitINITBLK();
22242193

22252194
pslILEmit->EmitLabel(pNullRefLabel);
@@ -2295,24 +2264,7 @@ void ILLayoutClassPtrMarshalerBase::EmitClearNativeTemp(ILCodeStream* pslILEmit)
22952264
}
22962265
}
22972266

2298-
bool ILLayoutClassPtrMarshalerBase::EmitExactTypeCheck(ILCodeStream* pslILEmit, ILCodeLabel* isNotMatchingTypeLabel)
2299-
{
2300-
STANDARD_VM_CONTRACT;
23012267

2302-
if (m_pargs->m_pMT->IsSealed())
2303-
{
2304-
// If the provided type cannot be derived from, then we don't need to emit the type check.
2305-
return false;
2306-
}
2307-
EmitLoadManagedValue(pslILEmit);
2308-
pslILEmit->EmitCALL(METHOD__OBJECT__GET_TYPE, 1, 1);
2309-
pslILEmit->EmitLDTOKEN(pslILEmit->GetToken(m_pargs->m_pMT));
2310-
pslILEmit->EmitCALL(METHOD__TYPE__GET_TYPE_FROM_HANDLE, 1, 1);
2311-
pslILEmit->EmitCALLVIRT(pslILEmit->GetToken(CoreLibBinder::GetMethod(METHOD__OBJECT__EQUALS)), 1, 1);
2312-
pslILEmit->EmitBRFALSE(isNotMatchingTypeLabel);
2313-
2314-
return true;
2315-
}
23162268

23172269
void ILLayoutClassPtrMarshaler::EmitConvertContentsCLRToNative(ILCodeStream* pslILEmit)
23182270
{
@@ -2329,9 +2281,6 @@ void ILLayoutClassPtrMarshaler::EmitConvertContentsCLRToNative(ILCodeStream* psl
23292281
pslILEmit->EmitLDC(uNativeSize);
23302282
pslILEmit->EmitINITBLK();
23312283

2332-
ILCodeLabel* isNotMatchingTypeLabel = pslILEmit->NewCodeLabel();
2333-
bool emittedTypeCheck = EmitExactTypeCheck(pslILEmit, isNotMatchingTypeLabel);
2334-
23352284
MethodDesc* pStructMarshalStub = NDirect::CreateStructMarshalILStub(m_pargs->m_pMT);
23362285

23372286
EmitLoadManagedValue(pslILEmit);
@@ -2341,18 +2290,6 @@ void ILLayoutClassPtrMarshaler::EmitConvertContentsCLRToNative(ILCodeStream* psl
23412290
EmitLoadCleanupWorkList(pslILEmit);
23422291

23432292
pslILEmit->EmitCALL(pslILEmit->GetToken(pStructMarshalStub), 4, 0);
2344-
2345-
if (emittedTypeCheck)
2346-
{
2347-
pslILEmit->EmitBR(pNullRefLabel);
2348-
2349-
pslILEmit->EmitLabel(isNotMatchingTypeLabel);
2350-
EmitLoadManagedValue(pslILEmit);
2351-
EmitLoadNativeValue(pslILEmit);
2352-
pslILEmit->EmitLDC(0);
2353-
pslILEmit->EmitCALL(METHOD__MARSHAL__STRUCTURE_TO_PTR, 3, 0);
2354-
}
2355-
23562293
pslILEmit->EmitLabel(pNullRefLabel);
23572294
}
23582295

@@ -2365,9 +2302,6 @@ void ILLayoutClassPtrMarshaler::EmitConvertContentsNativeToCLR(ILCodeStream* psl
23652302
EmitLoadManagedValue(pslILEmit);
23662303
pslILEmit->EmitBRFALSE(pNullRefLabel);
23672304

2368-
ILCodeLabel* isNotMatchingTypeLabel = pslILEmit->NewCodeLabel();
2369-
bool emittedTypeCheck = EmitExactTypeCheck(pslILEmit, isNotMatchingTypeLabel);
2370-
23712305
MethodDesc* pStructMarshalStub = NDirect::CreateStructMarshalILStub(m_pargs->m_pMT);
23722306

23732307
EmitLoadManagedValue(pslILEmit);
@@ -2377,26 +2311,13 @@ void ILLayoutClassPtrMarshaler::EmitConvertContentsNativeToCLR(ILCodeStream* psl
23772311
EmitLoadCleanupWorkList(pslILEmit);
23782312

23792313
pslILEmit->EmitCALL(pslILEmit->GetToken(pStructMarshalStub), 4, 0);
2380-
if (emittedTypeCheck)
2381-
{
2382-
pslILEmit->EmitBR(pNullRefLabel);
2383-
2384-
pslILEmit->EmitLabel(isNotMatchingTypeLabel);
2385-
EmitLoadNativeValue(pslILEmit);
2386-
EmitLoadManagedValue(pslILEmit);
2387-
pslILEmit->EmitCALL(METHOD__MARSHAL__PTR_TO_STRUCTURE, 2, 0);
2388-
}
23892314
pslILEmit->EmitLabel(pNullRefLabel);
23902315
}
23912316

23922317
void ILLayoutClassPtrMarshaler::EmitClearNativeContents(ILCodeStream * pslILEmit)
23932318
{
23942319
STANDARD_VM_CONTRACT;
23952320

2396-
ILCodeLabel* isNotMatchingTypeLabel = pslILEmit->NewCodeLabel();
2397-
ILCodeLabel* cleanedUpLabel = pslILEmit->NewCodeLabel();
2398-
bool emittedTypeCheck = EmitExactTypeCheck(pslILEmit, isNotMatchingTypeLabel);
2399-
24002321
MethodDesc* pStructMarshalStub = NDirect::CreateStructMarshalILStub(m_pargs->m_pMT);
24012322

24022323
EmitLoadManagedValue(pslILEmit);
@@ -2406,19 +2327,6 @@ void ILLayoutClassPtrMarshaler::EmitClearNativeContents(ILCodeStream * pslILEmit
24062327
EmitLoadCleanupWorkList(pslILEmit);
24072328

24082329
pslILEmit->EmitCALL(pslILEmit->GetToken(pStructMarshalStub), 4, 0);
2409-
2410-
if (emittedTypeCheck)
2411-
{
2412-
pslILEmit->EmitBR(cleanedUpLabel);
2413-
2414-
pslILEmit->EmitLabel(isNotMatchingTypeLabel);
2415-
EmitLoadNativeValue(pslILEmit);
2416-
EmitLoadManagedValue(pslILEmit);
2417-
pslILEmit->EmitCALL(METHOD__OBJECT__GET_TYPE, 1, 1);
2418-
pslILEmit->EmitCALL(METHOD__MARSHAL__DESTROY_STRUCTURE, 2, 0);
2419-
}
2420-
2421-
pslILEmit->EmitLabel(cleanedUpLabel);
24222330
}
24232331

24242332

@@ -2433,9 +2341,6 @@ void ILBlittablePtrMarshaler::EmitConvertContentsCLRToNative(ILCodeStream* pslIL
24332341
EmitLoadNativeValue(pslILEmit);
24342342
pslILEmit->EmitBRFALSE(pNullRefLabel);
24352343

2436-
ILCodeLabel* isNotMatchingTypeLabel = pslILEmit->NewCodeLabel();
2437-
bool emittedTypeCheck = EmitExactTypeCheck(pslILEmit, isNotMatchingTypeLabel);
2438-
24392344
EmitLoadNativeValue(pslILEmit); // dest
24402345

24412346
EmitLoadManagedValue(pslILEmit);
@@ -2444,17 +2349,6 @@ void ILBlittablePtrMarshaler::EmitConvertContentsCLRToNative(ILCodeStream* pslIL
24442349
pslILEmit->EmitLDC(uNativeSize); // size
24452350

24462351
pslILEmit->EmitCPBLK();
2447-
2448-
if (emittedTypeCheck)
2449-
{
2450-
pslILEmit->EmitBR(pNullRefLabel);
2451-
2452-
pslILEmit->EmitLabel(isNotMatchingTypeLabel);
2453-
EmitLoadManagedValue(pslILEmit);
2454-
EmitLoadNativeValue(pslILEmit);
2455-
pslILEmit->EmitLDC(0);
2456-
pslILEmit->EmitCALL(METHOD__MARSHAL__STRUCTURE_TO_PTR, 3, 0);
2457-
}
24582352
pslILEmit->EmitLabel(pNullRefLabel);
24592353
}
24602354

@@ -2469,9 +2363,6 @@ void ILBlittablePtrMarshaler::EmitConvertContentsNativeToCLR(ILCodeStream* pslIL
24692363
EmitLoadManagedValue(pslILEmit);
24702364
pslILEmit->EmitBRFALSE(pNullRefLabel);
24712365

2472-
ILCodeLabel* isNotMatchingTypeLabel = pslILEmit->NewCodeLabel();
2473-
bool emittedTypeCheck = EmitExactTypeCheck(pslILEmit, isNotMatchingTypeLabel);
2474-
24752366
EmitLoadManagedValue(pslILEmit);
24762367
pslILEmit->EmitLDFLDA(fieldDef); // dest
24772368

@@ -2480,26 +2371,12 @@ void ILBlittablePtrMarshaler::EmitConvertContentsNativeToCLR(ILCodeStream* pslIL
24802371
pslILEmit->EmitLDC(uNativeSize); // size
24812372

24822373
pslILEmit->EmitCPBLK();
2483-
2484-
if (emittedTypeCheck)
2485-
{
2486-
pslILEmit->EmitBR(pNullRefLabel);
2487-
2488-
pslILEmit->EmitLabel(isNotMatchingTypeLabel);
2489-
EmitLoadNativeValue(pslILEmit);
2490-
EmitLoadManagedValue(pslILEmit);
2491-
pslILEmit->EmitCALL(METHOD__MARSHAL__PTR_TO_STRUCTURE, 2, 0);
2492-
}
2493-
24942374
pslILEmit->EmitLabel(pNullRefLabel);
24952375
}
24962376

24972377
bool ILBlittablePtrMarshaler::CanMarshalViaPinning()
24982378
{
2499-
return IsCLRToNative(m_dwMarshalFlags) &&
2500-
!IsByref(m_dwMarshalFlags) &&
2501-
!IsFieldMarshal(m_dwMarshalFlags) &&
2502-
m_pargs->m_pMT->IsSealed(); // We can't marshal via pinning if we might need to marshal differently at runtime. See calls to EmitExactTypeCheck where we check the runtime type of the object being marshalled.
2379+
return IsCLRToNative(m_dwMarshalFlags) && !IsByref(m_dwMarshalFlags) && !IsFieldMarshal(m_dwMarshalFlags);
25032380
}
25042381

25052382
void ILBlittablePtrMarshaler::EmitMarshalViaPinning(ILCodeStream* pslILEmit)

src/coreclr/src/vm/ilmarshalers.h

-1
Original file line numberDiff line numberDiff line change
@@ -2915,7 +2915,6 @@ class ILLayoutClassPtrMarshalerBase : public ILMarshaler
29152915
bool NeedsClearNative() override;
29162916
void EmitClearNative(ILCodeStream* pslILEmit) override;
29172917
void EmitClearNativeTemp(ILCodeStream* pslILEmit) override;
2918-
bool EmitExactTypeCheck(ILCodeStream* pslILEmit, ILCodeLabel* isNotMatchingTypeLabel);
29192918
};
29202919

29212920
class ILLayoutClassPtrMarshaler : public ILLayoutClassPtrMarshalerBase

src/coreclr/src/vm/metasig.h

-4
Original file line numberDiff line numberDiff line change
@@ -604,10 +604,6 @@ DEFINE_METASIG_T(SM(Array_Int_Array_Int_Int_RetVoid, C(ARRAY) i C(ARRAY) i i, v)
604604
DEFINE_METASIG_T(SM(Array_Int_Obj_RetVoid, C(ARRAY) i j, v))
605605
DEFINE_METASIG_T(SM(Array_Int_PtrVoid_RetRefObj, C(ARRAY) i P(v), r(j)))
606606

607-
DEFINE_METASIG(SM(Obj_IntPtr_Bool_RetVoid, j I F, v))
608-
DEFINE_METASIG(SM(IntPtr_Obj_RetVoid, I j, v))
609-
DEFINE_METASIG_T(SM(IntPtr_Type_RetVoid, I C(TYPE), v))
610-
611607
// Undefine macros in case we include the file again in the compilation unit
612608

613609
#undef DEFINE_METASIG

src/coreclr/src/vm/mlinfo.cpp

+3-12
Original file line numberDiff line numberDiff line change
@@ -1231,8 +1231,6 @@ MarshalInfo::MarshalInfo(Module* pModule,
12311231
m_pMT = NULL;
12321232
m_pMD = pMD;
12331233
m_onInstanceMethod = onInstanceMethod;
1234-
// [Compat] For backward compatibility reasons, some marshalers imply [In, Out] behavior when marked as [In], [Out], or not marked with either.
1235-
BOOL byValAlwaysInOut = FALSE;
12361234

12371235
#ifdef FEATURE_COMINTEROP
12381236
m_fDispItf = FALSE;
@@ -2009,7 +2007,6 @@ MarshalInfo::MarshalInfo(Module* pModule,
20092007
}
20102008
m_type = IsFieldScenario() ? MARSHAL_TYPE_BLITTABLE_LAYOUTCLASS : MARSHAL_TYPE_BLITTABLEPTR;
20112009
m_args.m_pMT = m_pMT;
2012-
byValAlwaysInOut = TRUE;
20132010
}
20142011
else if (m_pMT->HasLayout())
20152012
{
@@ -2517,16 +2514,10 @@ MarshalInfo::MarshalInfo(Module* pModule,
25172514
}
25182515
}
25192516

2520-
if (!m_byref && byValAlwaysInOut)
2517+
// If neither IN nor OUT are true, this signals the URT to use the default
2518+
// rules.
2519+
if (!m_in && !m_out)
25212520
{
2522-
// Some marshalers expect [In, Out] behavior with [In], [Out], or no directional attributes.
2523-
m_in = TRUE;
2524-
m_out = TRUE;
2525-
}
2526-
else if (!m_in && !m_out)
2527-
{
2528-
// If neither IN nor OUT are true, this signals the URT to use the default
2529-
// rules.
25302521
if (m_byref ||
25312522
(mtype == ELEMENT_TYPE_CLASS
25322523
&& !(sig.IsStringType(pModule, pTypeContext))

src/tests/Interop/LayoutClass/LayoutClassNative.cpp

+10-22
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,7 @@
55
#include <xplatform.h>
66

77
typedef void *voidPtr;
8-
9-
struct EmptyBase
10-
{
11-
};
12-
13-
struct DerivedSeqClass : public EmptyBase
14-
{
15-
int a;
16-
};
17-
8+
189
struct SeqClass
1910
{
2011
int a;
@@ -23,7 +14,7 @@ struct SeqClass
2314
};
2415

2516
struct ExpClass
26-
{
17+
{
2718
int a;
2819
int padding; //padding needs to be added here as we have added 8 byte offset.
2920
union
@@ -56,35 +47,32 @@ DLL_EXPORT BOOL STDMETHODCALLTYPE SimpleSeqLayoutClassByRef(SeqClass* p)
5647
}
5748

5849
extern "C"
59-
DLL_EXPORT BOOL STDMETHODCALLTYPE DerivedSeqLayoutClassByRef(EmptyBase* p, int expected)
50+
DLL_EXPORT BOOL STDMETHODCALLTYPE SimpleExpLayoutClassByRef(ExpClass* p)
6051
{
61-
if(((DerivedSeqClass*)p)->a != expected)
52+
if((p->a != 0) || (p->udata.i != 10))
6253
{
63-
printf("FAIL: p->a=%d, expected %d\n", ((DerivedSeqClass*)p)->a, expected);
54+
printf("FAIL: p->a=%d, p->udata.i=%d\n",p->a,p->udata.i);
6455
return FALSE;
6556
}
6657
return TRUE;
6758
}
6859

6960
extern "C"
70-
DLL_EXPORT BOOL STDMETHODCALLTYPE SimpleExpLayoutClassByRef(ExpClass* p)
61+
DLL_EXPORT BOOL STDMETHODCALLTYPE SimpleBlittableSeqLayoutClassByRef(BlittableClass* p)
7162
{
72-
if((p->a != 0) || (p->udata.i != 10))
63+
if(p->a != 10)
7364
{
74-
printf("FAIL: p->a=%d, p->udata.i=%d\n",p->a,p->udata.i);
65+
printf("FAIL: p->a=%d\n", p->a);
7566
return FALSE;
7667
}
7768
return TRUE;
7869
}
7970

8071
extern "C"
81-
DLL_EXPORT BOOL STDMETHODCALLTYPE SimpleBlittableSeqLayoutClass_UpdateField(BlittableClass* p)
72+
DLL_EXPORT BOOL STDMETHODCALLTYPE SimpleBlittableSeqLayoutClassByOutAttr(BlittableClass* p)
8273
{
83-
if(p->a != 10)
84-
{
85-
printf("FAIL: p->a=%d\n", p->a);
74+
if(!SimpleBlittableSeqLayoutClassByRef(p))
8675
return FALSE;
87-
}
8876

8977
p->a++;
9078
return TRUE;

0 commit comments

Comments
 (0)