Files
sousa-gecko/ipc/glue/IPCMessageUtilsSpecializations.cpp
T
Emilio Cobos Álvarez e58899d7ff Bug 2053749 - Simplify a bit the static atoms set-up. r=firefox-style-system-reviewers,dshin,ipc-reviewers,nika
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
2026-07-16 12:11:31 +00:00

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