Bug 1163810 - Use type-based dispatch for IncrementalReferenceBarrier; r=jonco

This commit is contained in:
Terrence Cole
2015-05-13 19:13:49 -07:00
parent 58ee16082f
commit b8f5b95d0a
3 changed files with 13 additions and 29 deletions

View File

@@ -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)