@@ -2149,30 +2149,14 @@ void ILLayoutClassPtrMarshalerBase::EmitConvertSpaceCLRToNative(ILCodeStream* ps
2149
2149
2150
2150
EmitLoadManagedValue (pslILEmit);
2151
2151
pslILEmit->EmitBRFALSE (pNullRefLabel);
2152
- ILCodeLabel* pTypeMismatchedLabel = pslILEmit->NewCodeLabel ();
2153
- bool emittedTypeCheck = EmitExactTypeCheck (pslILEmit, pTypeMismatchedLabel);
2154
- DWORD sizeLocal = pslILEmit->NewLocal (LocalDesc (ELEMENT_TYPE_I4));
2155
-
2156
2152
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);
2169
2153
pslILEmit->EmitCALL (METHOD__MARSHAL__ALLOC_CO_TASK_MEM, 1 , 1 );
2170
2154
pslILEmit->EmitDUP (); // for INITBLK
2171
2155
EmitStoreNativeValue (pslILEmit);
2172
2156
2173
2157
// initialize local block we just allocated
2174
2158
pslILEmit->EmitLDC (0 );
2175
- pslILEmit->EmitLDLOC (sizeLocal );
2159
+ pslILEmit->EmitLDC (uNativeSize );
2176
2160
pslILEmit->EmitINITBLK ();
2177
2161
2178
2162
pslILEmit->EmitLabel (pNullRefLabel);
@@ -2196,30 +2180,15 @@ void ILLayoutClassPtrMarshalerBase::EmitConvertSpaceCLRToNativeTemp(ILCodeStream
2196
2180
2197
2181
EmitLoadManagedValue (pslILEmit);
2198
2182
pslILEmit->EmitBRFALSE (pNullRefLabel);
2199
- ILCodeLabel* pTypeMismatchedLabel = pslILEmit->NewCodeLabel ();
2200
- bool emittedTypeCheck = EmitExactTypeCheck (pslILEmit, pTypeMismatchedLabel);
2201
- DWORD sizeLocal = pslILEmit->NewLocal (LocalDesc (ELEMENT_TYPE_I4));
2202
2183
2203
2184
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);
2216
2185
pslILEmit->EmitLOCALLOC ();
2217
2186
pslILEmit->EmitDUP (); // for INITBLK
2218
2187
EmitStoreNativeValue (pslILEmit);
2219
2188
2220
2189
// initialize local block we just allocated
2221
2190
pslILEmit->EmitLDC (0 );
2222
- pslILEmit->EmitLDLOC (sizeLocal );
2191
+ pslILEmit->EmitLDC (uNativeSize );
2223
2192
pslILEmit->EmitINITBLK ();
2224
2193
2225
2194
pslILEmit->EmitLabel (pNullRefLabel);
@@ -2295,24 +2264,7 @@ void ILLayoutClassPtrMarshalerBase::EmitClearNativeTemp(ILCodeStream* pslILEmit)
2295
2264
}
2296
2265
}
2297
2266
2298
- bool ILLayoutClassPtrMarshalerBase::EmitExactTypeCheck (ILCodeStream* pslILEmit, ILCodeLabel* isNotMatchingTypeLabel)
2299
- {
2300
- STANDARD_VM_CONTRACT;
2301
2267
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
- }
2316
2268
2317
2269
void ILLayoutClassPtrMarshaler::EmitConvertContentsCLRToNative (ILCodeStream* pslILEmit)
2318
2270
{
@@ -2329,9 +2281,6 @@ void ILLayoutClassPtrMarshaler::EmitConvertContentsCLRToNative(ILCodeStream* psl
2329
2281
pslILEmit->EmitLDC (uNativeSize);
2330
2282
pslILEmit->EmitINITBLK ();
2331
2283
2332
- ILCodeLabel* isNotMatchingTypeLabel = pslILEmit->NewCodeLabel ();
2333
- bool emittedTypeCheck = EmitExactTypeCheck (pslILEmit, isNotMatchingTypeLabel);
2334
-
2335
2284
MethodDesc* pStructMarshalStub = NDirect::CreateStructMarshalILStub (m_pargs->m_pMT );
2336
2285
2337
2286
EmitLoadManagedValue (pslILEmit);
@@ -2341,18 +2290,6 @@ void ILLayoutClassPtrMarshaler::EmitConvertContentsCLRToNative(ILCodeStream* psl
2341
2290
EmitLoadCleanupWorkList (pslILEmit);
2342
2291
2343
2292
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
-
2356
2293
pslILEmit->EmitLabel (pNullRefLabel);
2357
2294
}
2358
2295
@@ -2365,9 +2302,6 @@ void ILLayoutClassPtrMarshaler::EmitConvertContentsNativeToCLR(ILCodeStream* psl
2365
2302
EmitLoadManagedValue (pslILEmit);
2366
2303
pslILEmit->EmitBRFALSE (pNullRefLabel);
2367
2304
2368
- ILCodeLabel* isNotMatchingTypeLabel = pslILEmit->NewCodeLabel ();
2369
- bool emittedTypeCheck = EmitExactTypeCheck (pslILEmit, isNotMatchingTypeLabel);
2370
-
2371
2305
MethodDesc* pStructMarshalStub = NDirect::CreateStructMarshalILStub (m_pargs->m_pMT );
2372
2306
2373
2307
EmitLoadManagedValue (pslILEmit);
@@ -2377,26 +2311,13 @@ void ILLayoutClassPtrMarshaler::EmitConvertContentsNativeToCLR(ILCodeStream* psl
2377
2311
EmitLoadCleanupWorkList (pslILEmit);
2378
2312
2379
2313
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
- }
2389
2314
pslILEmit->EmitLabel (pNullRefLabel);
2390
2315
}
2391
2316
2392
2317
void ILLayoutClassPtrMarshaler::EmitClearNativeContents (ILCodeStream * pslILEmit)
2393
2318
{
2394
2319
STANDARD_VM_CONTRACT;
2395
2320
2396
- ILCodeLabel* isNotMatchingTypeLabel = pslILEmit->NewCodeLabel ();
2397
- ILCodeLabel* cleanedUpLabel = pslILEmit->NewCodeLabel ();
2398
- bool emittedTypeCheck = EmitExactTypeCheck (pslILEmit, isNotMatchingTypeLabel);
2399
-
2400
2321
MethodDesc* pStructMarshalStub = NDirect::CreateStructMarshalILStub (m_pargs->m_pMT );
2401
2322
2402
2323
EmitLoadManagedValue (pslILEmit);
@@ -2406,19 +2327,6 @@ void ILLayoutClassPtrMarshaler::EmitClearNativeContents(ILCodeStream * pslILEmit
2406
2327
EmitLoadCleanupWorkList (pslILEmit);
2407
2328
2408
2329
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);
2422
2330
}
2423
2331
2424
2332
@@ -2433,9 +2341,6 @@ void ILBlittablePtrMarshaler::EmitConvertContentsCLRToNative(ILCodeStream* pslIL
2433
2341
EmitLoadNativeValue (pslILEmit);
2434
2342
pslILEmit->EmitBRFALSE (pNullRefLabel);
2435
2343
2436
- ILCodeLabel* isNotMatchingTypeLabel = pslILEmit->NewCodeLabel ();
2437
- bool emittedTypeCheck = EmitExactTypeCheck (pslILEmit, isNotMatchingTypeLabel);
2438
-
2439
2344
EmitLoadNativeValue (pslILEmit); // dest
2440
2345
2441
2346
EmitLoadManagedValue (pslILEmit);
@@ -2444,17 +2349,6 @@ void ILBlittablePtrMarshaler::EmitConvertContentsCLRToNative(ILCodeStream* pslIL
2444
2349
pslILEmit->EmitLDC (uNativeSize); // size
2445
2350
2446
2351
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
- }
2458
2352
pslILEmit->EmitLabel (pNullRefLabel);
2459
2353
}
2460
2354
@@ -2469,9 +2363,6 @@ void ILBlittablePtrMarshaler::EmitConvertContentsNativeToCLR(ILCodeStream* pslIL
2469
2363
EmitLoadManagedValue (pslILEmit);
2470
2364
pslILEmit->EmitBRFALSE (pNullRefLabel);
2471
2365
2472
- ILCodeLabel* isNotMatchingTypeLabel = pslILEmit->NewCodeLabel ();
2473
- bool emittedTypeCheck = EmitExactTypeCheck (pslILEmit, isNotMatchingTypeLabel);
2474
-
2475
2366
EmitLoadManagedValue (pslILEmit);
2476
2367
pslILEmit->EmitLDFLDA (fieldDef); // dest
2477
2368
@@ -2480,26 +2371,12 @@ void ILBlittablePtrMarshaler::EmitConvertContentsNativeToCLR(ILCodeStream* pslIL
2480
2371
pslILEmit->EmitLDC (uNativeSize); // size
2481
2372
2482
2373
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
-
2494
2374
pslILEmit->EmitLabel (pNullRefLabel);
2495
2375
}
2496
2376
2497
2377
bool ILBlittablePtrMarshaler::CanMarshalViaPinning ()
2498
2378
{
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);
2503
2380
}
2504
2381
2505
2382
void ILBlittablePtrMarshaler::EmitMarshalViaPinning (ILCodeStream* pslILEmit)
0 commit comments