Bug 866778 - GC: Make autorooter for HashableValue contain its value r=sfink

This commit is contained in:
Jon Coppeard 2013-04-30 11:18:18 +01:00
parent c5a5977c2a
commit cbe51a0ca1
3 changed files with 26 additions and 22 deletions

View File

@ -1181,8 +1181,7 @@ MapObject::construct(JSContext *cx, unsigned argc, Value *vp)
if (!JSObject::getElement(cx, pairobj, pairobj, 0, &key))
return false;
HashableValue hkey;
HashableValue::AutoRooter hkeyRoot(cx, &hkey);
AutoHashableValueRooter hkey(cx);
if (!hkey.setValue(cx, key))
return false;
@ -1212,8 +1211,7 @@ MapObject::is(const Value &v)
}
#define ARG0_KEY(cx, args, key) \
HashableValue key; \
HashableValue::AutoRooter keyRoot(cx, &key); \
AutoHashableValueRooter key(cx); \
if (args.length() > 0 && !key.setValue(cx, args[0])) \
return false
@ -1628,8 +1626,7 @@ SetObject::construct(JSContext *cx, unsigned argc, Value *vp)
if (args.hasDefined(0)) {
ForOfIterator iter(cx, args[0]);
while (iter.next()) {
HashableValue key;
HashableValue::AutoRooter hkeyRoot(cx, &key);
AutoHashableValueRooter key(cx);
if (!key.setValue(cx, iter.value()))
return false;
if (!set->put(key)) {

View File

@ -43,25 +43,32 @@ class HashableValue {
bool operator==(const HashableValue &other) const;
HashableValue mark(JSTracer *trc) const;
Value get() const { return value.get(); }
};
class AutoRooter : private AutoGCRooter
{
public:
explicit AutoRooter(JSContext *cx, HashableValue *v_
MOZ_GUARD_OBJECT_NOTIFIER_PARAM)
: AutoGCRooter(cx, HASHABLEVALUE), v(v_), skip(cx, v_)
class AutoHashableValueRooter : private AutoGCRooter
{
public:
explicit AutoHashableValueRooter(JSContext *cx
MOZ_GUARD_OBJECT_NOTIFIER_PARAM)
: AutoGCRooter(cx, HASHABLEVALUE)
{
MOZ_GUARD_OBJECT_NOTIFIER_INIT;
}
friend void AutoGCRooter::trace(JSTracer *trc);
void trace(JSTracer *trc);
bool setValue(JSContext *cx, const Value &v) {
return value.setValue(cx, v);
}
private:
HashableValue *v;
SkipRoot skip;
MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
};
operator const HashableValue & () {
return value;
}
friend void AutoGCRooter::trace(JSTracer *trc);
void trace(JSTracer *trc);
private:
HashableValue value;
MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
};
template <class Key, class Value, class OrderedHashPolicy, class AllocPolicy>

View File

@ -519,7 +519,7 @@ AutoGCRooter::trace(JSTracer *trc)
}
case HASHABLEVALUE: {
HashableValue::AutoRooter *rooter = static_cast<HashableValue::AutoRooter *>(this);
AutoHashableValueRooter *rooter = static_cast<AutoHashableValueRooter *>(this);
rooter->trace(trc);
return;
}
@ -622,9 +622,9 @@ JS::CustomAutoRooter::traceValue(JSTracer *trc, JS::Value *thingp, const char *n
}
void
HashableValue::AutoRooter::trace(JSTracer *trc)
AutoHashableValueRooter::trace(JSTracer *trc)
{
MarkValueRoot(trc, reinterpret_cast<Value*>(&v->value), "HashableValue::AutoRooter");
MarkValueRoot(trc, reinterpret_cast<Value*>(&value), "AutoHashableValueRooter");
}
void