From ac27e6badbb195a77c0f81427ffc0d4f837dcc45 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Wed, 13 Feb 2019 15:52:35 -0800 Subject: [PATCH] Remove Marshaling MDA (#22579) Remove the "marshaling" MDA. In .NET Framework it was off by default and in .NET Core it was commented out in the boilerplate file. Additionally, from what I can tell only half of its functionality was ever implemented in .NET Core. Contributes to #22538. --- src/vm/fieldmarshaler.cpp | 353 ----------------------------------- src/vm/fieldmarshaler.h | 2 - src/vm/mdaBoilerplate.exe.mda.config | 11 -- src/vm/mdaassistants.cpp | 233 ----------------------- src/vm/mdaassistants.h | 24 --- src/vm/methodtablebuilder.cpp | 16 -- 6 files changed, 639 deletions(-) diff --git a/src/vm/fieldmarshaler.cpp b/src/vm/fieldmarshaler.cpp index e0b3a4a..5a72b89 100644 --- a/src/vm/fieldmarshaler.cpp +++ b/src/vm/fieldmarshaler.cpp @@ -4415,359 +4415,6 @@ VOID FieldMarshaler_Variant::DestroyNativeImpl(LPVOID pNativeValue) const #endif // FEATURE_COMINTEROP - -#ifdef _PREFAST_ -#pragma warning(push) -#pragma warning(disable:21000) // Suppress PREFast warning about overly large function -#endif -VOID NStructFieldTypeToString(FieldMarshaler* pFM, SString& strNStructFieldType) -{ - CONTRACTL - { - THROWS; - GC_NOTRIGGER; - MODE_ANY; - INJECT_FAULT(COMPlusThrowOM()); - PRECONDITION(CheckPointer(pFM)); - } - CONTRACTL_END; - - NStructFieldType cls = pFM->GetNStructFieldType(); - LPCWSTR strRetVal; - CorElementType elemType = pFM->GetFieldDesc()->GetFieldType(); - - // Some NStruct Field Types have extra information and require special handling. - if (cls == NFT_FIXEDCHARARRAYANSI) - { - strNStructFieldType.Printf(W("fixed array of ANSI char (size = %i bytes)"), pFM->NativeSize()); - return; - } - else if (cls == NFT_FIXEDARRAY) - { - VARTYPE vtElement = ((FieldMarshaler_FixedArray*)pFM)->GetElementVT(); - TypeHandle thElement = ((FieldMarshaler_FixedArray*)pFM)->GetElementTypeHandle(); - BOOL fElementTypeUserDefined = FALSE; - - // Determine if the array type is a user defined type. - if (vtElement == VT_RECORD) - { - fElementTypeUserDefined = TRUE; - } - else if (vtElement == VT_UNKNOWN || vtElement == VT_DISPATCH) - { - fElementTypeUserDefined = !thElement.IsObjectType(); - } - - // Retrieve the string representation for the VARTYPE. - StackSString strVarType; - MarshalInfo::VarTypeToString(vtElement, strVarType); - - MethodTable *pMT = ((FieldMarshaler_FixedArray*)pFM)->GetElementTypeHandle().GetMethodTable(); - DefineFullyQualifiedNameForClassW(); - WCHAR* szClassName = (WCHAR*)GetFullyQualifiedNameForClassW(pMT); - - if (fElementTypeUserDefined) - { - strNStructFieldType.Printf(W("fixed array of %s exposed as %s elements (array size = %i bytes)"), - szClassName, - strVarType.GetUnicode(), pFM->NativeSize()); - } - else - { - strNStructFieldType.Printf(W("fixed array of %s (array size = %i bytes)"), - szClassName, pFM->NativeSize()); - } - - return; - } -#ifdef FEATURE_COMINTEROP - else if (cls == NFT_INTERFACE) - { - MethodTable *pItfMT = NULL; - DWORD dwFlags = 0; - - ((FieldMarshaler_Interface*)pFM)->GetInterfaceInfo(&pItfMT, &dwFlags); - - if (dwFlags & ItfMarshalInfo::ITF_MARSHAL_DISP_ITF) - { - strNStructFieldType.Set(W("IDispatch ")); - } - else - { - strNStructFieldType.Set(W("IUnknown ")); - } - - if (dwFlags & ItfMarshalInfo::ITF_MARSHAL_USE_BASIC_ITF) - { - strNStructFieldType.Append(W("(basic) ")); - } - - - if (pItfMT) - { - DefineFullyQualifiedNameForClassW(); - GetFullyQualifiedNameForClassW(pItfMT); - - strNStructFieldType.Append(GetFullyQualifiedNameForClassW(pItfMT)); - } - - return; - } -#ifdef FEATURE_CLASSIC_COMINTEROP - else if (cls == NFT_SAFEARRAY) - { - VARTYPE vtElement = ((FieldMarshaler_SafeArray*)pFM)->GetElementVT(); - TypeHandle thElement = ((FieldMarshaler_SafeArray*)pFM)->GetElementTypeHandle(); - BOOL fElementTypeUserDefined = FALSE; - - // Determine if the array type is a user defined type. - if (vtElement == VT_RECORD) - { - fElementTypeUserDefined = TRUE; - } - else if (vtElement == VT_UNKNOWN || vtElement == VT_DISPATCH) - { - fElementTypeUserDefined = !thElement.IsObjectType(); - } - - // Retrieve the string representation for the VARTYPE. - StackSString strVarType; - MarshalInfo::VarTypeToString(vtElement, strVarType); - - - StackSString strClassName; - if (!thElement.IsNull()) - { - DefineFullyQualifiedNameForClassW(); - MethodTable *pMT = ((FieldMarshaler_SafeArray*)pFM)->GetElementTypeHandle().GetMethodTable(); - strClassName.Set((WCHAR*)GetFullyQualifiedNameForClassW(pMT)); - } - else - { - strClassName.Set(W("object")); - } - - if (fElementTypeUserDefined) - { - strNStructFieldType.Printf(W("safe array of %s exposed as %s elements (array size = %i bytes)"), - strClassName.GetUnicode(), - strVarType.GetUnicode(), pFM->NativeSize()); - } - else - { - strNStructFieldType.Printf(W("safearray of %s (array size = %i bytes)"), - strClassName.GetUnicode(), pFM->NativeSize()); - } - - return; - } -#endif // FEATURE_CLASSIC_COMINTEROP -#endif // FEATURE_COMINTEROP - else if (cls == NFT_NESTEDLAYOUTCLASS) - { - MethodTable *pMT = ((FieldMarshaler_NestedLayoutClass*)pFM)->GetMethodTable(); - DefineFullyQualifiedNameForClassW(); - strNStructFieldType.Printf(W("nested layout class %s"), - GetFullyQualifiedNameForClassW(pMT)); - return; - } - else if (cls == NFT_NESTEDVALUECLASS) - { - MethodTable *pMT = ((FieldMarshaler_NestedValueClass*)pFM)->GetMethodTable(); - DefineFullyQualifiedNameForClassW(); - strNStructFieldType.Printf(W("nested value class %s"), - GetFullyQualifiedNameForClassW(pMT)); - return; - } - else if (cls == NFT_COPY1) - { - // The following CorElementTypes are the only ones handled with FieldMarshaler_Copy1. - switch (elemType) - { - case ELEMENT_TYPE_I1: - strRetVal = W("SByte"); - break; - - case ELEMENT_TYPE_U1: - strRetVal = W("Byte"); - break; - - default: - strRetVal = W("Unknown"); - break; - } - } - else if (cls == NFT_COPY2) - { - // The following CorElementTypes are the only ones handled with FieldMarshaler_Copy2. - switch (elemType) - { - case ELEMENT_TYPE_CHAR: - strRetVal = W("Unicode char"); - break; - - case ELEMENT_TYPE_I2: - strRetVal = W("Int16"); - break; - - case ELEMENT_TYPE_U2: - strRetVal = W("UInt16"); - break; - - default: - strRetVal = W("Unknown"); - break; - } - } - else if (cls == NFT_COPY4) - { - // The following CorElementTypes are the only ones handled with FieldMarshaler_Copy4. - switch (elemType) - { - // At this point, ELEMENT_TYPE_I must be 4 bytes long. Same for ELEMENT_TYPE_U. - case ELEMENT_TYPE_I: - case ELEMENT_TYPE_I4: - strRetVal = W("Int32"); - break; - - case ELEMENT_TYPE_U: - case ELEMENT_TYPE_U4: - strRetVal = W("UInt32"); - break; - - case ELEMENT_TYPE_R4: - strRetVal = W("Single"); - break; - - case ELEMENT_TYPE_PTR: - strRetVal = W("4-byte pointer"); - break; - - default: - strRetVal = W("Unknown"); - break; - } - } - else if (cls == NFT_COPY8) - { - // The following CorElementTypes are the only ones handled with FieldMarshaler_Copy8. - switch (elemType) - { - // At this point, ELEMENT_TYPE_I must be 8 bytes long. Same for ELEMENT_TYPE_U. - case ELEMENT_TYPE_I: - case ELEMENT_TYPE_I8: - strRetVal = W("Int64"); - break; - - case ELEMENT_TYPE_U: - case ELEMENT_TYPE_U8: - strRetVal = W("UInt64"); - break; - - case ELEMENT_TYPE_R8: - strRetVal = W("Double"); - break; - - case ELEMENT_TYPE_PTR: - strRetVal = W("8-byte pointer"); - break; - - default: - strRetVal = W("Unknown"); - break; - } - } - else if (cls == NFT_FIXEDSTRINGUNI) - { - int nativeSize = pFM->NativeSize(); - int strLength = nativeSize / sizeof(WCHAR); - - strNStructFieldType.Printf(W("embedded LPWSTR (length %d)"), strLength); - - return; - } - else if (cls == NFT_FIXEDSTRINGANSI) - { - int nativeSize = pFM->NativeSize(); - int strLength = nativeSize / sizeof(CHAR); - - strNStructFieldType.Printf(W("embedded LPSTR (length %d)"), strLength); - - return; - } - else - { - // All other NStruct Field Types which do not require special handling. - switch (cls) - { - case NFT_BSTR: - strRetVal = W("BSTR"); - break; -#ifdef FEATURE_COMINTEROP - case NFT_HSTRING: - strRetVal = W("HSTRING"); - break; -#endif // FEATURE_COMINTEROP - case NFT_STRINGUNI: - strRetVal = W("LPWSTR"); - break; - case NFT_STRINGANSI: - strRetVal = W("LPSTR"); - break; - case NFT_DELEGATE: - strRetVal = W("Delegate"); - break; -#ifdef FEATURE_COMINTEROP - case NFT_VARIANT: - strRetVal = W("VARIANT"); - break; -#endif // FEATURE_COMINTEROP - case NFT_ANSICHAR: - strRetVal = W("ANSI char"); - break; - case NFT_WINBOOL: - strRetVal = W("Windows Bool"); - break; - case NFT_CBOOL: - strRetVal = W("CBool"); - break; - case NFT_DECIMAL: - strRetVal = W("DECIMAL"); - break; - case NFT_DATE: - strRetVal = W("DATE"); - break; -#ifdef FEATURE_COMINTEROP - case NFT_VARIANTBOOL: - strRetVal = W("VARIANT Bool"); - break; - case NFT_CURRENCY: - strRetVal = W("CURRENCY"); - break; -#endif // FEATURE_COMINTEROP - case NFT_ILLEGAL: - strRetVal = W("illegal type"); - break; - case NFT_SAFEHANDLE: - strRetVal = W("SafeHandle"); - break; - case NFT_CRITICALHANDLE: - strRetVal = W("CriticalHandle"); - break; - default: - strRetVal = W(""); - break; - } - } - - strNStructFieldType.Set(strRetVal); - - return; -} -#ifdef _PREFAST_ -#pragma warning(pop) -#endif - #endif // CROSSGEN_COMPILE diff --git a/src/vm/fieldmarshaler.h b/src/vm/fieldmarshaler.h index 55e7773..2e1b011 100644 --- a/src/vm/fieldmarshaler.h +++ b/src/vm/fieldmarshaler.h @@ -67,8 +67,6 @@ class FieldMarshaler_Exception; class FieldMarshaler_Nullable; #endif // FEATURE_COMINTEROP -VOID NStructFieldTypeToString(FieldMarshaler* pFM, SString& strNStructFieldType); - //======================================================================= // Each possible COM+/Native pairing of data type has a // NLF_* id. This is used to select the marshaling code. diff --git a/src/vm/mdaBoilerplate.exe.mda.config b/src/vm/mdaBoilerplate.exe.mda.config index c75d7aa..336bef3 100644 --- a/src/vm/mdaBoilerplate.exe.mda.config +++ b/src/vm/mdaBoilerplate.exe.mda.config @@ -929,17 +929,6 @@ ACTIVATION\REPORTING SCENARIOS: --> - - -