Using of idiomatic ReleaseHolder instead of unique_ptr with custom deleter for COM...
authorAleksei Vereshchagin <avereschagin@dev.rtsoft.ru>
Mon, 11 Dec 2017 17:14:06 +0000 (20:14 +0300)
committerAleksei Vereshchagin <avereschagin@dev.rtsoft.ru>
Mon, 11 Dec 2017 17:14:06 +0000 (20:14 +0300)
src/info/classinfo.cpp
src/info/functioninfo.cpp
src/misc/default_delete.h [deleted file]

index 4b53ec85a6e47dd217c7bad80fbe3bf94567c4ae..1a40b23d2c9611e2807d6e00626a827aef615ba1 100644 (file)
 #include <exception>
 #include <stdexcept>
 
+#include <releaseholder.h>
+
 #include "profiler.h"
 #include "classstorage.h"
-#include "default_delete.h"
 #include "classinfo.h"
 
 // static
@@ -362,9 +363,10 @@ __forceinline HRESULT ClassInfo::InitializeRegularClassName(
 
     try
     {
-        IUnknown *pUnknown;
+        ReleaseHolder<IMetaDataImport> pMDImport;
         hr = info.v1()->GetModuleMetaData(
-            this->moduleId, ofRead, IID_IMetaDataImport, &pUnknown);
+            this->moduleId, ofRead, IID_IMetaDataImport,
+            reinterpret_cast<IUnknown**>(&pMDImport));
         if (FAILED(hr))
         {
             throw HresultException(
@@ -372,8 +374,6 @@ __forceinline HRESULT ClassInfo::InitializeRegularClassName(
                 "GetModuleMetaData()", hr
             );
         }
-        std::unique_ptr<IUnknown> pUnknownHolder(pUnknown);
-        IMetaDataImport *pMDImport = dynamic_cast<IMetaDataImport*>(pUnknown);
 
         ULONG32 typeArgsSize = 0;
         hr = ClassInfo::GetClassNameFromMetaData(
index 4178ea07f8b460cbeed1d0f459114654d72c3cf5..1cf211c881929a58e4c8372a88165ab39e94912d 100644 (file)
 #include <exception>
 #include <stdexcept>
 
-//#include <corhlpr.h>
+#include <releaseholder.h>
 
 #include "profiler.h"
 #include "classstorage.h"
 #include "classinfo.h"
-#include "default_delete.h"
 #include "functioninfo.h"
 
 inline bool isCallConv(unsigned sigByte, CorCallingConvention conv)
@@ -790,16 +789,15 @@ HRESULT FunctionInfo::Initialize(
             );
         }
 
-        IUnknown *pUnknown;
+        ReleaseHolder<IMetaDataImport> pMDImport;
         hr = info.v1()->GetModuleMetaData(
-            this->moduleId, ofRead, IID_IMetaDataImport, &pUnknown);
+            this->moduleId, ofRead, IID_IMetaDataImport,
+            reinterpret_cast<IUnknown**>(&pMDImport));
         if (FAILED(hr))
         {
             throw HresultException(
                 "FunctionInfo::Initialize(): GetModuleMetaData()", hr);
         }
-        std::unique_ptr<IUnknown> pUnknownHolder(pUnknown);
-        IMetaDataImport *pMDImport = dynamic_cast<IMetaDataImport*>(pUnknown);
 
         ULONG funcNameSize;
         mdTypeDef classToken;
diff --git a/src/misc/default_delete.h b/src/misc/default_delete.h
deleted file mode 100644 (file)
index 09fe151..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <utility>
-
-#include <cor.h>
-
-namespace std
-{
-    template<>
-    struct default_delete<IUnknown> {
-        void operator()(IUnknown* pUnknown)
-        {
-            pUnknown->Release();
-        }
-    };
-}