The goal here is making nsGkAtoms.h simpler / cheaper to include, but also clean up a bit the set-up, which predates the removal of pseudo-element atoms etc in bug 2014922. The rust set-up stops parsing headers, instead we generate a rust file that maps static atom -> index, which is all we need. This paves the way towards moving the gecko_string_cache stuff outside of style, which would be nice if other Gecko consumers ever want to interact with atoms. The IPC code becomes simpler as well, because StaticAtoms.h exposes the count in a less round-about way. The header becomes the GkAtoms definition (generated by python) and a namespace with the pointers. No need for a lot of the extra lines, etc. Differential Revision: https://phabricator.services.mozilla.com/D311279
60 lines
1.6 KiB
C++
60 lines
1.6 KiB
C++
/* 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 "IPCMessageUtilsSpecializations.h"
|
|
#include "nsGkAtoms.h"
|
|
|
|
namespace IPC {
|
|
|
|
static const uint16_t kDynamicAtomToken = 0xffff;
|
|
|
|
static_assert(kDynamicAtomToken >= nsGkAtoms::kStaticAtomCount,
|
|
"Exceeded supported number of static atoms");
|
|
|
|
/* static */
|
|
void ParamTraits<nsAtom*>::Write(MessageWriter* aWriter, const nsAtom* aParam) {
|
|
MOZ_ASSERT(aParam);
|
|
|
|
if (aParam->IsStatic()) {
|
|
const nsStaticAtom* atom = aParam->AsStatic();
|
|
uint16_t index = static_cast<uint16_t>(nsGkAtoms::IndexOf(atom));
|
|
MOZ_ASSERT(index < nsGkAtoms::kStaticAtomCount);
|
|
WriteParam(aWriter, index);
|
|
return;
|
|
}
|
|
WriteParam(aWriter, kDynamicAtomToken);
|
|
nsDependentAtomString atomStr(aParam);
|
|
// nsDependentAtomString is serialized as its base, nsString, but we
|
|
// can be explicit about it.
|
|
nsString& str = atomStr;
|
|
WriteParam(aWriter, str);
|
|
}
|
|
|
|
/* static */
|
|
bool ParamTraits<nsAtom*>::Read(MessageReader* aReader,
|
|
RefPtr<nsAtom>* aResult) {
|
|
uint16_t token;
|
|
if (!ReadParam(aReader, &token)) {
|
|
return false;
|
|
}
|
|
if (token != kDynamicAtomToken) {
|
|
if (token >= nsGkAtoms::kStaticAtomCount) {
|
|
return false;
|
|
}
|
|
*aResult = nsGkAtoms::GetAtomByIndex(token);
|
|
return true;
|
|
}
|
|
|
|
nsAutoString str;
|
|
if (!ReadParam(aReader, static_cast<nsString*>(&str))) {
|
|
return false;
|
|
}
|
|
|
|
*aResult = NS_Atomize(str);
|
|
MOZ_ASSERT(*aResult);
|
|
return true;
|
|
}
|
|
|
|
} // namespace IPC
|