Bug 1196461 - De-duplicate strings in heap snapshot core dumps; r=shu,jimb
This changeset replaces all of the
// char16_t[]
optional bytes someProperty = 1;
one- and two-byte string properties in the CoreDump.proto protobuf definition
file with:
oneof {
// char16_t[]
bytes someProperty = 1;
uint64 somePropertyRef = 2;
}
The first time the N^th unique string is serialized, then someProperty is used
and the full string is serialized in the protobuf message. All following times
that string is serialized, somePropertyRef is used and its value is N.
Among the other things, this also changes JS::ubi::Edge::name from a raw pointer
with commented rules about who does or doesn't own and should and shouldn't free
the raw pointer to a UniquePtr that enforces those rules rather than relying on
developers reading and obeying the rules in the comments.
This commit is contained in:
@@ -10,11 +10,6 @@
|
||||
namespace mozilla {
|
||||
namespace devtools {
|
||||
|
||||
DeserializedEdge::DeserializedEdge()
|
||||
: referent(0)
|
||||
, name(nullptr)
|
||||
{ }
|
||||
|
||||
DeserializedEdge::DeserializedEdge(DeserializedEdge&& rhs)
|
||||
{
|
||||
referent = rhs.referent;
|
||||
@@ -29,26 +24,6 @@ DeserializedEdge& DeserializedEdge::operator=(DeserializedEdge&& rhs)
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool
|
||||
DeserializedEdge::init(const protobuf::Edge& edge, HeapSnapshot& owner)
|
||||
{
|
||||
// Although the referent property is optional in the protobuf format for
|
||||
// future compatibility, we can't semantically have an edge to nowhere and
|
||||
// require a referent here.
|
||||
if (!edge.has_referent())
|
||||
return false;
|
||||
referent = edge.referent();
|
||||
|
||||
if (edge.has_name()) {
|
||||
const char16_t* duplicateEdgeName = reinterpret_cast<const char16_t*>(edge.name().c_str());
|
||||
name = owner.borrowUniqueString(duplicateEdgeName, edge.name().length() / sizeof(char16_t));
|
||||
if (!name)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
JS::ubi::Node
|
||||
DeserializedNode::getEdgeReferent(const DeserializedEdge& edge)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user