}
//
-// MdaMarshaling
-//
-void MdaMarshaling::Initialize(MdaXmlElement* pXmlInput)
-{
- CONTRACTL
- {
- THROWS;
- GC_TRIGGERS;
- MODE_ANY;
- }
- CONTRACTL_END;
-
- m_pMethodFilter = new MdaQuery::CompiledQueries();
- m_pFieldFilter = new MdaQuery::CompiledQueries();
-
- MdaXmlElement* pXmlMethodFilter = pXmlInput->GetChild(MdaElemDecl(MethodFilter));
- if (pXmlMethodFilter)
- MdaQuery::Compile(pXmlMethodFilter, m_pMethodFilter);
-
- MdaXmlElement* pXmlFieldFilter = pXmlInput->GetChild(MdaElemDecl(FieldFilter));
- if (pXmlFieldFilter)
- MdaQuery::Compile(pXmlFieldFilter, m_pFieldFilter);
-}
-
-void MdaMarshaling::ReportFieldMarshal(FieldMarshaler* pFM)
-{
- CONTRACTL
- {
- THROWS;
- GC_TRIGGERS;
- MODE_ANY;
- PRECONDITION(CheckPointer(pFM));
- }
- CONTRACTL_END;
-
- FieldDesc* pFD = pFM->GetFieldDesc();
-
- if (!pFD || !m_pFieldFilter->Test(pFD))
- return;
-
- MdaXmlElement* pXml;
- MdaXmlMessage msg(this->AsMdaAssistant(), FALSE, &pXml);
-
- MdaXmlElement* pField = pXml->AddChild(MdaElemDecl(MarshalingField));
- AsMdaAssistant()->OutputFieldDesc(pFD, pField);
-
- StackSString sszField;
- SString managed;
- SString unmanaged;
-
- GetManagedSideForField(managed, pFD);
- GetUnmanagedSideForField(unmanaged, pFM);
-
- msg.SendMessagef(MDARC_MARSHALING_FIELD, AsMdaAssistant()->ToString(sszField, pFD).GetUnicode(), managed.GetUnicode(), unmanaged.GetUnicode());
-}
-
-
-void MdaMarshaling::GetManagedSideForField(SString& strManagedMarshalType, FieldDesc* pFD)
-{
- CONTRACTL
- {
- THROWS;
- GC_TRIGGERS;
- MODE_ANY;
- }
- CONTRACTL_END;
-
- if (!CheckForPrimitiveType(pFD->GetFieldType(), strManagedMarshalType))
- {
- // The following workaround is added to avoid a recursion caused by calling GetTypeHandle on
- // the m_value field of the UIntPtr class.
- LPCUTF8 szNamespace, szClassName;
- IfFailThrow(pFD->GetMDImport()->GetNameOfTypeDef(pFD->GetApproxEnclosingMethodTable()->GetCl(), &szClassName, &szNamespace));
-
- if (strcmp(szNamespace, "System") == 0 && strcmp(szClassName, "UIntPtr") == 0)
- {
- static LPWSTR strRetVal = W("Void*");
- strManagedMarshalType.Set(strRetVal);
- }
- else
- {
- MetaSig fSig(pFD);
- fSig.NextArgNormalized();
- TypeHandle th = fSig.GetLastTypeHandleNT();
- if (th.IsNull())
- {
- static const WCHAR strErrorMsg[] = W("<error>");
- strManagedMarshalType.Set(strErrorMsg);
- }
- else
- {
- SigFormat sigFmt;
- sigFmt.AddType(th);
- UINT iManagedTypeLen = (UINT)strlen(sigFmt.GetCString()) + 1;
-
- WCHAR* buffer = strManagedMarshalType.OpenUnicodeBuffer(iManagedTypeLen);
- MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, sigFmt.GetCString(), -1, buffer, iManagedTypeLen);
- strManagedMarshalType.CloseBuffer();
- }
- }
- }
-}
-
-void MdaMarshaling::GetUnmanagedSideForField(SString& strUnmanagedMarshalType, FieldMarshaler* pFM)
-{
- CONTRACTL
- {
- THROWS;
- GC_NOTRIGGER;
- MODE_ANY;
- }
- CONTRACTL_END;
-
- NStructFieldTypeToString(pFM, strUnmanagedMarshalType);
-}
-
-
-void MdaMarshaling::GetManagedSideForMethod(SString& strManagedMarshalType, Module* pModule, SigPointer sig, CorElementType elemType)
-{
- CONTRACTL
- {
- THROWS;
- GC_TRIGGERS;
- MODE_ANY;
- }
- CONTRACTL_END;
-
- if (!CheckForPrimitiveType(elemType, strManagedMarshalType))
- {
- // an empty type context is sufficient: all methods should be non-generic
- SigTypeContext emptyTypeContext;
-
- TypeHandle th = sig.GetTypeHandleNT(pModule, &emptyTypeContext);
- if (th.IsNull())
- {
- strManagedMarshalType.Set(W("<error>"));
- }
- else
- {
- SigFormat sigfmt;
- sigfmt.AddType(th);
- UINT iManagedMarshalTypeLength = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, sigfmt.GetCString(), -1, NULL, 0);
-
- WCHAR* str = strManagedMarshalType.OpenUnicodeBuffer(iManagedMarshalTypeLength);
- MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, sigfmt.GetCString(), -1, str, iManagedMarshalTypeLength);
- strManagedMarshalType.CloseBuffer();
- }
- }
-}
-
-
-void MdaMarshaling::GetUnmanagedSideForMethod(SString& strNativeMarshalType, MarshalInfo* mi, BOOL fSizeIsSpecified)
-{
- CONTRACTL
- {
- THROWS;
- GC_TRIGGERS;
- MODE_ANY;
- }
- CONTRACTL_END;
-
- mi->MarshalTypeToString(strNativeMarshalType, fSizeIsSpecified);
-}
-
-BOOL MdaMarshaling::CheckForPrimitiveType(CorElementType elemType, SString& strPrimitiveType)
-{
- CONTRACTL
- {
- THROWS;
- GC_NOTRIGGER;
- MODE_ANY;
- INJECT_FAULT(COMPlusThrowOM());
- }
- CONTRACTL_END;
-
- LPWSTR strRetVal;
-
- switch (elemType)
- {
- case ELEMENT_TYPE_VOID:
- strRetVal = W("Void");
- break;
- case ELEMENT_TYPE_BOOLEAN:
- strRetVal = W("Boolean");
- break;
- case ELEMENT_TYPE_I1:
- strRetVal = W("SByte");
- break;
- case ELEMENT_TYPE_U1:
- strRetVal = W("Byte");
- break;
- case ELEMENT_TYPE_I2:
- strRetVal = W("Int16");
- break;
- case ELEMENT_TYPE_U2:
- strRetVal = W("UInt16");
- break;
- case ELEMENT_TYPE_CHAR:
- strRetVal = W("Char");
- break;
- case ELEMENT_TYPE_I:
- strRetVal = W("IntPtr");
- break;
- case ELEMENT_TYPE_U:
- strRetVal = W("UIntPtr");
- break;
- case ELEMENT_TYPE_I4:
- strRetVal = W("Int32");
- break;
- case ELEMENT_TYPE_U4:
- strRetVal = W("UInt32");
- break;
- case ELEMENT_TYPE_I8:
- strRetVal = W("Int64");
- break;
- case ELEMENT_TYPE_U8:
- strRetVal = W("UInt64");
- break;
- case ELEMENT_TYPE_R4:
- strRetVal = W("Single");
- break;
- case ELEMENT_TYPE_R8:
- strRetVal = W("Double");
- break;
- default:
- return FALSE;
- }
-
- strPrimitiveType.Set(strRetVal);
- return TRUE;
-}
-
-//
// MdaLoaderLock
//
void MdaLoaderLock::ReportViolation(HINSTANCE hInst)