diff --git a/src/coreclr/md/compiler/assemblymd.cpp b/src/coreclr/md/compiler/assemblymd.cpp index d778c636722ab..759c7dc69d89a 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 (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 cc38921992e4e..ec05e2663df4a 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 (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 c0abc8f7f6397..6559b2b31e9eb 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 (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 (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 (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 a305c1dd2866e..e93cc2aeeb663 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 (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 (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 (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 (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 (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;