Bug 1438688, part 4 - Hoist arrays to XPTHeader. r=njn

To allow XPT information to be shared between processes, it needs to
not contain any pointers, because they cause relocations. I've
eliminated pointers by hoisting all of the variable length data
structures to XPTHeader, into a single array for each type of
data. These data structures now use an index into these arrays to find
their first element. Strings are similar, but they are mashed into a
single giant string, including embedded null terminators. Modifying
the accessor methods to support this is easy, because there is only a
single global instance of each of these arrays in XPTHeader.

MozReview-Commit-ID: 5rgwaEBvDYl

--HG--
extra : rebase_source : 2e423f088d662920a89f3b66c70d26fe340b5fce
This commit is contained in:
Andrew McCreight 2018-02-28 15:12:07 -08:00
Родитель e80864c94c
Коммит 40c8743812
2 изменённых файлов: 33 добавлений и 21 удалений

Просмотреть файл

@ -301,7 +301,7 @@ xptiInterfaceEntry::GetInterfaceIndexForParam(uint16_t methodIndex,
const XPTTypeDescriptor *td = &param->mType; const XPTTypeDescriptor *td = &param->mType;
while (td->Tag() == TD_ARRAY) { while (td->Tag() == TD_ARRAY) {
td = td->ArrayElementType(mDescriptor); td = td->ArrayElementType();
} }
if (td->Tag() != TD_INTERFACE_TYPE) { if (td->Tag() != TD_INTERFACE_TYPE) {
@ -441,7 +441,7 @@ xptiInterfaceEntry::GetTypeInArray(const nsXPTParamInfo* param,
NS_ERROR("bad dimension"); NS_ERROR("bad dimension");
return NS_ERROR_INVALID_ARG; return NS_ERROR_INVALID_ARG;
} }
td = td->ArrayElementType(mDescriptor); td = td->ArrayElementType();
} }
*type = td; *type = td;
@ -549,7 +549,7 @@ xptiInterfaceEntry::GetInterfaceIsArgNumberForParam(uint16_t methodIndex,
const XPTTypeDescriptor *td = &param->mType; const XPTTypeDescriptor *td = &param->mType;
while (td->Tag() == TD_ARRAY) { while (td->Tag() == TD_ARRAY) {
td = td->ArrayElementType(mDescriptor); td = td->ArrayElementType();
} }
if (td->Tag() != TD_INTERFACE_IS_TYPE) { if (td->Tag() != TD_INTERFACE_IS_TYPE) {

Просмотреть файл

@ -27,6 +27,15 @@ struct XPTTypeDescriptorPrefix;
struct XPTHeader { struct XPTHeader {
static const uint16_t kNumInterfaces; static const uint16_t kNumInterfaces;
static const XPTInterfaceDirectoryEntry kInterfaceDirectory[]; static const XPTInterfaceDirectoryEntry kInterfaceDirectory[];
static const XPTInterfaceDescriptor kInterfaces[];
static const XPTTypeDescriptor kTypes[];
static const XPTParamDescriptor kParams[];
static const XPTMethodDescriptor kMethods[];
static const XPTConstDescriptor kConsts[];
// All of the strings for this header, including their null
// terminators, concatenated into a single string.
static const char kStrings[];
}; };
/* /*
@ -39,8 +48,10 @@ struct XPTInterfaceDirectoryEntry {
inline const char* Name() const; inline const char* Name() const;
nsID mIID; nsID mIID;
const char* mName; uint32_t mName; // Index into XPTHeader::mStrings.
const XPTInterfaceDescriptor* mInterfaceDescriptor; // mInterfaceDescriptor is a 1-based index into XPTHeader::mInterfaces. The
// value 0 is used to indicate unresolved interfaces.
uint32_t mInterfaceDescriptor;
}; };
/* /*
@ -64,14 +75,12 @@ struct XPTInterfaceDescriptor {
/* /*
* This field ordering minimizes the size of this struct. * This field ordering minimizes the size of this struct.
*/ */
const XPTMethodDescriptor* mMethodDescriptors; uint16_t mMethodDescriptors; // Index into XPTHeader::mMethods.
const XPTConstDescriptor* mConstDescriptors; uint16_t mConstDescriptors; // Index into XPTHeader::mConsts.
const XPTTypeDescriptor* mAdditionalTypes;
uint16_t mParentInterface; uint16_t mParentInterface;
uint16_t mNumMethods; uint16_t mNumMethods;
uint16_t mNumConstants; uint16_t mNumConstants;
uint8_t mFlags; uint8_t mFlags;
uint8_t mNumAdditionalTypes;
}; };
/* /*
@ -147,9 +156,9 @@ struct XPTTypeDescriptor {
return mData1; return mData1;
} }
const XPTTypeDescriptor* ArrayElementType(const XPTInterfaceDescriptor* aDescriptor) const { const XPTTypeDescriptor* ArrayElementType() const {
MOZ_ASSERT(Tag() == TD_ARRAY); MOZ_ASSERT(Tag() == TD_ARRAY);
return &aDescriptor->mAdditionalTypes[mData2]; return &XPTHeader::kTypes[mData2];
} }
// We store the 16-bit iface value as two 8-bit values in order to // We store the 16-bit iface value as two 8-bit values in order to
@ -188,10 +197,10 @@ union XPTConstValue {
struct XPTConstDescriptor { struct XPTConstDescriptor {
const char* Name() const { const char* Name() const {
return mName; return &XPTHeader::kStrings[mName];
} }
const char* mName; uint32_t mName; // Index into XPTHeader::mStrings.
XPTTypeDescriptor mType; XPTTypeDescriptor mType;
union XPTConstValue mValue; union XPTConstValue mValue;
}; };
@ -210,36 +219,39 @@ struct XPTParamDescriptor {
*/ */
struct XPTMethodDescriptor { struct XPTMethodDescriptor {
const char* Name() const { const char* Name() const {
return mName; return &XPTHeader::kStrings[mName];
} }
const XPTParamDescriptor& Param(uint8_t aIndex) const { const XPTParamDescriptor& Param(uint8_t aIndex) const {
return mParams[aIndex]; return XPTHeader::kParams[mParams + aIndex];
} }
const char* mName; uint32_t mName; // Index into XPTHeader::mStrings.
const XPTParamDescriptor* mParams; uint32_t mParams; // Index into XPTHeader::mParams.
uint8_t mFlags; uint8_t mFlags;
uint8_t mNumArgs; uint8_t mNumArgs;
}; };
const char* const char*
XPTInterfaceDirectoryEntry::Name() const { XPTInterfaceDirectoryEntry::Name() const {
return mName; return &XPTHeader::kStrings[mName];
} }
const XPTInterfaceDescriptor* const XPTInterfaceDescriptor*
XPTInterfaceDirectoryEntry::InterfaceDescriptor() const { XPTInterfaceDirectoryEntry::InterfaceDescriptor() const {
return mInterfaceDescriptor; if (mInterfaceDescriptor == 0) {
return nullptr;
}
return &XPTHeader::kInterfaces[mInterfaceDescriptor - 1];
} }
const XPTMethodDescriptor& const XPTMethodDescriptor&
XPTInterfaceDescriptor::Method(size_t aIndex) const { XPTInterfaceDescriptor::Method(size_t aIndex) const {
return mMethodDescriptors[aIndex]; return XPTHeader::kMethods[mMethodDescriptors + aIndex];
} }
const XPTConstDescriptor& const XPTConstDescriptor&
XPTInterfaceDescriptor::Const(size_t aIndex) const { XPTInterfaceDescriptor::Const(size_t aIndex) const {
return mConstDescriptors[aIndex]; return XPTHeader::kConsts[mConstDescriptors + aIndex];
} }
#endif /* xpt_struct_h */ #endif /* xpt_struct_h */