Bug 893184 - Call constructors for HeapPtrAtoms allocated as part of shared script data r=till

This commit is contained in:
Jon Coppeard 2013-08-20 16:40:27 +01:00
parent 89069fe47e
commit 05d146d904
2 changed files with 38 additions and 14 deletions

View File

@ -637,7 +637,7 @@ js::XDRScript(XDRState<mode> *xdr, HandleObject enclosingScope, HandleScript enc
code = ssd->data;
if (natoms != 0) {
script->natoms = natoms;
script->atoms = ssd->atoms(length, nsrcnotes);
script->atoms = ssd->atoms();
}
}
@ -1515,18 +1515,35 @@ SharedScriptData *
js::SharedScriptData::new_(ExclusiveContext *cx, uint32_t codeLength,
uint32_t srcnotesLength, uint32_t natoms)
{
/*
* Ensure the atoms are aligned, as some architectures don't allow unaligned
* access.
*/
const uint32_t pointerSize = sizeof(JSAtom *);
const uint32_t pointerMask = pointerSize - 1;
const uint32_t dataOffset = offsetof(SharedScriptData, data);
uint32_t baseLength = codeLength + srcnotesLength;
uint32_t padding = sizeof(JSAtom *) - baseLength % sizeof(JSAtom *);
uint32_t length = baseLength + padding + sizeof(JSAtom *) * natoms;
SharedScriptData *entry = (SharedScriptData *)cx->malloc_(length +
offsetof(SharedScriptData, data));
uint32_t padding = (pointerSize - ((baseLength + dataOffset) & pointerMask)) & pointerMask;
uint32_t length = baseLength + padding + pointerSize * natoms;
SharedScriptData *entry = (SharedScriptData *)cx->malloc_(length + dataOffset);
if (!entry)
return NULL;
entry->marked = false;
entry->length = length;
entry->natoms = natoms;
entry->marked = false;
memset(entry->data + baseLength, 0, padding);
/*
* Call constructors to initialize the storage that will be accessed as a
* HeapPtrAtom array via atoms().
*/
HeapPtrAtom *atoms = entry->atoms();
JS_ASSERT(reinterpret_cast<uintptr_t>(atoms) % sizeof(JSAtom *) == 0);
for (unsigned i = 0; i < natoms; ++i)
new (&atoms[i]) HeapPtrAtom();
return entry;
}
@ -1553,6 +1570,8 @@ SaveSharedScriptData(ExclusiveContext *cx, Handle<JSScript *> script, SharedScri
ssd = *p;
} else {
if (!cx->scriptDataTable().add(p, ssd)) {
script->code = NULL;
script->atoms = NULL;
js_free(ssd);
js_ReportOutOfMemory(cx);
return false;
@ -1574,7 +1593,7 @@ SaveSharedScriptData(ExclusiveContext *cx, Handle<JSScript *> script, SharedScri
#endif
script->code = ssd->data;
script->atoms = ssd->atoms(script->length, nsrcnotes);
script->atoms = ssd->atoms();
return true;
}
@ -1918,7 +1937,7 @@ JSScript::fullyInitFromEmitter(ExclusiveContext *cx, HandleScript script, Byteco
PodCopy<jsbytecode>(code + prologLength, bce->code().begin(), mainLength);
if (!FinishTakingSrcNotes(cx, bce, (jssrcnote *)(code + script->length)))
return false;
InitAtomMap(bce->atomIndices.getMap(), ssd->atoms(script->length, nsrcnotes));
InitAtomMap(bce->atomIndices.getMap(), ssd->atoms());
if (!SaveSharedScriptData(cx, script, ssd, nsrcnotes))
return false;

View File

@ -1427,22 +1427,27 @@ CallDestroyScriptHook(FreeOp *fop, JSScript *script);
struct SharedScriptData
{
bool marked;
uint32_t length;
uint32_t natoms;
bool marked;
jsbytecode data[1];
static SharedScriptData *new_(ExclusiveContext *cx, uint32_t codeLength,
uint32_t srcnotesLength, uint32_t natoms);
HeapPtrAtom *atoms(uint32_t codeLength, uint32_t srcnotesLength) {
uint32_t length = codeLength + srcnotesLength;
return reinterpret_cast<HeapPtrAtom *>(data + length + sizeof(JSAtom *) -
length % sizeof(JSAtom *));
HeapPtrAtom *atoms() {
if (!natoms)
return NULL;
return reinterpret_cast<HeapPtrAtom *>(data + length - sizeof(JSAtom *) * natoms);
}
static SharedScriptData *fromBytecode(const jsbytecode *bytecode) {
return (SharedScriptData *)(bytecode - offsetof(SharedScriptData, data));
}
private:
SharedScriptData() MOZ_DELETE;
SharedScriptData(const SharedScriptData&) MOZ_DELETE;
};
struct ScriptBytecodeHasher