зеркало из https://github.com/mozilla/pjs.git
[Second check-in attempt; last night's was backed out, but I claim it was because of bad dependencies or timestamp problems in the Win32 builds. /be] Add cx->lastAtom, a long overdue addition to the per-context GC root set (196461, r=shaver).
This commit is contained in:
Родитель
afcdd1102f
Коммит
22565d8287
|
@ -1518,6 +1518,7 @@ JS_ClearNewbornRoots(JSContext *cx)
|
|||
|
||||
for (i = 0; i < GCX_NTYPES; i++)
|
||||
cx->newborn[i] = NULL;
|
||||
cx->lastAtom = NULL;
|
||||
}
|
||||
|
||||
#include "jshash.h" /* Added by JSIFY */
|
||||
|
|
|
@ -459,6 +459,7 @@ js_AtomizeHashedKey(JSContext *cx, jsval key, JSHashNumber keyHash, uintN flags)
|
|||
|
||||
atom = (JSAtom *)he;
|
||||
atom->flags |= flags;
|
||||
cx->lastAtom = atom;
|
||||
out:
|
||||
JS_UNLOCK(&state->lock,cx);
|
||||
return atom;
|
||||
|
@ -549,6 +550,7 @@ js_AtomizeDouble(JSContext *cx, jsdouble d, uintN flags)
|
|||
|
||||
atom = (JSAtom *)he;
|
||||
atom->flags |= flags;
|
||||
cx->lastAtom = atom;
|
||||
out:
|
||||
JS_UNLOCK(&state->lock,cx);
|
||||
return atom;
|
||||
|
@ -611,6 +613,7 @@ js_AtomizeString(JSContext *cx, JSString *str, uintN flags)
|
|||
|
||||
atom = (JSAtom *)he;
|
||||
atom->flags |= flags & (ATOM_PINNED | ATOM_INTERNED);
|
||||
cx->lastAtom = atom;
|
||||
out:
|
||||
JS_UNLOCK(&state->lock,cx);
|
||||
return atom;
|
||||
|
|
|
@ -317,6 +317,9 @@ struct JSContext {
|
|||
/* Most recently created things by type, members of the GC's root set. */
|
||||
JSGCThing *newborn[GCX_NTYPES];
|
||||
|
||||
/* Atom root for the last-looked-up atom on this context. */
|
||||
JSAtom *lastAtom;
|
||||
|
||||
/* Regular expression class statics (XXX not shared globally). */
|
||||
JSRegExpStatics regExpStatics;
|
||||
|
||||
|
|
|
@ -759,7 +759,7 @@ gc_dump_thing(JSGCThing *thing, uint8 flags, GCMarkNode *prev, FILE *fp)
|
|||
? NULL
|
||||
: JSVAL_TO_PRIVATE(privateValue);
|
||||
const char *className = gc_object_class_name(thing);
|
||||
fprintf(fp, "object %08p %s", privateThing, className);
|
||||
fprintf(fp, "object %8p %s", privateThing, className);
|
||||
break;
|
||||
}
|
||||
case GCX_DOUBLE:
|
||||
|
@ -989,6 +989,7 @@ js_ForceGC(JSContext *cx, uintN gcflags)
|
|||
|
||||
for (i = 0; i < GCX_NTYPES; i++)
|
||||
cx->newborn[i] = NULL;
|
||||
cx->lastAtom = NULL;
|
||||
cx->runtime->gcPoke = JS_TRUE;
|
||||
js_GC(cx, gcflags);
|
||||
JS_ArenaFinish();
|
||||
|
@ -1261,6 +1262,8 @@ restart:
|
|||
NULL);
|
||||
for (i = GCX_EXTERNAL_STRING; i < GCX_NTYPES; i++)
|
||||
GC_MARK(cx, acx->newborn[i], "newborn external string", NULL);
|
||||
if (acx->lastAtom)
|
||||
GC_MARK_ATOM(cx, acx->lastAtom, NULL);
|
||||
#if JS_HAS_EXCEPTIONS
|
||||
if (acx->throwing && JSVAL_IS_GCTHING(acx->exception))
|
||||
GC_MARK(cx, JSVAL_TO_GCTHING(acx->exception), "exception", NULL);
|
||||
|
|
Загрузка…
Ссылка в новой задаче