зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1438688, part 2b - Eliminate XPTHeader data structure. r=njn
Now that there is only one XPTHeader, we can devolve the fields in it to avoid some indirection. The biggest part here is getting rid of the mHeader field on xptiTypelibGuts. The array is [] instead of * to avoid a relocation, by ensuring that XPTHeader::kInterfaceDirectory as well as the data it points to cannot be changed. MozReview-Commit-ID: AzvNTNZKkfi --HG-- extra : rebase_source : d911a54b3db1f9f57b538d13ae86f28965ab33b3
This commit is contained in:
Родитель
1d1f9dcdb0
Коммит
38814e41a3
|
@ -81,11 +81,11 @@ XPTInterfaceInfoManager::XPTInterfaceInfoManager()
|
|||
: mWorkingSet(),
|
||||
mResolveLock("XPTInterfaceInfoManager.mResolveLock")
|
||||
{
|
||||
xptiTypelibGuts* typelib = xptiTypelibGuts::Create(&XPTHeader::kHeader);
|
||||
xptiTypelibGuts* typelib = xptiTypelibGuts::Create();
|
||||
|
||||
ReentrantMonitorAutoEnter monitor(mWorkingSet.mTableReentrantMonitor);
|
||||
for (uint16_t k = 0; k < XPTHeader::kHeader.mNumInterfaces; k++) {
|
||||
VerifyAndAddEntryIfNew(XPTHeader::kHeader.mInterfaceDirectory + k, k, typelib);
|
||||
for (uint16_t k = 0; k < XPTHeader::kNumInterfaces; k++) {
|
||||
VerifyAndAddEntryIfNew(XPTHeader::kInterfaceDirectory + k, k, typelib);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -20,15 +20,14 @@ CheckNoVTable<xptiTypelibGuts> gChecker;
|
|||
|
||||
// static
|
||||
xptiTypelibGuts*
|
||||
xptiTypelibGuts::Create(const XPTHeader* aHeader)
|
||||
xptiTypelibGuts::Create()
|
||||
{
|
||||
NS_ASSERTION(aHeader, "bad param");
|
||||
size_t n = sizeof(xptiTypelibGuts) +
|
||||
sizeof(xptiInterfaceEntry*) * (aHeader->mNumInterfaces - 1);
|
||||
sizeof(xptiInterfaceEntry*) * (XPTHeader::kNumInterfaces - 1);
|
||||
void* place = XPT_CALLOC8(gXPTIStructArena, n);
|
||||
if (!place)
|
||||
return nullptr;
|
||||
return new(place) xptiTypelibGuts(aHeader);
|
||||
return new(place) xptiTypelibGuts();
|
||||
}
|
||||
|
||||
xptiInterfaceEntry*
|
||||
|
@ -37,14 +36,13 @@ xptiTypelibGuts::GetEntryAt(uint16_t i)
|
|||
static const nsID zeroIID =
|
||||
{ 0x0, 0x0, 0x0, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } };
|
||||
|
||||
NS_ASSERTION(mHeader, "bad state");
|
||||
NS_ASSERTION(i < GetEntryCount(), "bad index");
|
||||
|
||||
xptiInterfaceEntry* r = mEntryArray[i];
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
const XPTInterfaceDirectoryEntry* iface = mHeader->mInterfaceDirectory + i;
|
||||
const XPTInterfaceDirectoryEntry* iface = XPTHeader::kInterfaceDirectory + i;
|
||||
|
||||
XPTInterfaceInfoManager::xptiWorkingSet& set =
|
||||
XPTInterfaceInfoManager::GetSingleton()->mWorkingSet;
|
||||
|
@ -66,10 +64,9 @@ xptiTypelibGuts::GetEntryAt(uint16_t i)
|
|||
const char*
|
||||
xptiTypelibGuts::GetEntryNameAt(uint16_t i)
|
||||
{
|
||||
NS_ASSERTION(mHeader, "bad state");
|
||||
NS_ASSERTION(i < GetEntryCount(), "bad index");
|
||||
|
||||
const XPTInterfaceDirectoryEntry* iface = mHeader->mInterfaceDirectory + i;
|
||||
const XPTInterfaceDirectoryEntry* iface = XPTHeader::kInterfaceDirectory + i;
|
||||
|
||||
return iface->Name();
|
||||
}
|
||||
|
|
|
@ -75,13 +75,12 @@ extern XPTArena* gXPTIStructArena;
|
|||
class xptiTypelibGuts
|
||||
{
|
||||
public:
|
||||
static xptiTypelibGuts* Create(const XPTHeader* aHeader);
|
||||
static xptiTypelibGuts* Create();
|
||||
|
||||
uint16_t GetEntryCount() const {return mHeader->mNumInterfaces;}
|
||||
uint16_t GetEntryCount() const { return XPTHeader::kNumInterfaces; }
|
||||
|
||||
void SetEntryAt(uint16_t i, xptiInterfaceEntry* ptr)
|
||||
{
|
||||
NS_ASSERTION(mHeader,"bad state!");
|
||||
NS_ASSERTION(i < GetEntryCount(),"bad param!");
|
||||
mEntryArray[i] = ptr;
|
||||
}
|
||||
|
@ -90,13 +89,10 @@ public:
|
|||
const char* GetEntryNameAt(uint16_t i);
|
||||
|
||||
private:
|
||||
explicit xptiTypelibGuts(const XPTHeader* aHeader)
|
||||
: mHeader(aHeader)
|
||||
{ }
|
||||
xptiTypelibGuts() = default;
|
||||
~xptiTypelibGuts();
|
||||
|
||||
private:
|
||||
const XPTHeader* mHeader; // hold pointer into arena
|
||||
xptiInterfaceEntry* mEntryArray[1]; // Always last. Sized to fit.
|
||||
};
|
||||
|
||||
|
|
|
@ -25,10 +25,8 @@ struct XPTTypeDescriptor;
|
|||
struct XPTTypeDescriptorPrefix;
|
||||
|
||||
struct XPTHeader {
|
||||
uint16_t mNumInterfaces;
|
||||
const XPTInterfaceDirectoryEntry* mInterfaceDirectory;
|
||||
|
||||
static const XPTHeader kHeader;
|
||||
static const uint16_t kNumInterfaces;
|
||||
static const XPTInterfaceDirectoryEntry kInterfaceDirectory[];
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
Загрузка…
Ссылка в новой задаче