mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 866778 - GC: Make autorooter for HashableValue contain its value r=sfink
This commit is contained in:
parent
c5a5977c2a
commit
cbe51a0ca1
@ -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)) {
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user