mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-23 18:26:15 +00:00
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:
parent
228743c20b
commit
c5c0086ee2
@ -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.
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user