зеркало из https://github.com/mozilla/gecko-dev.git
Bug 743047 - Make the script atoms HeapPointers; r=billm
These are only initialized and then read from, but we need to barrier the init so that we will have a remembered set entry for atoms that are in the nursery. --HG-- extra : rebase_source : 9a5a1eb3e0c76d4624a978627ff901d336b0c540
This commit is contained in:
Родитель
92ed04c94f
Коммит
8576312a1c
|
@ -502,8 +502,10 @@ js_DumpAtoms(JSContext *cx, FILE *fp)
|
||||||
|
|
||||||
JS_STATIC_ASSERT(TEMP_SIZE_START >= sizeof(JSHashTable));
|
JS_STATIC_ASSERT(TEMP_SIZE_START >= sizeof(JSHashTable));
|
||||||
|
|
||||||
|
namespace js {
|
||||||
|
|
||||||
void
|
void
|
||||||
js_InitAtomMap(JSContext *cx, AtomIndexMap *indices, JSAtom **atoms)
|
InitAtomMap(JSContext *cx, AtomIndexMap *indices, HeapPtrAtom *atoms)
|
||||||
{
|
{
|
||||||
if (indices->isMap()) {
|
if (indices->isMap()) {
|
||||||
typedef AtomIndexMap::WordMap WordMap;
|
typedef AtomIndexMap::WordMap WordMap;
|
||||||
|
@ -512,7 +514,7 @@ js_InitAtomMap(JSContext *cx, AtomIndexMap *indices, JSAtom **atoms)
|
||||||
JSAtom *atom = r.front().key;
|
JSAtom *atom = r.front().key;
|
||||||
jsatomid index = r.front().value;
|
jsatomid index = r.front().value;
|
||||||
JS_ASSERT(index < indices->count());
|
JS_ASSERT(index < indices->count());
|
||||||
atoms[index] = atom;
|
atoms[index].init(atom);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (const AtomIndexMap::InlineElem *it = indices->asInline(), *end = indices->inlineEnd();
|
for (const AtomIndexMap::InlineElem *it = indices->asInline(), *end = indices->inlineEnd();
|
||||||
|
@ -521,13 +523,11 @@ js_InitAtomMap(JSContext *cx, AtomIndexMap *indices, JSAtom **atoms)
|
||||||
if (!atom)
|
if (!atom)
|
||||||
continue;
|
continue;
|
||||||
JS_ASSERT(it->value < indices->count());
|
JS_ASSERT(it->value < indices->count());
|
||||||
atoms[it->value] = atom;
|
atoms[it->value].init(atom);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace js {
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
IndexToIdSlow(JSContext *cx, uint32_t index, jsid *idp)
|
IndexToIdSlow(JSContext *cx, uint32_t index, jsid *idp)
|
||||||
{
|
{
|
||||||
|
|
|
@ -470,15 +470,15 @@ inline bool
|
||||||
js_InternNonIntElementId(JSContext *cx, JSObject *obj, const js::Value &idval,
|
js_InternNonIntElementId(JSContext *cx, JSObject *obj, const js::Value &idval,
|
||||||
jsid *idp, js::Value *vp);
|
jsid *idp, js::Value *vp);
|
||||||
|
|
||||||
|
namespace js {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For all unmapped atoms recorded in al, add a mapping from the atom's index
|
* For all unmapped atoms recorded in al, add a mapping from the atom's index
|
||||||
* to its address. map->length must already be set to the number of atoms in
|
* to its address. map->length must already be set to the number of atoms in
|
||||||
* the list and map->vector must point to pre-allocated memory.
|
* the list and map->vector must point to pre-allocated memory.
|
||||||
*/
|
*/
|
||||||
extern void
|
extern void
|
||||||
js_InitAtomMap(JSContext *cx, js::AtomIndexMap *indices, JSAtom **atoms);
|
InitAtomMap(JSContext *cx, AtomIndexMap *indices, HeapPtrAtom *atoms);
|
||||||
|
|
||||||
namespace js {
|
|
||||||
|
|
||||||
template<XDRMode mode>
|
template<XDRMode mode>
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -390,7 +390,7 @@ CallSetter(JSContext *cx, JSObject *obj, jsid id, StrictPropertyOp op, unsigned
|
||||||
return CallJSPropertyOpSetter(cx, op, obj, id, strict, vp);
|
return CallJSPropertyOpSetter(cx, op, obj, id, strict, vp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline JSAtom **
|
static inline HeapPtrAtom *
|
||||||
FrameAtomBase(JSContext *cx, js::StackFrame *fp)
|
FrameAtomBase(JSContext *cx, js::StackFrame *fp)
|
||||||
{
|
{
|
||||||
return fp->script()->atoms;
|
return fp->script()->atoms;
|
||||||
|
|
|
@ -1509,7 +1509,7 @@ js::Interpret(JSContext *cx, StackFrame *entryFrame, InterpMode interpMode)
|
||||||
* access. For less frequent object loads we have to recover the segment
|
* access. For less frequent object loads we have to recover the segment
|
||||||
* from atoms pointer first.
|
* from atoms pointer first.
|
||||||
*/
|
*/
|
||||||
JSAtom **atoms = script->atoms;
|
HeapPtrAtom *atoms = script->atoms;
|
||||||
|
|
||||||
#if JS_HAS_GENERATORS
|
#if JS_HAS_GENERATORS
|
||||||
if (JS_UNLIKELY(regs.fp()->isGeneratorFrame())) {
|
if (JS_UNLIKELY(regs.fp()->isGeneratorFrame())) {
|
||||||
|
|
|
@ -674,8 +674,16 @@ js::XDRScript(XDRState<mode> *xdr, JSScript **scriptp, JSScript *parentScript)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i != natoms; ++i) {
|
for (i = 0; i != natoms; ++i) {
|
||||||
if (!XDRAtom(xdr, &script->atoms[i]))
|
if (mode == XDR_DECODE) {
|
||||||
return false;
|
JSAtom *tmp = NULL;
|
||||||
|
if (!XDRAtom(xdr, &tmp))
|
||||||
|
return false;
|
||||||
|
script->atoms[i].init(tmp);
|
||||||
|
} else {
|
||||||
|
JSAtom *tmp = script->atoms[i];
|
||||||
|
if (!XDRAtom(xdr, &tmp))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1106,7 +1114,7 @@ JSScript::NewScript(JSContext *cx, uint32_t length, uint32_t nsrcnotes, uint32_t
|
||||||
|
|
||||||
if (natoms != 0) {
|
if (natoms != 0) {
|
||||||
script->natoms = natoms;
|
script->natoms = natoms;
|
||||||
script->atoms = reinterpret_cast<JSAtom **>(cursor);
|
script->atoms = reinterpret_cast<HeapPtrAtom *>(cursor);
|
||||||
cursor += natoms * sizeof(script->atoms[0]);
|
cursor += natoms * sizeof(script->atoms[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1205,7 +1213,7 @@ JSScript::NewScriptFromEmitter(JSContext *cx, BytecodeEmitter *bce)
|
||||||
nfixed = bce->inFunction() ? bce->bindings.countVars() : 0;
|
nfixed = bce->inFunction() ? bce->bindings.countVars() : 0;
|
||||||
JS_ASSERT(nfixed < SLOTNO_LIMIT);
|
JS_ASSERT(nfixed < SLOTNO_LIMIT);
|
||||||
script->nfixed = uint16_t(nfixed);
|
script->nfixed = uint16_t(nfixed);
|
||||||
js_InitAtomMap(cx, bce->atomIndices.getMap(), script->atoms);
|
InitAtomMap(cx, bce->atomIndices.getMap(), script->atoms);
|
||||||
|
|
||||||
filename = bce->parser->tokenStream.getFilename();
|
filename = bce->parser->tokenStream.getFilename();
|
||||||
if (filename) {
|
if (filename) {
|
||||||
|
@ -1828,7 +1836,7 @@ JSScript::markChildren(JSTracer *trc)
|
||||||
|
|
||||||
for (uint32_t i = 0; i < natoms; ++i) {
|
for (uint32_t i = 0; i < natoms; ++i) {
|
||||||
if (atoms[i])
|
if (atoms[i])
|
||||||
MarkStringUnbarriered(trc, &atoms[i], "atom");
|
MarkString(trc, &atoms[i], "atom");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (JSScript::isValidOffset(objectsOffset)) {
|
if (JSScript::isValidOffset(objectsOffset)) {
|
||||||
|
|
|
@ -409,7 +409,7 @@ struct JSScript : public js::gc::Cell
|
||||||
comment above NewScript() for details) */
|
comment above NewScript() for details) */
|
||||||
|
|
||||||
const char *filename; /* source filename or null */
|
const char *filename; /* source filename or null */
|
||||||
JSAtom **atoms; /* maps immediate index to literal struct */
|
js::HeapPtrAtom *atoms; /* maps immediate index to literal struct */
|
||||||
|
|
||||||
JSPrincipals *principals;/* principals for this script */
|
JSPrincipals *principals;/* principals for this script */
|
||||||
JSPrincipals *originPrincipals; /* see jsapi.h 'originPrincipals' comment */
|
JSPrincipals *originPrincipals; /* see jsapi.h 'originPrincipals' comment */
|
||||||
|
@ -755,7 +755,7 @@ struct JSScript : public js::gc::Cell
|
||||||
return isValidOffset(closedVarsOffset) ? closedVars()->length : 0;
|
return isValidOffset(closedVarsOffset) ? closedVars()->length : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
JSAtom *getAtom(size_t index) {
|
js::HeapPtrAtom &getAtom(size_t index) const {
|
||||||
JS_ASSERT(index < natoms);
|
JS_ASSERT(index < natoms);
|
||||||
return atoms[index];
|
return atoms[index];
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче