bug 560471 - followup to fix restoration of weak roots

This commit is contained in:
Igor Bukanov 2010-04-24 20:35:50 +02:00
parent 27452b9484
commit 45a0a3043e
3 changed files with 10 additions and 5 deletions

View File

@ -1710,16 +1710,21 @@ class AutoGCRooter {
void operator=(AutoGCRooter &ida);
};
class AutoSaveWeakRoots : private AutoGCRooter
class AutoSaveRestoreWeakRoots : private AutoGCRooter
{
public:
explicit AutoSaveWeakRoots(JSContext *cx
explicit AutoSaveRestoreWeakRoots(JSContext *cx
JS_GUARD_OBJECT_NOTIFIER_PARAM)
: AutoGCRooter(cx, WEAKROOTS), savedRoots(cx->weakRoots)
{
JS_GUARD_OBJECT_NOTIFIER_INIT;
}
~AutoSaveRestoreWeakRoots()
{
context->weakRoots = savedRoots;
}
friend void AutoGCRooter::trace(JSTracer *trc);
private:

View File

@ -78,7 +78,7 @@ AutoGCRooter::trace(JSTracer *trc)
return;
case WEAKROOTS:
static_cast<AutoSaveWeakRoots *>(this)->savedRoots.mark(trc);
static_cast<AutoSaveRestoreWeakRoots *>(this)->savedRoots.mark(trc);
return;
case PARSER:

View File

@ -1408,7 +1408,7 @@ LastDitchGC(JSContext *cx)
JS_ASSERT(!JS_ON_TRACE(cx));
/* The last ditch GC preserves weak roots and all atoms. */
AutoSaveWeakRoots save(cx);
AutoSaveRestoreWeakRoots save(cx);
AutoKeepAtoms keep(cx->runtime);
/*