Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/runtime.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Deseyn <tom.deseyn@gmail.com>2021-04-01 16:56:14 +0300
committerGitHub <noreply@github.com>2021-04-01 16:56:14 +0300
commit18f9a0712f4b73b2b97a19d52cddb9603731cd55 (patch)
treecdc3bb41680e07a0718987429c52b7c021a286cf /src/coreclr/md
parentaf5eae3c87db470b6e1352ed637869ec5b7e110a (diff)
Free temporary enums on failure (#50471)
* Free temporary enums on failure * PR feedback
Diffstat (limited to 'src/coreclr/md')
-rw-r--r--src/coreclr/md/compiler/assemblymd.cpp8
-rw-r--r--src/coreclr/md/compiler/custattr_import.cpp8
-rw-r--r--src/coreclr/md/compiler/import.cpp123
-rw-r--r--src/coreclr/md/compiler/regmeta_import.cpp53
4 files changed, 107 insertions, 85 deletions
diff --git a/src/coreclr/md/compiler/assemblymd.cpp b/src/coreclr/md/compiler/assemblymd.cpp
index d778c636722..759c7dc69d8 100644
--- a/src/coreclr/md/compiler/assemblymd.cpp
+++ b/src/coreclr/md/compiler/assemblymd.cpp
@@ -444,7 +444,7 @@ STDMETHODIMP RegMeta::EnumExportedTypes( // S_OK or error
BEGIN_ENTRYPOINT_NOTHROW;
HENUMInternal **ppmdEnum = reinterpret_cast<HENUMInternal **> (phEnum);
- HENUMInternal *pEnum;
+ HENUMInternal *pEnum = NULL;
LOG((LOGMD, "MD RegMeta::EnumExportedTypes(%#08x, %#08x, %#08x, %#08x)\n",
phEnum, rExportedTypes, cMax, pcTokens));
@@ -488,14 +488,14 @@ STDMETHODIMP RegMeta::EnumExportedTypes( // S_OK or error
// set the output parameter.
*ppmdEnum = pEnum;
+ pEnum = NULL;
}
- else
- pEnum = *ppmdEnum;
// we can only fill the minimum of what the caller asked for or what we have left.
- IfFailGo(HENUMInternal::EnumWithCount(pEnum, cMax, rExportedTypes, pcTokens));
+ IfFailGo(HENUMInternal::EnumWithCount(*ppmdEnum, cMax, rExportedTypes, pcTokens));
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
STOP_MD_PERF(EnumExportedTypes);
END_ENTRYPOINT_NOTHROW;
diff --git a/src/coreclr/md/compiler/custattr_import.cpp b/src/coreclr/md/compiler/custattr_import.cpp
index cc38921992e..ec05e2663df 100644
--- a/src/coreclr/md/compiler/custattr_import.cpp
+++ b/src/coreclr/md/compiler/custattr_import.cpp
@@ -108,7 +108,7 @@ STDMETHODIMP RegMeta::EnumCustomAttributes(
HENUMInternal **ppmdEnum = reinterpret_cast<HENUMInternal **> (phEnum);
RID ridStart;
RID ridEnd;
- HENUMInternal *pEnum = *ppmdEnum;
+ HENUMInternal *pEnum = NULL;
CustomAttributeRec *pRec;
ULONG index;
@@ -117,7 +117,7 @@ STDMETHODIMP RegMeta::EnumCustomAttributes(
START_MD_PERF();
LOCKREAD();
- if ( pEnum == 0 )
+ if ( *ppmdEnum == 0 )
{
// instantiating a new ENUM
CMiniMdRW *pMiniMd = &(m_pStgdb->m_MiniMd);
@@ -220,13 +220,15 @@ STDMETHODIMP RegMeta::EnumCustomAttributes(
// set the output parameter
*ppmdEnum = pEnum;
+ pEnum = NULL;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMax, rCustomAttributes, pcCustomAttributes);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMax, rCustomAttributes, pcCustomAttributes);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
STOP_MD_PERF(EnumCustomAttributes);
END_ENTRYPOINT_NOTHROW;
diff --git a/src/coreclr/md/compiler/import.cpp b/src/coreclr/md/compiler/import.cpp
index c0abc8f7f63..6559b2b31e9 100644
--- a/src/coreclr/md/compiler/import.cpp
+++ b/src/coreclr/md/compiler/import.cpp
@@ -44,7 +44,7 @@ STDMETHODIMP RegMeta::EnumMembers( // S_OK, S_FALSE, or error.
RID index;
RID indexField;
TypeDefRec *pRec;
- HENUMInternal *pEnum = *ppmdEnum;
+ HENUMInternal *pEnum = NULL;
LOG((LOGMD, "MD RegMeta::EnumMembers(0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x)\n",
phEnum, cl, rMembers, cMax, pcTokens));
@@ -52,7 +52,7 @@ STDMETHODIMP RegMeta::EnumMembers( // S_OK, S_FALSE, or error.
START_MD_PERF();
LOCKREAD();
- if ( pEnum == 0 )
+ if ( *ppmdEnum == 0 )
{
// instantiating a new ENUM
CMiniMdRW *pMiniMd = &(m_pStgdb->m_MiniMd);
@@ -95,13 +95,15 @@ STDMETHODIMP RegMeta::EnumMembers( // S_OK, S_FALSE, or error.
// set the output parameter
*ppmdEnum = pEnum;
+ pEnum = NULL;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMax, rMembers, pcTokens);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMax, rMembers, pcTokens);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
STOP_MD_PERF(EnumMembers);
@@ -132,7 +134,7 @@ STDMETHODIMP RegMeta::EnumMembersWithName( // S_OK, S_FALSE, or error.
TypeDefRec *pRec;
MethodRec *pMethod;
FieldRec *pField;
- HENUMInternal *pEnum = *ppmdEnum;
+ HENUMInternal *pEnum = NULL;
LPUTF8 szNameUtf8;
UTF8STR(szName, szNameUtf8);
LPCUTF8 szNameUtf8Tmp;
@@ -143,7 +145,7 @@ STDMETHODIMP RegMeta::EnumMembersWithName( // S_OK, S_FALSE, or error.
START_MD_PERF();
LOCKREAD();
- if ( pEnum == 0 )
+ if ( *ppmdEnum == 0 )
{
// instantiating a new ENUM
CMiniMdRW *pMiniMd = &(m_pStgdb->m_MiniMd);
@@ -214,13 +216,15 @@ STDMETHODIMP RegMeta::EnumMembersWithName( // S_OK, S_FALSE, or error.
// set the output parameter
*ppmdEnum = pEnum;
+ pEnum = NULL;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMax, rMembers, pcTokens);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMax, rMembers, pcTokens);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
STOP_MD_PERF(EnumMembersWithName);
END_ENTRYPOINT_NOTHROW;
@@ -246,7 +250,7 @@ STDMETHODIMP RegMeta::EnumMethods(
RID ridStart;
RID ridEnd;
TypeDefRec *pRec;
- HENUMInternal *pEnum = *ppmdEnum;
+ HENUMInternal *pEnum = NULL;
LOG((LOGMD, "MD RegMeta::EnumMethods(0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x)\n",
phEnum, td, rMethods, cMax, pcTokens));
@@ -256,7 +260,7 @@ STDMETHODIMP RegMeta::EnumMethods(
START_MD_PERF();
LOCKREAD();
- if ( pEnum == 0 )
+ if ( *ppmdEnum == 0 )
{
// instantiating a new ENUM
CMiniMdRW *pMiniMd = &(m_pStgdb->m_MiniMd);
@@ -308,13 +312,15 @@ STDMETHODIMP RegMeta::EnumMethods(
// set the output parameter
*ppmdEnum = pEnum;
+ pEnum = NULL;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMax, rMethods, pcTokens);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMax, rMethods, pcTokens);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
STOP_MD_PERF(EnumMethods);
END_ENTRYPOINT_NOTHROW;
@@ -346,7 +352,7 @@ STDMETHODIMP RegMeta::EnumMethodsWithName( // S_OK, S_FALSE, or error.
RID index;
TypeDefRec *pRec;
MethodRec *pMethod;
- HENUMInternal *pEnum = *ppmdEnum;
+ HENUMInternal *pEnum = NULL;
LPUTF8 szNameUtf8;
UTF8STR(szName, szNameUtf8);
LPCUTF8 szNameUtf8Tmp;
@@ -360,7 +366,7 @@ STDMETHODIMP RegMeta::EnumMethodsWithName( // S_OK, S_FALSE, or error.
LOCKREAD();
- if ( pEnum == 0 )
+ if ( *ppmdEnum == 0 )
{
// instantiating a new ENUM
CMiniMdRW *pMiniMd = &(m_pStgdb->m_MiniMd);
@@ -410,13 +416,15 @@ STDMETHODIMP RegMeta::EnumMethodsWithName( // S_OK, S_FALSE, or error.
// set the output parameter
*ppmdEnum = pEnum;
+ pEnum = NULL;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMax, rMethods, pcTokens);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMax, rMethods, pcTokens);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
STOP_MD_PERF(EnumMethodsWithName);
END_ENTRYPOINT_NOTHROW;
@@ -445,7 +453,7 @@ RegMeta::EnumFields(
RID ridStart;
RID ridEnd;
TypeDefRec *pRec;
- HENUMInternal *pEnum = *ppmdEnum;
+ HENUMInternal *pEnum = NULL;
LOG((LOGMD, "MD RegMeta::EnumFields(0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x)\n",
phEnum, td, rFields, cMax, pcTokens));
@@ -453,7 +461,7 @@ RegMeta::EnumFields(
START_MD_PERF();
LOCKREAD();
- if (pEnum == NULL)
+ if (*ppmdEnum == NULL)
{
// instantiating a new ENUM
CMiniMdRW *pMiniMd = &(m_pStgdb->m_MiniMd);
@@ -505,13 +513,15 @@ RegMeta::EnumFields(
// set the output parameter
*ppmdEnum = pEnum;
+ pEnum = NULL;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMax, rFields, pcTokens);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMax, rFields, pcTokens);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
STOP_MD_PERF(EnumFields);
END_ENTRYPOINT_NOTHROW;
@@ -542,7 +552,7 @@ STDMETHODIMP RegMeta::EnumFieldsWithName( // S_OK, S_FALSE, or error.
ULONG index;
TypeDefRec *pRec;
FieldRec *pField;
- HENUMInternal *pEnum = *ppmdEnum;
+ HENUMInternal *pEnum = NULL;
LPUTF8 szNameUtf8;
UTF8STR(szName, szNameUtf8);
LPCUTF8 szNameUtf8Tmp;
@@ -555,7 +565,7 @@ STDMETHODIMP RegMeta::EnumFieldsWithName( // S_OK, S_FALSE, or error.
START_MD_PERF();
LOCKREAD();
- if ( pEnum == 0 )
+ if ( *ppmdEnum == 0 )
{
// instantiating a new ENUM
CMiniMdRW *pMiniMd = &(m_pStgdb->m_MiniMd);
@@ -604,13 +614,15 @@ STDMETHODIMP RegMeta::EnumFieldsWithName( // S_OK, S_FALSE, or error.
// set the output parameter
*ppmdEnum = pEnum;
+ pEnum = NULL;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMax, rFields, pcTokens);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMax, rFields, pcTokens);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
STOP_MD_PERF(EnumFieldsWithName);
END_ENTRYPOINT_NOTHROW;
@@ -637,7 +649,7 @@ STDMETHODIMP RegMeta::EnumParams( // S_OK, S_FALSE, or error.
RID ridStart;
RID ridEnd;
MethodRec *pRec;
- HENUMInternal *pEnum = *ppmdEnum;
+ HENUMInternal *pEnum = NULL;
LOG((LOGMD, "MD RegMeta::EnumParams(0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x)\n",
phEnum, mb, rParams, cMax, pcTokens));
@@ -645,7 +657,7 @@ STDMETHODIMP RegMeta::EnumParams( // S_OK, S_FALSE, or error.
LOCKREAD();
- if ( pEnum == 0 )
+ if ( *ppmdEnum == 0 )
{
// instantiating a new ENUM
CMiniMdRW *pMiniMd = &(m_pStgdb->m_MiniMd);
@@ -674,13 +686,15 @@ STDMETHODIMP RegMeta::EnumParams( // S_OK, S_FALSE, or error.
// set the output parameter
*ppmdEnum = pEnum;
+ pEnum = NULL;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMax, rParams, pcTokens);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMax, rParams, pcTokens);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
STOP_MD_PERF(EnumParams);
END_ENTRYPOINT_NOTHROW;
@@ -708,7 +722,7 @@ STDMETHODIMP RegMeta::EnumMemberRefs( // S_OK, S_FALSE, or error.
ULONG ridEnd;
ULONG index;
MemberRefRec *pRec;
- HENUMInternal *pEnum = *ppmdEnum;
+ HENUMInternal *pEnum = NULL;
LOG((LOGMD, "MD RegMeta::EnumMemberRefs(0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x)\n",
phEnum, tkParent, rMemberRefs, cMax, pcTokens));
@@ -718,7 +732,7 @@ STDMETHODIMP RegMeta::EnumMemberRefs( // S_OK, S_FALSE, or error.
START_MD_PERF();
LOCKREAD();
- if ( pEnum == 0 )
+ if ( *ppmdEnum == 0 )
{
// instantiating a new ENUM
CMiniMdRW *pMiniMd = &(m_pStgdb->m_MiniMd);
@@ -748,13 +762,15 @@ STDMETHODIMP RegMeta::EnumMemberRefs( // S_OK, S_FALSE, or error.
// set the output parameter
*ppmdEnum = pEnum;
+ *ppmdEnum = 0;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMax, rMemberRefs, pcTokens);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMax, rMemberRefs, pcTokens);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
STOP_MD_PERF(EnumMemberRefs);
@@ -781,7 +797,7 @@ STDMETHODIMP RegMeta::EnumMethodImpls( // S_OK, S_FALSE, or error
HENUMInternal **ppmdEnum = reinterpret_cast<HENUMInternal **> (phEnum);
MethodImplRec *pRec;
- HENUMInternal *pEnum = *ppmdEnum;
+ HENUMInternal *pEnum = NULL;
HENUMInternal hEnum;
@@ -795,7 +811,7 @@ STDMETHODIMP RegMeta::EnumMethodImpls( // S_OK, S_FALSE, or error
HENUMInternal::ZeroEnum(&hEnum);
- if ( pEnum == 0 )
+ if ( *ppmdEnum == 0 )
{
// instantiating a new ENUM
CMiniMdRW *pMiniMd = &(m_pStgdb->m_MiniMd);
@@ -824,13 +840,15 @@ STDMETHODIMP RegMeta::EnumMethodImpls( // S_OK, S_FALSE, or error
// set the output parameter
*ppmdEnum = pEnum;
+ pEnum = NULL;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMax, rMethodBody, rMethodDecl, pcTokens);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMax, rMethodBody, rMethodDecl, pcTokens);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
HENUMInternal::ClearEnum(&hEnum);
STOP_MD_PERF(EnumMethodImpls);
@@ -861,7 +879,7 @@ STDMETHODIMP RegMeta::EnumPermissionSets( // S_OK, S_FALSE, or error.
RID ridEnd;
RID index;
DeclSecurityRec *pRec;
- HENUMInternal *pEnum = *ppmdEnum;
+ HENUMInternal *pEnum = NULL;
bool fCompareParent = false;
mdToken typ = TypeFromToken(tk);
mdToken tkParent;
@@ -872,7 +890,7 @@ STDMETHODIMP RegMeta::EnumPermissionSets( // S_OK, S_FALSE, or error.
START_MD_PERF();
LOCKREAD();
- if ( pEnum == 0 )
+ if ( *ppmdEnum == 0 )
{
// Does this token type even have security?
if (tk != 0 &&
@@ -943,13 +961,15 @@ STDMETHODIMP RegMeta::EnumPermissionSets( // S_OK, S_FALSE, or error.
// set the output parameter
*ppmdEnum = pEnum;
+ pEnum = NULL;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMax, rPermission, pcTokens);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMax, rPermission, pcTokens);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
STOP_MD_PERF(EnumPermissionSets);
END_ENTRYPOINT_NOTHROW;
@@ -1317,7 +1337,7 @@ STDMETHODIMP RegMeta::EnumProperties( // S_OK, S_FALSE, or error.
RID ridStart = 0;
RID ridEnd = 0;
RID ridMax = 0;
- HENUMInternal *pEnum = *ppmdEnum;
+ HENUMInternal *pEnum = NULL;
LOG((LOGMD, "MD RegMeta::EnumProperties(0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x)\n",
phEnum, td, rProperties, cMax, pcProperties));
@@ -1336,7 +1356,7 @@ STDMETHODIMP RegMeta::EnumProperties( // S_OK, S_FALSE, or error.
_ASSERTE(TypeFromToken(td) == mdtTypeDef);
- if ( pEnum == 0 )
+ if ( *ppmdEnum == 0 )
{
// instantiating a new ENUM
CMiniMdRW *pMiniMd = &(m_pStgdb->m_MiniMd);
@@ -1391,13 +1411,15 @@ STDMETHODIMP RegMeta::EnumProperties( // S_OK, S_FALSE, or error.
// set the output parameter
*ppmdEnum = pEnum;
+ pEnum = NULL;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMax, rProperties, pcProperties);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMax, rProperties, pcProperties);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
STOP_MD_PERF(EnumProperties);
@@ -1426,7 +1448,7 @@ STDMETHODIMP RegMeta::EnumEvents( // S_OK, S_FALSE, or error.
RID ridStart = 0;
RID ridEnd = 0;
RID ridMax = 0;
- HENUMInternal *pEnum = *ppmdEnum;
+ HENUMInternal *pEnum = NULL;
LOG((LOGMD, "MD RegMeta::EnumEvents(0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x)\n",
phEnum, td, rEvents, cMax, pcEvents));
@@ -1437,7 +1459,7 @@ STDMETHODIMP RegMeta::EnumEvents( // S_OK, S_FALSE, or error.
_ASSERTE(TypeFromToken(td) == mdtTypeDef);
- if ( pEnum == 0 )
+ if ( *ppmdEnum == 0 )
{
// instantiating a new ENUM
CMiniMdRW *pMiniMd = &(m_pStgdb->m_MiniMd);
@@ -1492,14 +1514,15 @@ STDMETHODIMP RegMeta::EnumEvents( // S_OK, S_FALSE, or error.
// set the output parameter
*ppmdEnum = pEnum;
+ pEnum = NULL;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMax, rEvents, pcEvents);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMax, rEvents, pcEvents);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
-
+ HENUMInternal::DestroyEnum(pEnum);
STOP_MD_PERF(EnumEvents);
END_ENTRYPOINT_NOTHROW;
@@ -1638,7 +1661,7 @@ STDMETHODIMP RegMeta::EnumMethodSemantics( // S_OK, S_FALSE, or error.
HENUMInternal **ppmdEnum = reinterpret_cast<HENUMInternal **> (phEnum);
ULONG ridEnd;
ULONG index;
- HENUMInternal *pEnum = *ppmdEnum;
+ HENUMInternal *pEnum = NULL;
MethodSemanticsRec *pRec;
LOG((LOGMD, "MD RegMeta::EnumMethodSemantics(0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x)\n",
@@ -1648,7 +1671,7 @@ STDMETHODIMP RegMeta::EnumMethodSemantics( // S_OK, S_FALSE, or error.
LOCKREAD();
- if ( pEnum == 0 )
+ if ( *ppmdEnum == 0 )
{
// instantiating a new ENUM
CMiniMdRW *pMiniMd = &(m_pStgdb->m_MiniMd);
@@ -1670,14 +1693,15 @@ STDMETHODIMP RegMeta::EnumMethodSemantics( // S_OK, S_FALSE, or error.
// set the output parameter
*ppmdEnum = pEnum;
+ pEnum = NULL;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMax, rEventProp, pcEventProp);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMax, rEventProp, pcEventProp);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
-
+ HENUMInternal::DestroyEnum(pEnum);
STOP_MD_PERF(EnumMethodSemantics);
END_ENTRYPOINT_NOTHROW;
@@ -2298,7 +2322,7 @@ STDMETHODIMP RegMeta::EnumUnresolvedMethods( // S_OK or error.
uint32_t index; // For counting methods on a TypeDef.
uint32_t indexTypeDef; // For counting TypeDefs.
bool bIsInterface; // Is a given TypeDef an interface?
- HENUMInternal * pEnum = *ppmdEnum; // Enum we're working with.
+ HENUMInternal * pEnum = NULL; // Enum we're working with.
CMiniMdRW * pMiniMd = &(m_pStgdb->m_MiniMd);
LOG((LOGMD, "MD RegMeta::EnumUnresolvedMethods(0x%08x, 0x%08x, 0x%08x, 0x%08x)\n",
@@ -2310,7 +2334,7 @@ STDMETHODIMP RegMeta::EnumUnresolvedMethods( // S_OK or error.
// same time. Ref to Def map may be calculated incorrectly.
LOCKWRITE();
- if ( pEnum == 0 )
+ if ( *ppmdEnum == 0 )
{
// instantiating a new ENUM
MethodRec *pMethodRec;
@@ -2403,13 +2427,15 @@ STDMETHODIMP RegMeta::EnumUnresolvedMethods( // S_OK or error.
// set the output parameter
*ppmdEnum = pEnum;
+ pEnum = NULL;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMax, rMethods, pcTokens);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMax, rMethods, pcTokens);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
STOP_MD_PERF(EnumUnresolvedMethods);
END_ENTRYPOINT_NOTHROW;
@@ -2664,7 +2690,7 @@ STDMETHODIMP RegMeta::EnumUserStrings( // S_OK or error.
BEGIN_ENTRYPOINT_NOTHROW;
HENUMInternal **ppEnum = reinterpret_cast<HENUMInternal **> (phEnum);
- HENUMInternal *pEnum = *ppEnum;
+ HENUMInternal *pEnum = NULL;
LOG((LOGMD, "MD RegMeta::EnumUserStrings(0x%08x, 0x%08x, 0x%08x, 0x%08x)\n",
phEnum, rStrings, cmax, pcStrings));
@@ -2672,7 +2698,7 @@ STDMETHODIMP RegMeta::EnumUserStrings( // S_OK or error.
START_MD_PERF();
LOCKREAD();
- if (pEnum == NULL)
+ if (*ppEnum == NULL)
{
// instantiating a new ENUM.
CMiniMdRW *pMiniMd = &(m_pStgdb->m_MiniMd);
@@ -2712,14 +2738,15 @@ STDMETHODIMP RegMeta::EnumUserStrings( // S_OK or error.
// set the output parameter.
*ppEnum = pEnum;
+ pEnum = NULL;
}
// fill the output token buffer.
- hr = HENUMInternal::EnumWithCount(pEnum, cmax, rStrings, pcStrings);
+ hr = HENUMInternal::EnumWithCount(*ppEnum, cmax, rStrings, pcStrings);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppEnum);
-
+ HENUMInternal::DestroyEnum(pEnum);
STOP_MD_PERF(EnumUserStrings);
END_ENTRYPOINT_NOTHROW;
diff --git a/src/coreclr/md/compiler/regmeta_import.cpp b/src/coreclr/md/compiler/regmeta_import.cpp
index a305c1dd286..e93cc2aeeb6 100644
--- a/src/coreclr/md/compiler/regmeta_import.cpp
+++ b/src/coreclr/md/compiler/regmeta_import.cpp
@@ -175,7 +175,7 @@ STDMETHODIMP RegMeta::EnumTypeDefs(
BEGIN_ENTRYPOINT_NOTHROW;
HENUMInternal **ppmdEnum = reinterpret_cast<HENUMInternal **> (phEnum);
- HENUMInternal *pEnum;
+ HENUMInternal *pEnum = NULL;
LOG((LOGMD, "RegMeta::EnumTypeDefs(0x%08x, 0x%08x, 0x%08x, 0x%08x)\n",
phEnum, rTypeDefs, cMax, pcTypeDefs));
@@ -219,17 +219,15 @@ STDMETHODIMP RegMeta::EnumTypeDefs(
// set the output parameter
*ppmdEnum = pEnum;
- }
- else
- {
- pEnum = *ppmdEnum;
+ pEnum = NULL;
}
// we can only fill the minimun of what caller asked for or what we have left
- hr = HENUMInternal::EnumWithCount(pEnum, cMax, rTypeDefs, pcTypeDefs);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMax, rTypeDefs, pcTypeDefs);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
STOP_MD_PERF(EnumTypeDefs);
@@ -255,7 +253,7 @@ STDMETHODIMP RegMeta::EnumInterfaceImpls(
HENUMInternal **ppmdEnum = reinterpret_cast<HENUMInternal **> (phEnum);
RID ridStart;
RID ridEnd;
- HENUMInternal *pEnum;
+ HENUMInternal *pEnum = NULL;
InterfaceImplRec *pRec;
RID index;
@@ -298,17 +296,15 @@ STDMETHODIMP RegMeta::EnumInterfaceImpls(
// set the output parameter
*ppmdEnum = pEnum;
- }
- else
- {
- pEnum = *ppmdEnum;
+ pEnum = NULL;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMax, rImpls, pcImpls);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMax, rImpls, pcImpls);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
STOP_MD_PERF(EnumInterfaceImpls);
@@ -327,7 +323,7 @@ STDMETHODIMP RegMeta::EnumGenericParams(HCORENUM *phEnum, mdToken tkOwner,
HENUMInternal **ppmdEnum = reinterpret_cast<HENUMInternal **> (phEnum);
RID ridStart;
RID ridEnd;
- HENUMInternal *pEnum;
+ HENUMInternal *pEnum = NULL;
GenericParamRec *pRec;
RID index;
CMiniMdRW *pMiniMd = NULL;
@@ -394,17 +390,16 @@ STDMETHODIMP RegMeta::EnumGenericParams(HCORENUM *phEnum, mdToken tkOwner,
// set the output parameter
*ppmdEnum = pEnum;
- }
- else
- {
- pEnum = *ppmdEnum;
+ pEnum = NULL;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMaxTokens, rTokens, pcTokens);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMaxTokens, rTokens, pcTokens);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
+
STOP_MD_PERF(EnumGenericPars);
END_ENTRYPOINT_NOTHROW;
@@ -425,7 +420,7 @@ STDMETHODIMP RegMeta::EnumMethodSpecs(
HENUMInternal **ppmdEnum = reinterpret_cast<HENUMInternal **> (phEnum);
RID ridStart;
RID ridEnd;
- HENUMInternal *pEnum;
+ HENUMInternal *pEnum = NULL;
MethodSpecRec *pRec;
RID index;
CMiniMdRW *pMiniMd = NULL;
@@ -499,17 +494,16 @@ STDMETHODIMP RegMeta::EnumMethodSpecs(
}
// set the output parameter
*ppmdEnum = pEnum;
- }
- else
- {
- pEnum = *ppmdEnum;
+ pEnum = NULL;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMaxTokens, rTokens, pcTokens);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMaxTokens, rTokens, pcTokens);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
+
STOP_MD_PERF(EnumMethodSpecs);
END_ENTRYPOINT_NOTHROW;
@@ -530,7 +524,7 @@ STDMETHODIMP RegMeta::EnumGenericParamConstraints(
HENUMInternal **ppmdEnum = reinterpret_cast<HENUMInternal **> (phEnum);
RID ridStart;
RID ridEnd;
- HENUMInternal *pEnum;
+ HENUMInternal *pEnum = NULL;
GenericParamConstraintRec *pRec;
RID index;
CMiniMdRW *pMiniMd = NULL;
@@ -588,17 +582,16 @@ STDMETHODIMP RegMeta::EnumGenericParamConstraints(
// set the output parameter
*ppmdEnum = pEnum;
- }
- else
- {
- pEnum = *ppmdEnum;
+ pEnum = NULL;
}
// fill the output token buffer
- hr = HENUMInternal::EnumWithCount(pEnum, cMaxTokens, rTokens, pcTokens);
+ hr = HENUMInternal::EnumWithCount(*ppmdEnum, cMaxTokens, rTokens, pcTokens);
ErrExit:
HENUMInternal::DestroyEnumIfEmpty(ppmdEnum);
+ HENUMInternal::DestroyEnum(pEnum);
+
STOP_MD_PERF(EnumGenericParamConstraints);
END_ENTRYPOINT_NOTHROW;