mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-20 07:17:32 +09:00
Rename the MozMap C++ type to "record" and give it a template parameter for the key type
This commit is contained in:
parent
d9eeac26ef
commit
6196fdda47
7 changed files with 145 additions and 126 deletions
|
|
@ -49,7 +49,7 @@ namespace mozilla {
|
|||
enum UseCounter : int16_t;
|
||||
|
||||
namespace dom {
|
||||
template<typename DataType> class MozMap;
|
||||
template<typename KeyType, typename ValueType> class Record;
|
||||
|
||||
nsresult
|
||||
UnwrapArgImpl(JS::Handle<JSObject*> src, const nsIID& iid, void** ppArg);
|
||||
|
|
@ -2293,25 +2293,26 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
void TraceMozMap(JSTracer* trc, MozMap<T>& map)
|
||||
template<typename K, typename V>
|
||||
void TraceRecord(JSTracer* trc, Record<K, V>& record)
|
||||
{
|
||||
for (auto& entry : map.Entries()) {
|
||||
for (auto& entry : record.Entries()) {
|
||||
// Act like it's a one-element sequence to leverage all that infrastructure.
|
||||
SequenceTracer<T>::TraceSequence(trc, &entry.mValue, &entry.mValue + 1);
|
||||
SequenceTracer<V>::TraceSequence(trc, &entry.mValue, &entry.mValue + 1);
|
||||
}
|
||||
}
|
||||
|
||||
// sequence<MozMap>
|
||||
template<typename T>
|
||||
class SequenceTracer<MozMap<T>, false, false, false>
|
||||
// sequence<record>
|
||||
template<typename K, typename V>
|
||||
class SequenceTracer<Record<K, V>, false, false, false>
|
||||
{
|
||||
explicit SequenceTracer() = delete; // Should never be instantiated
|
||||
|
||||
public:
|
||||
static void TraceSequence(JSTracer* trc, MozMap<T>* seqp, MozMap<T>* end) {
|
||||
static void TraceSequence(JSTracer* trc, Record<K, V>* seqp,
|
||||
Record<K, V>* end) {
|
||||
for (; seqp != end; ++seqp) {
|
||||
TraceMozMap(trc, *seqp);
|
||||
TraceRecord(trc, *seqp);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
@ -2389,51 +2390,51 @@ public:
|
|||
SequenceType mSequenceType;
|
||||
};
|
||||
|
||||
// Rooter class for MozMap; this is what we mostly use in the codegen.
|
||||
template<typename T>
|
||||
class MOZ_RAII MozMapRooter final : private JS::CustomAutoRooter
|
||||
// Rooter class for Record; this is what we mostly use in the codegen.
|
||||
template<typename K, typename V>
|
||||
class MOZ_RAII RecordRooter final : private JS::CustomAutoRooter
|
||||
{
|
||||
public:
|
||||
MozMapRooter(JSContext *aCx, MozMap<T>* aMozMap
|
||||
RecordRooter(JSContext *aCx, Record<K, V>* aRecord
|
||||
MOZ_GUARD_OBJECT_NOTIFIER_PARAM)
|
||||
: JS::CustomAutoRooter(aCx MOZ_GUARD_OBJECT_NOTIFIER_PARAM_TO_PARENT),
|
||||
mMozMap(aMozMap),
|
||||
mMozMapType(eMozMap)
|
||||
mRecord(aRecord),
|
||||
mRecordType(eRecord)
|
||||
{
|
||||
}
|
||||
|
||||
MozMapRooter(JSContext *aCx, Nullable<MozMap<T>>* aMozMap
|
||||
RecordRooter(JSContext *aCx, Nullable<Record<K, V>>* aRecord
|
||||
MOZ_GUARD_OBJECT_NOTIFIER_PARAM)
|
||||
: JS::CustomAutoRooter(aCx MOZ_GUARD_OBJECT_NOTIFIER_PARAM_TO_PARENT),
|
||||
mNullableMozMap(aMozMap),
|
||||
mMozMapType(eNullableMozMap)
|
||||
mNullableRecord(aRecord),
|
||||
mRecordType(eNullableRecord)
|
||||
{
|
||||
}
|
||||
|
||||
private:
|
||||
enum MozMapType {
|
||||
eMozMap,
|
||||
eNullableMozMap
|
||||
enum RecordType {
|
||||
eRecord,
|
||||
eNullableRecord
|
||||
};
|
||||
|
||||
virtual void trace(JSTracer *trc) override
|
||||
{
|
||||
if (mMozMapType == eMozMap) {
|
||||
TraceMozMap(trc, *mMozMap);
|
||||
if (mRecordType == eRecord) {
|
||||
TraceRecord(trc, *mRecord);
|
||||
} else {
|
||||
MOZ_ASSERT(mMozMapType == eNullableMozMap);
|
||||
if (!mNullableMozMap->IsNull()) {
|
||||
TraceMozMap(trc, mNullableMozMap->Value());
|
||||
MOZ_ASSERT(mRecordType == eNullableRecord);
|
||||
if (!mNullableRecord->IsNull()) {
|
||||
TraceRecord(trc, mNullableRecord->Value());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
union {
|
||||
MozMap<T>* mMozMap;
|
||||
Nullable<MozMap<T>>* mNullableMozMap;
|
||||
Record<K, V>* mRecord;
|
||||
Nullable<Record<K, V>>* mNullableRecord;
|
||||
};
|
||||
|
||||
MozMapType mMozMapType;
|
||||
RecordType mRecordType;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue