mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-15 14:25:52 +00:00
Bug 893184 - Call constructors for HeapPtrAtoms allocated as part of shared script data r=till
This commit is contained in:
parent
89069fe47e
commit
05d146d904
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user