Bug 1017154 - Move RegExpShared read barriers around some more, r=billm.

This commit is contained in:
Brian Hackett 2014-05-28 13:55:25 -06:00
Родитель c290fa45ec
Коммит b0e6d07516
2 изменённых файлов: 24 добавлений и 24 удалений

Просмотреть файл

@ -102,14 +102,6 @@ RegExpObjectBuilder::build(HandleAtom source, RegExpFlag flags)
return reobj_->init(cx, source, flags) ? reobj_.get() : nullptr;
}
static inline void
MaybeTraceRegExpShared(JSContext *cx, RegExpShared *shared)
{
Zone *zone = cx->zone();
if (zone->needsBarrier())
shared->trace(zone->barrierTracer());
}
RegExpObject *
RegExpObjectBuilder::clone(Handle<RegExpObject *> other)
{
@ -138,10 +130,6 @@ RegExpObjectBuilder::clone(Handle<RegExpObject *> other)
if (!other->getShared(cx->asJSContext(), &g))
return nullptr;
// Copying a RegExpShared from one object to another requires a read
// barrier, as the shared pointer in an object may be weak.
MaybeTraceRegExpShared(cx->asJSContext(), g.re());
Rooted<JSAtom *> source(cx, other->getSource());
return build(source, *g);
}
@ -228,6 +216,29 @@ VectorMatchPairs::allocOrExpandArray(size_t pairCount)
/* RegExpObject */
static inline void
MaybeTraceRegExpShared(JSContext *cx, RegExpShared *shared)
{
Zone *zone = cx->zone();
if (zone->needsBarrier())
shared->trace(zone->barrierTracer());
}
bool
RegExpObject::getShared(JSContext *cx, RegExpGuard *g)
{
if (RegExpShared *shared = maybeShared()) {
// Fetching a RegExpShared from an object requires a read
// barrier, as the shared pointer might be weak.
MaybeTraceRegExpShared(cx, shared);
g->init(*shared);
return true;
}
return createShared(cx, g);
}
/* static */ void
RegExpObject::trace(JSTracer *trc, JSObject *obj)
{

Просмотреть файл

@ -453,18 +453,7 @@ class RegExpObject : public JSObject
bool multiline() const { return getFixedSlot(MULTILINE_FLAG_SLOT).toBoolean(); }
bool sticky() const { return getFixedSlot(STICKY_FLAG_SLOT).toBoolean(); }
void shared(RegExpGuard *g) const {
JS_ASSERT(maybeShared() != nullptr);
g->init(*maybeShared());
}
bool getShared(JSContext *cx, RegExpGuard *g) {
if (RegExpShared *shared = maybeShared()) {
g->init(*shared);
return true;
}
return createShared(cx, g);
}
bool getShared(JSContext *cx, RegExpGuard *g);
void setShared(RegExpShared &shared) {
JS_ASSERT(!maybeShared());