Bug 1533003 - Add PrivateScriptData::InitFromEmitter r=jandem

Depends on D22320

Differential Revision: https://phabricator.services.mozilla.com/D22321

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Ted Campbell 2019-03-06 18:06:35 +00:00
parent 228743c20b
commit c5c0086ee2
2 changed files with 50 additions and 25 deletions

View File

@ -549,9 +549,9 @@ XDRResult js::PrivateScriptData::XDR(XDRState<mode>* xdr, HandleScript script,
HandleScriptSourceObject sourceObject,
HandleScope scriptEnclosingScope,
HandleFunction fun) {
uint32_t nscopes = 0;
uint32_t nconsts = 0;
uint32_t nobjects = 0;
uint32_t nscopes = 0;
uint32_t ntrynotes = 0;
uint32_t nscopenotes = 0;
uint32_t nresumeoffsets = 0;
@ -3223,6 +3223,45 @@ PrivateScriptData* PrivateScriptData::new_(JSContext* cx, uint32_t nscopes,
nscopenotes, nresumeoffsets);
}
/* static */ bool PrivateScriptData::InitFromEmitter(
JSContext* cx, js::HandleScript script, frontend::BytecodeEmitter* bce) {
uint32_t nscopes = bce->scopeList.length();
uint32_t nconsts = bce->numberList.length();
uint32_t nobjects = bce->objectList.length;
uint32_t ntrynotes = bce->tryNoteList.length();
uint32_t nscopenotes = bce->scopeNoteList.length();
uint32_t nresumeoffsets = bce->resumeOffsetList.length();
// Create and initialize PrivateScriptData
if (!JSScript::createPrivateScriptData(cx, script, nscopes, nconsts, nobjects,
ntrynotes, nscopenotes,
nresumeoffsets)) {
return false;
}
js::PrivateScriptData* data = script->data_;
if (nscopes) {
bce->scopeList.finish(data->scopes());
}
if (nconsts) {
bce->numberList.finish(data->consts());
}
if (nobjects) {
bce->objectList.finish(data->objects());
}
if (ntrynotes) {
bce->tryNoteList.finish(data->tryNotes());
}
if (nscopenotes) {
bce->scopeNoteList.finish(data->scopeNotes());
}
if (nresumeoffsets) {
bce->resumeOffsetList.finish(data->resumeOffsets());
}
return true;
}
void PrivateScriptData::traceChildren(JSTracer* trc) {
auto scopearray = scopes();
TraceRange(trc, scopearray.size(), scopearray.data(), "scopes");
@ -3575,10 +3614,8 @@ bool JSScript::fullyInitFromEmitter(JSContext* cx, HandleScript script,
script->setFlag(ImmutableFlags::NeedsFunctionEnvironmentObjects,
NeedsFunctionEnvironmentObjects(bce));
if (!createPrivateScriptData(
cx, script, bce->scopeList.length(), bce->numberList.length(),
bce->objectList.length, bce->tryNoteList.length(),
bce->scopeNoteList.length(), bce->resumeOffsetList.length())) {
// Create and initialize PrivateScriptData
if (!PrivateScriptData::InitFromEmitter(cx, script, bce)) {
return false;
}
@ -3599,26 +3636,6 @@ bool JSScript::fullyInitFromEmitter(JSContext* cx, HandleScript script,
return false;
}
js::PrivateScriptData* data = script->data_;
if (bce->numberList.length() != 0) {
bce->numberList.finish(data->consts());
}
if (bce->objectList.length != 0) {
bce->objectList.finish(data->objects());
}
if (bce->scopeList.length() != 0) {
bce->scopeList.finish(data->scopes());
}
if (bce->tryNoteList.length() != 0) {
bce->tryNoteList.finish(data->tryNotes());
}
if (bce->scopeNoteList.length() != 0) {
bce->scopeNoteList.finish(data->scopeNotes());
}
if (bce->resumeOffsetList.length() != 0) {
bce->resumeOffsetList.finish(data->resumeOffsets());
}
// There shouldn't be any fallible operation after initFromFunctionBox,
// JSFunction::hasUncompletedScript relies on the fact that the existence
// of the pointer to JSScript means the pointed JSScript is complete.

View File

@ -1447,6 +1447,9 @@ class alignas(JS::Value) PrivateScriptData final {
static bool Clone(JSContext* cx, js::HandleScript src, js::HandleScript dst,
js::MutableHandle<JS::GCVector<js::Scope*>> scopes);
static bool InitFromEmitter(JSContext* cx, js::HandleScript script,
js::frontend::BytecodeEmitter* bce);
void traceChildren(JSTracer* trc);
};
@ -1864,6 +1867,10 @@ class JSScript : public js::gc::TenuredCell {
JSContext* cx, js::HandleScript src, js::HandleScript dst,
js::MutableHandle<JS::GCVector<js::Scope*>> scopes);
friend bool js::PrivateScriptData::InitFromEmitter(
JSContext* cx, js::HandleScript script,
js::frontend::BytecodeEmitter* bce);
friend JSScript* js::detail::CopyScript(
JSContext* cx, js::HandleScript src,
js::HandleScriptSourceObject sourceObject,
@ -1911,6 +1918,7 @@ class JSScript : public js::gc::TenuredCell {
private:
// Assert that jump targets are within the code array of the script.
void assertValidJumpTargets() const;
public:
#endif