2017-02-10 21:18:26 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
|
|
|
|
#include "mozilla/mscom/AgileReference.h"
|
|
|
|
|
Bug 1609996 - Reorder some includes affected by the previous patches. r=froydnj
This was done by:
This was done by applying:
```
diff --git a/python/mozbuild/mozbuild/code-analysis/mach_commands.py b/python/mozbuild/mozbuild/code-analysis/mach_commands.py
index 789affde7bbf..fe33c4c7d4d1 100644
--- a/python/mozbuild/mozbuild/code-analysis/mach_commands.py
+++ b/python/mozbuild/mozbuild/code-analysis/mach_commands.py
@@ -2007,7 +2007,7 @@ class StaticAnalysis(MachCommandBase):
from subprocess import Popen, PIPE, check_output, CalledProcessError
diff_process = Popen(self._get_clang_format_diff_command(commit), stdout=PIPE)
- args = [sys.executable, clang_format_diff, "-p1", "-binary=%s" % clang_format]
+ args = [sys.executable, clang_format_diff, "-p1", "-binary=%s" % clang_format, '-sort-includes']
if not output_file:
args.append("-i")
```
Then running `./mach clang-format -c <commit-hash>`
Then undoing that patch.
Then running check_spidermonkey_style.py --fixup
Then running `./mach clang-format`
I had to fix four things:
* I needed to move <utility> back down in GuardObjects.h because I was hitting
obscure problems with our system include wrappers like this:
0:03.94 /usr/include/stdlib.h:550:14: error: exception specification in declaration does not match previous declaration
0:03.94 extern void *realloc (void *__ptr, size_t __size)
0:03.94 ^
0:03.94 /home/emilio/src/moz/gecko-2/obj-debug/dist/include/malloc_decls.h:53:1: note: previous declaration is here
0:03.94 MALLOC_DECL(realloc, void*, void*, size_t)
0:03.94 ^
0:03.94 /home/emilio/src/moz/gecko-2/obj-debug/dist/include/mozilla/mozalloc.h:22:32: note: expanded from macro 'MALLOC_DECL'
0:03.94 MOZ_MEMORY_API return_type name##_impl(__VA_ARGS__);
0:03.94 ^
0:03.94 <scratch space>:178:1: note: expanded from here
0:03.94 realloc_impl
0:03.94 ^
0:03.94 /home/emilio/src/moz/gecko-2/obj-debug/dist/include/mozmemory_wrap.h:142:41: note: expanded from macro 'realloc_impl'
0:03.94 #define realloc_impl mozmem_malloc_impl(realloc)
Which I really didn't feel like digging into.
* I had to restore the order of TrustOverrideUtils.h and related files in nss
because the .inc files depend on TrustOverrideUtils.h being included earlier.
* I had to add a missing include to RollingNumber.h
* Also had to partially restore include order in JsepSessionImpl.cpp to avoid
some -WError issues due to some static inline functions being defined in a
header but not used in the rest of the compilation unit.
Differential Revision: https://phabricator.services.mozilla.com/D60327
--HG--
extra : moz-landing-system : lando
2020-01-20 19:19:48 +03:00
|
|
|
#include <utility>
|
|
|
|
|
2018-09-12 21:56:10 +03:00
|
|
|
#include "mozilla/Assertions.h"
|
2017-02-10 21:18:26 +03:00
|
|
|
#include "mozilla/DebugOnly.h"
|
2018-04-05 01:31:43 +03:00
|
|
|
#include "mozilla/DynamicallyLinkedFunctionPtr.h"
|
2018-09-12 21:56:10 +03:00
|
|
|
#include "mozilla/mscom/Utils.h"
|
2017-02-10 21:18:26 +03:00
|
|
|
|
2019-04-04 01:06:18 +03:00
|
|
|
#if defined(MOZILLA_INTERNAL_API)
|
|
|
|
# include "nsDebug.h"
|
|
|
|
# include "nsPrintfCString.h"
|
|
|
|
#endif // defined(MOZILLA_INTERNAL_API)
|
|
|
|
|
2017-02-10 21:18:26 +03:00
|
|
|
#if NTDDI_VERSION < NTDDI_WINBLUE
|
|
|
|
|
|
|
|
// Declarations from Windows SDK specific to Windows 8.1
|
|
|
|
|
|
|
|
enum AgileReferenceOptions {
|
|
|
|
AGILEREFERENCE_DEFAULT = 0,
|
|
|
|
AGILEREFERENCE_DELAYEDMARSHAL = 1,
|
|
|
|
};
|
|
|
|
|
|
|
|
HRESULT WINAPI RoGetAgileReference(AgileReferenceOptions options, REFIID riid,
|
|
|
|
IUnknown* pUnk,
|
|
|
|
IAgileReference** ppAgileReference);
|
|
|
|
|
|
|
|
#endif // NTDDI_VERSION < NTDDI_WINBLUE
|
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
namespace mscom {
|
2019-08-28 18:05:32 +03:00
|
|
|
namespace detail {
|
2017-02-10 21:18:26 +03:00
|
|
|
|
2019-08-28 18:05:32 +03:00
|
|
|
GlobalInterfaceTableCookie::GlobalInterfaceTableCookie(IUnknown* aObject,
|
|
|
|
REFIID aIid,
|
|
|
|
HRESULT& aOutHResult)
|
|
|
|
: mCookie(0) {
|
|
|
|
IGlobalInterfaceTable* git = ObtainGit();
|
|
|
|
MOZ_ASSERT(git);
|
|
|
|
if (!git) {
|
|
|
|
aOutHResult = E_POINTER;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
aOutHResult = git->RegisterInterfaceInGlobal(aObject, aIid, &mCookie);
|
|
|
|
MOZ_ASSERT(SUCCEEDED(aOutHResult));
|
|
|
|
}
|
|
|
|
|
|
|
|
GlobalInterfaceTableCookie::~GlobalInterfaceTableCookie() {
|
|
|
|
IGlobalInterfaceTable* git = ObtainGit();
|
|
|
|
MOZ_ASSERT(git);
|
|
|
|
if (!git) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
DebugOnly<HRESULT> hr = git->RevokeInterfaceFromGlobal(mCookie);
|
|
|
|
#if defined(MOZILLA_INTERNAL_API)
|
|
|
|
NS_WARNING_ASSERTION(
|
|
|
|
SUCCEEDED(hr),
|
|
|
|
nsPrintfCString("IGlobalInterfaceTable::RevokeInterfaceFromGlobal failed "
|
|
|
|
"with HRESULT 0x%08lX",
|
|
|
|
((HRESULT)hr))
|
|
|
|
.get());
|
|
|
|
#else
|
|
|
|
MOZ_ASSERT(SUCCEEDED(hr));
|
|
|
|
#endif // defined(MOZILLA_INTERNAL_API)
|
|
|
|
mCookie = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT GlobalInterfaceTableCookie::GetInterface(REFIID aIid,
|
|
|
|
void** aOutInterface) const {
|
|
|
|
IGlobalInterfaceTable* git = ObtainGit();
|
|
|
|
MOZ_ASSERT(git);
|
|
|
|
if (!git) {
|
|
|
|
return E_UNEXPECTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
MOZ_ASSERT(IsValid());
|
|
|
|
return git->GetInterfaceFromGlobal(mCookie, aIid, aOutInterface);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* static */
|
|
|
|
IGlobalInterfaceTable* GlobalInterfaceTableCookie::ObtainGit() {
|
|
|
|
// Internally to COM, the Global Interface Table is a singleton, therefore we
|
|
|
|
// don't worry about holding onto this reference indefinitely.
|
|
|
|
static IGlobalInterfaceTable* sGit = []() -> IGlobalInterfaceTable* {
|
|
|
|
IGlobalInterfaceTable* result = nullptr;
|
|
|
|
DebugOnly<HRESULT> hr = ::CoCreateInstance(
|
|
|
|
CLSID_StdGlobalInterfaceTable, nullptr, CLSCTX_INPROC_SERVER,
|
|
|
|
IID_IGlobalInterfaceTable, reinterpret_cast<void**>(&result));
|
|
|
|
MOZ_ASSERT(SUCCEEDED(hr));
|
|
|
|
return result;
|
|
|
|
}();
|
|
|
|
|
|
|
|
return sGit;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace detail
|
|
|
|
|
|
|
|
AgileReference::AgileReference() : mIid(), mHResult(E_NOINTERFACE) {}
|
2018-09-12 21:55:39 +03:00
|
|
|
|
2017-02-10 21:18:26 +03:00
|
|
|
AgileReference::AgileReference(REFIID aIid, IUnknown* aObject)
|
2019-08-28 18:05:32 +03:00
|
|
|
: mIid(aIid), mHResult(E_UNEXPECTED) {
|
2018-09-12 21:55:39 +03:00
|
|
|
AssignInternal(aObject);
|
|
|
|
}
|
|
|
|
|
2019-08-28 18:05:32 +03:00
|
|
|
AgileReference::AgileReference(AgileReference&& aOther)
|
|
|
|
: mIid(aOther.mIid),
|
|
|
|
mAgileRef(std::move(aOther.mAgileRef)),
|
|
|
|
mGitCookie(std::move(aOther.mGitCookie)),
|
|
|
|
mHResult(aOther.mHResult) {
|
|
|
|
aOther.mHResult = CO_E_RELEASED;
|
|
|
|
}
|
|
|
|
|
2018-09-12 21:55:39 +03:00
|
|
|
void AgileReference::Assign(REFIID aIid, IUnknown* aObject) {
|
|
|
|
Clear();
|
|
|
|
mIid = aIid;
|
|
|
|
AssignInternal(aObject);
|
|
|
|
}
|
|
|
|
|
|
|
|
void AgileReference::AssignInternal(IUnknown* aObject) {
|
|
|
|
// We expect mIid to already be set
|
|
|
|
DebugOnly<IID> zeroIid = {};
|
|
|
|
MOZ_ASSERT(mIid != zeroIid);
|
|
|
|
|
2017-02-10 21:18:26 +03:00
|
|
|
/*
|
|
|
|
* There are two possible techniques for creating agile references. Starting
|
|
|
|
* with Windows 8.1, we may use the RoGetAgileReference API, which is faster.
|
|
|
|
* If that API is not available, we fall back to using the Global Interface
|
|
|
|
* Table.
|
|
|
|
*/
|
2019-08-07 18:58:09 +03:00
|
|
|
static const StaticDynamicallyLinkedFunctionPtr<decltype(
|
|
|
|
&::RoGetAgileReference)>
|
2017-02-10 21:18:26 +03:00
|
|
|
pRoGetAgileReference(L"ole32.dll", "RoGetAgileReference");
|
|
|
|
|
|
|
|
MOZ_ASSERT(aObject);
|
|
|
|
|
|
|
|
if (pRoGetAgileReference &&
|
2019-08-28 18:05:32 +03:00
|
|
|
SUCCEEDED(mHResult =
|
|
|
|
pRoGetAgileReference(AGILEREFERENCE_DEFAULT, mIid, aObject,
|
|
|
|
getter_AddRefs(mAgileRef)))) {
|
2017-02-10 21:18:26 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-08-28 18:05:32 +03:00
|
|
|
mGitCookie = new detail::GlobalInterfaceTableCookie(aObject, mIid, mHResult);
|
|
|
|
MOZ_ASSERT(mGitCookie->IsValid());
|
2017-02-10 21:18:26 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
AgileReference::~AgileReference() { Clear(); }
|
2018-09-12 21:55:39 +03:00
|
|
|
|
|
|
|
void AgileReference::Clear() {
|
|
|
|
mIid = {};
|
2019-08-28 18:05:32 +03:00
|
|
|
mAgileRef = nullptr;
|
|
|
|
mGitCookie = nullptr;
|
|
|
|
mHResult = E_NOINTERFACE;
|
|
|
|
}
|
2018-09-12 21:55:39 +03:00
|
|
|
|
2019-08-28 18:05:32 +03:00
|
|
|
AgileReference& AgileReference::operator=(const AgileReference& aOther) {
|
|
|
|
Clear();
|
|
|
|
mIid = aOther.mIid;
|
|
|
|
mAgileRef = aOther.mAgileRef;
|
|
|
|
mGitCookie = aOther.mGitCookie;
|
|
|
|
mHResult = aOther.mHResult;
|
|
|
|
return *this;
|
2018-09-12 21:55:39 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
AgileReference& AgileReference::operator=(AgileReference&& aOther) {
|
|
|
|
Clear();
|
|
|
|
mIid = aOther.mIid;
|
|
|
|
mAgileRef = std::move(aOther.mAgileRef);
|
2019-08-28 18:05:32 +03:00
|
|
|
mGitCookie = std::move(aOther.mGitCookie);
|
|
|
|
mHResult = aOther.mHResult;
|
|
|
|
aOther.mHResult = CO_E_RELEASED;
|
2018-09-12 21:55:39 +03:00
|
|
|
return *this;
|
2017-02-10 21:18:26 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT
|
2018-09-12 21:55:39 +03:00
|
|
|
AgileReference::Resolve(REFIID aIid, void** aOutInterface) const {
|
2017-02-10 21:18:26 +03:00
|
|
|
MOZ_ASSERT(aOutInterface);
|
2019-08-28 18:05:32 +03:00
|
|
|
// This check is exclusive-OR; we should have one or the other, but not both
|
|
|
|
MOZ_ASSERT((mAgileRef || mGitCookie) && !(mAgileRef && mGitCookie));
|
2018-09-12 21:56:10 +03:00
|
|
|
MOZ_ASSERT(IsCOMInitializedOnCurrentThread());
|
2017-02-10 21:18:26 +03:00
|
|
|
|
|
|
|
if (!aOutInterface) {
|
|
|
|
return E_INVALIDARG;
|
|
|
|
}
|
|
|
|
|
|
|
|
*aOutInterface = nullptr;
|
|
|
|
|
|
|
|
if (mAgileRef) {
|
|
|
|
// IAgileReference lets you directly resolve the interface you want...
|
|
|
|
return mAgileRef->Resolve(aIid, aOutInterface);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!mGitCookie) {
|
|
|
|
return E_UNEXPECTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
RefPtr<IUnknown> originalInterface;
|
2019-08-28 18:05:32 +03:00
|
|
|
HRESULT hr =
|
|
|
|
mGitCookie->GetInterface(mIid, getter_AddRefs(originalInterface));
|
2017-02-10 21:18:26 +03:00
|
|
|
if (FAILED(hr)) {
|
|
|
|
return hr;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (aIid == mIid) {
|
|
|
|
originalInterface.forget(aOutInterface);
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
// ...Whereas the GIT requires us to obtain the same interface that we
|
|
|
|
// requested and then QI for the desired interface afterward.
|
|
|
|
return originalInterface->QueryInterface(aIid, aOutInterface);
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace mscom
|
|
|
|
} // namespace mozilla
|