Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions docs/design/specs/Ecma-335-Augments.md
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,12 @@ The text should be deleted:

> Furthermore, ~~the InterfaceImpl table is sorted using the Interface column as a secondary key, and~~ the GenericParam table is sorted using the Number column as a secondary key.

In addition to the TypeDef table having a special ordering constraint, the ExportedTypes table ALSO has the same constraint.

This line should be changed.

> Finally, this TypeDef _and ExportedType_ ~~table has~~ _tables have_ a special ordering constraint: the definition of an enclosing class shall precede the definition of all classes it encloses.

## Module Initializer

All modules may have a module initializer. A module initializer is defined as the type initializer (§ II.10.5.3) of the `<Module>` type (§ II.10.8).
Expand Down
110 changes: 107 additions & 3 deletions src/coreclr/ildasm/dasm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,14 @@ DECLARE_NATIVE_STRING_RESOURCE_TABLE(NATIVE_STRING_RESOURCE_NAME);

#include "mdfileformat.h"

//*****************************************
// look up function for TypeDef
//*****************************************
HRESULT FindTypeDef(IMDInternalImport *pImport,
LPCSTR szNamespace, // [IN] Namespace for the TypeDef.
LPCSTR szName, // [IN] Name of the TypeDef.
mdToken tkEnclosingClass, // [IN] TypeRef/TypeDef Token for the enclosing class.
mdTypeDef *ptypedef); // [IN] return typedef

struct MIDescriptor
{
Expand Down Expand Up @@ -471,7 +479,7 @@ HRESULT IsClassRefInScope(mdTypeRef classref)
MAKE_NAME_IF_NONE(pszClassName,classref);
IfFailRet(g_pImport->GetResolutionScopeOfTypeRef(classref, &tkRes));

hr = g_pImport->FindTypeDef(pszNameSpace, pszClassName,
hr = FindTypeDef(g_pImport, pszNameSpace, pszClassName,
(TypeFromToken(tkRes) == mdtTypeRef) ? tkRes : mdTokenNil, &classdef);

return hr;
Expand Down Expand Up @@ -1337,7 +1345,7 @@ mdToken ResolveTypeDefReflectionNotation(IMDInternalImport *pIMDI,
szNamespace = "";
szName = pch+1;
}
if(SUCCEEDED(pIMDI->FindTypeDef(szNamespace,szName,tkEncloser,&tk)))
if(SUCCEEDED(FindTypeDef(pIMDI, szNamespace,szName,tkEncloser,&tk)))
return tk;
else
return 0;
Expand Down Expand Up @@ -1599,7 +1607,7 @@ mdToken TypeRefToTypeDef(mdToken tk, IMDInternalImport *pIMDI, IMDInternalImport
goto AssignAndReturn;
}

if (FAILED((*ppIMDInew)->FindTypeDef(szNamespace,szName,tkEncloser,&tkTypeDef)))
if (FAILED(FindTypeDef(*ppIMDInew, szNamespace,szName,tkEncloser,&tkTypeDef)))
{
tkTypeDef = mdTypeDefNil;
}
Expand Down Expand Up @@ -7820,6 +7828,102 @@ BOOL DumpFile()
pMetaDataDispenser->Release();
return fSuccess;
}

//*****************************************************************************
// Given a classname, return the typedef
//*****************************************************************************
HRESULT
FindTypeDef(
IMDInternalImport *pImport,
LPCSTR szTypeDefNamespace, // [IN] Namespace for the TypeDef.
LPCSTR szTypeDefName, // [IN] Name of the TypeDef.
mdToken tkEnclosingClass, // [IN] TypeDef/TypeRef of enclosing class.
mdTypeDef * ptkTypeDef) // [OUT] return typedef
{
HRESULT hr = S_OK;

_ASSERTE((szTypeDefName != NULL) && (ptkTypeDef != NULL));
_ASSERTE((TypeFromToken(tkEnclosingClass) == mdtTypeRef) ||
(TypeFromToken(tkEnclosingClass) == mdtTypeDef) ||
IsNilToken(tkEnclosingClass));

// initialize the output parameter
*ptkTypeDef = mdTypeDefNil;

// Treat no namespace as empty string.
if (szTypeDefNamespace == NULL)
szTypeDefNamespace = "";

// Do a linear search
HENUMInternal typeDefEnum;

LPCSTR szName;
LPCSTR szNamespace;
DWORD dwFlags;

// Get TypeDef of the tkEnclosingClass passed in
if (TypeFromToken(tkEnclosingClass) == mdtTypeRef)
{
mdToken tkResolutionScope;
IfFailRet(pImport->GetResolutionScopeOfTypeRef(tkEnclosingClass, &tkResolutionScope));
IfFailRet(pImport->GetNameOfTypeRef(tkEnclosingClass, &szNamespace, &szName));

// Update tkEnclosingClass to TypeDef
IfFailRet(FindTypeDef(
pImport,
szNamespace,
szName,
(TypeFromToken(tkResolutionScope) == mdtTypeRef) ? tkResolutionScope : mdTokenNil,
&tkEnclosingClass));
_ASSERTE(TypeFromToken(tkEnclosingClass) == mdtTypeDef);
}

// Search for the TypeDef
IfFailRet(pImport->EnumTypeDefInit(&typeDefEnum));
mdTypeDef td;

while (pImport->EnumNext(&typeDefEnum, &td))
{
IfFailRet(pImport->GetTypeDefProps(td, &dwFlags, NULL));

if (!IsTdNested(dwFlags) && !IsNilToken(tkEnclosingClass))
{
// If the class is not Nested and EnclosingClass passed in is not nil
continue;
}
else if (IsTdNested(dwFlags) && IsNilToken(tkEnclosingClass))
{
// If the class is nested and EnclosingClass passed is nil
continue;
}
else if (!IsNilToken(tkEnclosingClass))
{
_ASSERTE(TypeFromToken(tkEnclosingClass) == mdtTypeDef);
mdTypeDef tkEnclosingClassTmp;
HRESULT hr = pImport->GetNestedClassProps(td, &tkEnclosingClassTmp);
if (hr == CLDB_E_RECORD_NOTFOUND)
continue; // td is not nested
IfFailRet(hr); // All other failure HRESULTS result in this function failing

if (tkEnclosingClass != tkEnclosingClassTmp)
continue;
}

IfFailRet(pImport->GetNameOfTypeDef(td, &szName, &szNamespace));

if (strcmp(szTypeDefName, szName) == 0)
{
if (strcmp(szTypeDefNamespace, szNamespace) == 0)
{
*ptkTypeDef = td;
return S_OK;
}
}
}
// Cannot find the TypeDef by name
return CLDB_E_RECORD_NOTFOUND;
} // FindTypeDef

#ifdef _PREFAST_
#pragma warning(pop)
#endif
Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/inc/corhlprpriv.h
Original file line number Diff line number Diff line change
Expand Up @@ -294,9 +294,9 @@ class CQuickMemoryBase
}

// Copy single byte string and hold it
const char * SetStringNoThrow(const char * pStr, SIZE_T len)
const char * SetString(const char * pStr, SIZE_T len)
{
LPSTR buffer = (LPSTR) AllocNoThrow(len + 1);
LPSTR buffer = (LPSTR) AllocThrows(len + 1);

if (buffer != NULL)
{
Expand Down
10 changes: 0 additions & 10 deletions src/coreclr/inc/metadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -676,16 +676,6 @@ DECLARE_INTERFACE_(IMDInternalImport, IUnknown)
mdInterfaceImpl iiImpl, // given a interfaceimpl
mdToken *ptkType) PURE;

//*****************************************
// look up function for TypeDef
//*****************************************
__checkReturn
STDMETHOD(FindTypeDef)(
LPCSTR szNamespace, // [IN] Namespace for the TypeDef.
LPCSTR szName, // [IN] Name of the TypeDef.
mdToken tkEnclosingClass, // [IN] TypeRef/TypeDef Token for the enclosing class.
mdTypeDef *ptypedef) PURE; // [IN] return typedef

//*****************************************
// return name and sig of a memberref
//*****************************************
Expand Down
25 changes: 0 additions & 25 deletions src/coreclr/md/enc/mdinternalrw.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2633,31 +2633,6 @@ HRESULT MDInternalRW::GetMethodSpecProps( // S_OK or error.
return hr;
} // MDInternalRW::GetMethodSpecProps

//*****************************************************************************
// Given a classname, return the typedef
//*****************************************************************************
__checkReturn
HRESULT MDInternalRW::FindTypeDef( // return hresult
LPCSTR szNamespace, // [IN] Namespace for the TypeDef.
LPCSTR szName, // [IN] Name of the TypeDef.
mdToken tkEnclosingClass, // [IN] TypeDef/TypeRef of enclosing class.
mdTypeDef *ptypedef) // [OUT] return typedef
{
HRESULT hr = S_OK;
LOCKREADIFFAILRET();

_ASSERTE(ptypedef);

// initialize the output parameter
*ptypedef = mdTypeDefNil;

return ImportHelper::FindTypeDefByName(&(m_pStgdb->m_MiniMd),
szNamespace,
szName,
tkEnclosingClass,
ptypedef);
} // MDInternalRW::FindTypeDef

//*****************************************************************************
// Given a memberref, return a pointer to memberref's name and signature
//*****************************************************************************
Expand Down
17 changes: 0 additions & 17 deletions src/coreclr/md/inc/mdinternalrw.h
Original file line number Diff line number Diff line change
Expand Up @@ -417,23 +417,6 @@ class MDInternalRW : public IMDInternalImportENC, public IMDCommon
PCCOR_SIGNATURE *ppvSigBlob, // [OUT] point to the blob value of meta data
ULONG *pcbSigBlob); // [OUT] actual size of signature blob

//*****************************************
// look up function for TypeDef
//*****************************************
__checkReturn
STDMETHODIMP FindTypeDef(
LPCSTR szNamespace, // [IN] Namespace for the TypeDef.
LPCSTR szName, // [IN] Name of the TypeDef.
mdToken tkEnclosingClass, // [IN] TypeDef/TypeRef of enclosing class.
mdTypeDef *ptypedef); // [OUT] return typedef

__checkReturn
STDMETHODIMP FindTypeDefByGUID(
REFGUID guid, // guid to look up
mdTypeDef *ptypedef); // return typedef



//*****************************************
// return name and sig of a memberref
//*****************************************
Expand Down
106 changes: 1 addition & 105 deletions src/coreclr/md/runtime/mdinternalro.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1696,111 +1696,7 @@ HRESULT MDInternalRO::GetMethodSpecProps( // S_OK or error.


return hr;
} // MDInternalRO::GetMethodSpecProps



//*****************************************************************************
// Given a classname, return the typedef
//*****************************************************************************
__checkReturn
HRESULT
MDInternalRO::FindTypeDef(
LPCSTR szTypeDefNamespace, // [IN] Namespace for the TypeDef.
LPCSTR szTypeDefName, // [IN] Name of the TypeDef.
mdToken tkEnclosingClass, // [IN] TypeDef/TypeRef of enclosing class.
mdTypeDef * ptkTypeDef) // [OUT] return typedef
{
HRESULT hr = S_OK;

_ASSERTE((szTypeDefName != NULL) && (ptkTypeDef != NULL));
_ASSERTE((TypeFromToken(tkEnclosingClass) == mdtTypeRef) ||
(TypeFromToken(tkEnclosingClass) == mdtTypeDef) ||
IsNilToken(tkEnclosingClass));

// initialize the output parameter
*ptkTypeDef = mdTypeDefNil;

// Treat no namespace as empty string.
if (szTypeDefNamespace == NULL)
szTypeDefNamespace = "";

// Do a linear search
ULONG cTypeDefRecs = m_LiteWeightStgdb.m_MiniMd.getCountTypeDefs();
TypeDefRec * pTypeDefRec;
LPCUTF8 szName;
LPCUTF8 szNamespace;
DWORD dwFlags;

// Get TypeDef of the tkEnclosingClass passed in
if (TypeFromToken(tkEnclosingClass) == mdtTypeRef)
{
TypeRefRec * pTypeRefRec;
mdToken tkResolutionScope;

IfFailRet(m_LiteWeightStgdb.m_MiniMd.GetTypeRefRecord(RidFromToken(tkEnclosingClass), &pTypeRefRec));
tkResolutionScope = m_LiteWeightStgdb.m_MiniMd.getResolutionScopeOfTypeRef(pTypeRefRec);
IfFailRet(m_LiteWeightStgdb.m_MiniMd.getNamespaceOfTypeRef(pTypeRefRec, &szNamespace));
IfFailRet(m_LiteWeightStgdb.m_MiniMd.getNameOfTypeRef(pTypeRefRec, &szName));

// Update tkEnclosingClass to TypeDef
IfFailRet(FindTypeDef(
szNamespace,
szName,
(TypeFromToken(tkResolutionScope) == mdtTypeRef) ? tkResolutionScope : mdTokenNil,
&tkEnclosingClass));
_ASSERTE(TypeFromToken(tkEnclosingClass) == mdtTypeDef);
}

// Search for the TypeDef
for (ULONG i = 1; i <= cTypeDefRecs; i++)
{
IfFailRet(m_LiteWeightStgdb.m_MiniMd.GetTypeDefRecord(i, &pTypeDefRec));

dwFlags = m_LiteWeightStgdb.m_MiniMd.getFlagsOfTypeDef(pTypeDefRec);

if (!IsTdNested(dwFlags) && !IsNilToken(tkEnclosingClass))
{
// If the class is not Nested and EnclosingClass passed in is not nil
continue;
}
else if (IsTdNested(dwFlags) && IsNilToken(tkEnclosingClass))
{
// If the class is nested and EnclosingClass passed is nil
continue;
}
else if (!IsNilToken(tkEnclosingClass))
{
_ASSERTE(TypeFromToken(tkEnclosingClass) == mdtTypeDef);

RID iNestedClassRec;
NestedClassRec * pNestedClassRec;
mdTypeDef tkEnclosingClassTmp;

IfFailRet(m_LiteWeightStgdb.m_MiniMd.FindNestedClassFor(i, &iNestedClassRec));
if (InvalidRid(iNestedClassRec))
continue;
IfFailRet(m_LiteWeightStgdb.m_MiniMd.GetNestedClassRecord(iNestedClassRec, &pNestedClassRec));
tkEnclosingClassTmp = m_LiteWeightStgdb.m_MiniMd.getEnclosingClassOfNestedClass(pNestedClassRec);
if (tkEnclosingClass != tkEnclosingClassTmp)
continue;
}

IfFailRet(m_LiteWeightStgdb.m_MiniMd.getNameOfTypeDef(pTypeDefRec, &szName));
if (strcmp(szTypeDefName, szName) == 0)
{
IfFailRet(m_LiteWeightStgdb.m_MiniMd.getNamespaceOfTypeDef(pTypeDefRec, &szNamespace));
if (strcmp(szTypeDefNamespace, szNamespace) == 0)
{
*ptkTypeDef = TokenFromRid(i, mdtTypeDef);
return S_OK;
}
}
}
// Cannot find the TypeDef by name
return CLDB_E_RECORD_NOTFOUND;
} // MDInternalRO::FindTypeDef

} // MDInternalRO::GetMethodSpecPropsk
//*****************************************************************************
// Given a memberref, return a pointer to memberref's name and signature
//*****************************************************************************
Expand Down
17 changes: 0 additions & 17 deletions src/coreclr/md/runtime/mdinternalro.h
Original file line number Diff line number Diff line change
Expand Up @@ -404,23 +404,6 @@ class MDInternalRO : public IMDInternalImport, IMDCommon
PCCOR_SIGNATURE *ppvSigBlob, // [OUT] point to the blob value of meta data
ULONG *pcbSigBlob); // [OUT] actual size of signature blob

//*****************************************
// look up function for TypeDef
//*****************************************
__checkReturn
STDMETHODIMP FindTypeDef(
LPCSTR szNamespace, // [IN] Namespace for the TypeDef.
LPCSTR szName, // [IN] Name of the TypeDef.
mdToken tkEnclosingClass, // [IN] TypeDef/TypeRef of enclosing class.
mdTypeDef *ptypedef); // [OUT] return typedef

__checkReturn
STDMETHODIMP FindTypeDefByGUID(
REFGUID guid, // guid to look up
mdTypeDef *ptypedef); // return typedef



//*****************************************
// return name and sig of a memberref
//*****************************************
Expand Down
Loading