mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1024774 - Part 14: Ignore protobuf indirect calls in the GC hazard analysis;
r=sfink
This commit is contained in:
parent
0a7d86df07
commit
240bce0bc4
@ -13,7 +13,7 @@ var ignoreIndirectCalls = {
|
||||
"__conv" : true,
|
||||
"__convf" : true,
|
||||
"prerrortable.c:callback_newtable" : true,
|
||||
"mozalloc_oom.cpp:void (* gAbortHandler)(size_t)" : true
|
||||
"mozalloc_oom.cpp:void (* gAbortHandler)(size_t)" : true,
|
||||
};
|
||||
|
||||
function indirectCallCannotGC(fullCaller, fullVariable)
|
||||
@ -174,8 +174,34 @@ var ignoreFunctions = {
|
||||
// And these are workarounds to avoid even more analysis work,
|
||||
// which would sadly still be needed even with bug 898815.
|
||||
"void js::AutoCompartment::AutoCompartment(js::ExclusiveContext*, JSCompartment*)": true,
|
||||
|
||||
// Similar to heap snapshot mock classes, and GTests below. This posts a
|
||||
// synchronous runnable when a GTest fails, and we are pretty sure that the
|
||||
// particular runnable it posts can't even GC, but the analysis isn't
|
||||
// currently smart enough to determine that. In either case, this is (a)
|
||||
// only in GTests, and (b) only when the Gtest has already failed. We have
|
||||
// static and dynamic checks for no GC in the non-test code, and in the test
|
||||
// code we fall back to only the dynamic checks.
|
||||
"void test::RingbufferDumper::OnTestPartResult(testing::TestPartResult*)" : true,
|
||||
};
|
||||
|
||||
function isProtobuf(name)
|
||||
{
|
||||
return name.match(/\bgoogle::protobuf\b/) ||
|
||||
name.match(/\bmozilla::devtools::protobuf\b/);
|
||||
}
|
||||
|
||||
function isHeapSnapshotMockClass(name)
|
||||
{
|
||||
return name.match(/\bMockWriter\b/) ||
|
||||
name.match(/\bMockDeserializedNode\b/);
|
||||
}
|
||||
|
||||
function isGTest(name)
|
||||
{
|
||||
return name.match(/\btesting::/);
|
||||
}
|
||||
|
||||
function ignoreGCFunction(mangled)
|
||||
{
|
||||
assert(mangled in readableNames);
|
||||
@ -184,6 +210,23 @@ function ignoreGCFunction(mangled)
|
||||
if (fun in ignoreFunctions)
|
||||
return true;
|
||||
|
||||
// The protobuf library, and [de]serialization code generated by the
|
||||
// protobuf compiler, uses a _ton_ of function pointers but they are all
|
||||
// internal. Easiest to just ignore that mess here.
|
||||
if (isProtobuf(fun))
|
||||
return true;
|
||||
|
||||
// Ignore anything that goes through heap snapshot GTests or mocked classes
|
||||
// used in heap snapshot GTests. GTest and GMock expose a lot of virtual
|
||||
// methods and function pointers that could potentially GC after an
|
||||
// assertion has already failed (depending on user-provided code), but don't
|
||||
// exhibit that behavior currently. For non-test code, we have dynamic and
|
||||
// static checks that ensure we don't GC. However, for test code we opt out
|
||||
// of static checks here, because of the above stated GMock/GTest issues,
|
||||
// and rely on only the dynamic checks provided by AutoAssertCannotGC.
|
||||
if (isHeapSnapshotMockClass(fun) || isGTest(fun))
|
||||
return true;
|
||||
|
||||
// Templatized function
|
||||
if (fun.indexOf("void nsCOMPtr<T>::Assert_NoQueryNeeded()") >= 0)
|
||||
return true;
|
||||
|
Loading…
Reference in New Issue
Block a user