Bug 1163810 - Use type-based dispatch for IncrementalReferenceBarrier; r=jonco
This commit is contained in:
@@ -7162,40 +7162,19 @@ JS::IsIncrementalBarrierNeeded(JSContext* cx)
|
||||
return IsIncrementalBarrierNeeded(cx->runtime());
|
||||
}
|
||||
|
||||
struct IncrementalReferenceBarrierFunctor {
|
||||
template <typename T> void operator()(gc::Cell* cell) {
|
||||
T::writeBarrierPre(static_cast<T*>(cell));
|
||||
}
|
||||
};
|
||||
|
||||
JS_PUBLIC_API(void)
|
||||
JS::IncrementalReferenceBarrier(GCCellPtr thing)
|
||||
{
|
||||
if (!thing)
|
||||
return;
|
||||
|
||||
if (thing.isString() && thing.toString()->isPermanentAtom())
|
||||
return;
|
||||
|
||||
#ifdef DEBUG
|
||||
Zone* zone = thing.isObject()
|
||||
? thing.toObject()->zone()
|
||||
: thing.asCell()->asTenured().zone();
|
||||
MOZ_ASSERT(!zone->runtimeFromMainThread()->isHeapMajorCollecting());
|
||||
#endif
|
||||
|
||||
switch(thing.kind()) {
|
||||
case JSTRACE_OBJECT: return JSObject::writeBarrierPre(thing.toObject());
|
||||
case JSTRACE_STRING: return JSString::writeBarrierPre(thing.toString());
|
||||
case JSTRACE_SCRIPT: return JSScript::writeBarrierPre(thing.toScript());
|
||||
case JSTRACE_SYMBOL: return JS::Symbol::writeBarrierPre(thing.toSymbol());
|
||||
case JSTRACE_LAZY_SCRIPT:
|
||||
return LazyScript::writeBarrierPre(static_cast<LazyScript*>(thing.asCell()));
|
||||
case JSTRACE_JITCODE:
|
||||
return jit::JitCode::writeBarrierPre(static_cast<jit::JitCode*>(thing.asCell()));
|
||||
case JSTRACE_SHAPE:
|
||||
return Shape::writeBarrierPre(static_cast<Shape*>(thing.asCell()));
|
||||
case JSTRACE_BASE_SHAPE:
|
||||
return BaseShape::writeBarrierPre(static_cast<BaseShape*>(thing.asCell()));
|
||||
case JSTRACE_OBJECT_GROUP:
|
||||
return ObjectGroup::writeBarrierPre(static_cast<ObjectGroup*>(thing.asCell()));
|
||||
default:
|
||||
MOZ_CRASH("Invalid trace kind in IncrementalReferenceBarrier.");
|
||||
}
|
||||
CallTyped(IncrementalReferenceBarrierFunctor(), thing.kind(), thing.asCell());
|
||||
}
|
||||
|
||||
JS_PUBLIC_API(void)
|
||||
|
||||
Reference in New Issue
Block a user