Bug 1530412 - Move LazyScript::numClosedOverBindings/numInnerFunctions to normal fields r=jorendorff

These fields will later be moved into LazyScriptData.

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

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Ted Campbell 2019-04-01 21:30:43 +00:00
Родитель c7e3e10efd
Коммит 281b3d9300
2 изменённых файлов: 56 добавлений и 42 удалений

Просмотреть файл

@ -272,6 +272,7 @@ static XDRResult XDRRelazificationInfo(XDRState<mode>* xdr, HandleFunction fun,
JSContext* cx = xdr->cx();
uint64_t packedFields;
uint32_t numClosedOverBindings;
{
uint32_t sourceStart = script->sourceStart();
uint32_t sourceEnd = script->sourceEnd();
@ -283,6 +284,7 @@ static XDRResult XDRRelazificationInfo(XDRState<mode>* xdr, HandleFunction fun,
if (mode == XDR_ENCODE) {
packedFields = lazy->packedFieldsForXDR();
numClosedOverBindings = lazy->numClosedOverBindings();
MOZ_ASSERT(sourceStart == lazy->sourceStart());
MOZ_ASSERT(sourceEnd == lazy->sourceEnd());
MOZ_ASSERT(toStringStart == lazy->toStringStart());
@ -303,12 +305,14 @@ static XDRResult XDRRelazificationInfo(XDRState<mode>* xdr, HandleFunction fun,
MOZ_TRY(xdr->codeUint64(&packedFields));
MOZ_TRY(xdr->codeUint32(&numFieldInitializers));
MOZ_TRY(xdr->codeUint32(&numClosedOverBindings));
if (mode == XDR_DECODE) {
RootedScriptSourceObject sourceObject(cx, script->sourceObject());
lazy.set(LazyScript::CreateForXDR(
cx, fun, script, enclosingScope, sourceObject, packedFields,
sourceStart, sourceEnd, toStringStart, toStringEnd, lineno, column));
cx, numClosedOverBindings, /* numInnerFunctions = */ 0, fun, script,
enclosingScope, sourceObject, packedFields, sourceStart, sourceEnd,
toStringStart, toStringEnd, lineno, column));
if (!lazy) {
return xdr->fail(JS::TranscodeResult_Throw);
}
@ -1052,6 +1056,8 @@ XDRResult js::XDRLazyScript(XDRState<mode>* xdr, HandleScope enclosingScope,
uint32_t column;
uint64_t packedFields;
uint32_t numFieldInitializers;
uint32_t numClosedOverBindings;
uint32_t numInnerFunctions;
if (mode == XDR_ENCODE) {
// Note: it's possible the LazyScript has a non-null script_ pointer
@ -1073,6 +1079,8 @@ XDRResult js::XDRLazyScript(XDRState<mode>* xdr, HandleScope enclosingScope,
} else {
numFieldInitializers = UINT32_MAX;
}
numClosedOverBindings = lazy->numClosedOverBindings();
numInnerFunctions = lazy->numInnerFunctions();
}
MOZ_TRY(xdr->codeUint32(&sourceStart));
@ -1083,11 +1091,14 @@ XDRResult js::XDRLazyScript(XDRState<mode>* xdr, HandleScope enclosingScope,
MOZ_TRY(xdr->codeUint32(&column));
MOZ_TRY(xdr->codeUint64(&packedFields));
MOZ_TRY(xdr->codeUint32(&numFieldInitializers));
MOZ_TRY(xdr->codeUint32(&numClosedOverBindings));
MOZ_TRY(xdr->codeUint32(&numInnerFunctions));
if (mode == XDR_DECODE) {
lazy.set(LazyScript::CreateForXDR(
cx, fun, nullptr, enclosingScope, sourceObject, packedFields,
sourceStart, sourceEnd, toStringStart, toStringEnd, lineno, column));
cx, numClosedOverBindings, numInnerFunctions, fun, nullptr,
enclosingScope, sourceObject, packedFields, sourceStart, sourceEnd,
toStringStart, toStringEnd, lineno, column));
if (!lazy) {
return xdr->fail(JS::TranscodeResult_Throw);
}
@ -4809,14 +4820,18 @@ bool JSScript::formalLivesInArgumentsObject(unsigned argSlot) {
return argsObjAliasesFormals() && !formalIsAliased(argSlot);
}
LazyScript::LazyScript(JSFunction* fun, ScriptSourceObject& sourceObject,
void* table, uint64_t packedFields, uint32_t sourceStart,
LazyScript::LazyScript(uint32_t numClosedOverBindings,
uint32_t numInnerFunctions, JSFunction* fun,
ScriptSourceObject& sourceObject, void* table,
uint64_t packedFields, uint32_t sourceStart,
uint32_t sourceEnd, uint32_t toStringStart,
uint32_t lineno, uint32_t column)
: script_(nullptr),
function_(fun),
sourceObject_(&sourceObject),
table_(table),
numClosedOverBindings_(numClosedOverBindings),
numInnerFunctions_(numInnerFunctions),
packedFields_(packedFields),
fieldInitializers_(FieldInitializers::Invalid()),
sourceStart_(sourceStart),
@ -4889,7 +4904,9 @@ uint64_t LazyScript::packedFieldsForXDR() const {
}
/* static */
LazyScript* LazyScript::CreateRaw(JSContext* cx, HandleFunction fun,
LazyScript* LazyScript::CreateRaw(JSContext* cx, uint32_t numClosedOverBindings,
uint32_t numInnerFunctions,
HandleFunction fun,
HandleScriptSourceObject sourceObject,
uint64_t packedFields, uint32_t sourceStart,
uint32_t sourceEnd, uint32_t toStringStart,
@ -4907,8 +4924,8 @@ LazyScript* LazyScript::CreateRaw(JSContext* cx, HandleFunction fun,
// Reset runtime flags to obtain a fresh LazyScript.
p.hasBeenCloned = false;
size_t bytes = (p.numClosedOverBindings * sizeof(JSAtom*)) +
(p.numInnerFunctions * sizeof(GCPtrFunction));
size_t bytes = (numClosedOverBindings * sizeof(JSAtom*)) +
(numInnerFunctions * sizeof(GCPtrFunction));
UniquePtr<uint8_t, JS::FreePolicy> table;
if (bytes) {
@ -4926,8 +4943,9 @@ LazyScript* LazyScript::CreateRaw(JSContext* cx, HandleFunction fun,
cx->realm()->scheduleDelazificationForDebugger();
return new (res)
LazyScript(fun, *sourceObject, table.release(), packed, sourceStart,
sourceEnd, toStringStart, lineno, column);
LazyScript(numClosedOverBindings, numInnerFunctions, fun, *sourceObject,
table.release(), packed, sourceStart, sourceEnd, toStringStart,
lineno, column);
}
/* static */
@ -4947,8 +4965,6 @@ LazyScript* LazyScript::Create(JSContext* cx, HandleFunction fun,
p.hasThisBinding = false;
p.isAsync = false;
p.hasRest = false;
p.numClosedOverBindings = closedOverBindings.length();
p.numInnerFunctions = innerFunctions.length();
p.isGenerator = false;
p.strict = false;
p.bindingsAccessedDynamically = false;
@ -4961,9 +4977,10 @@ LazyScript* LazyScript::Create(JSContext* cx, HandleFunction fun,
p.isBinAST = false;
p.parseGoal = uint32_t(parseGoal);
LazyScript* res =
LazyScript::CreateRaw(cx, fun, sourceObject, packedFields, sourceStart,
sourceEnd, toStringStart, lineno, column);
LazyScript* res = LazyScript::CreateRaw(
cx, closedOverBindings.length(), innerFunctions.length(), fun,
sourceObject, packedFields, sourceStart, sourceEnd, toStringStart, lineno,
column);
if (!res) {
return nullptr;
}
@ -4986,11 +5003,11 @@ LazyScript* LazyScript::Create(JSContext* cx, HandleFunction fun,
/* static */
LazyScript* LazyScript::CreateForXDR(
JSContext* cx, HandleFunction fun, HandleScript script,
HandleScope enclosingScope, HandleScriptSourceObject sourceObject,
uint64_t packedFields, uint32_t sourceStart, uint32_t sourceEnd,
uint32_t toStringStart, uint32_t toStringEnd, uint32_t lineno,
uint32_t column) {
JSContext* cx, uint32_t numClosedOverBindings, uint32_t numInnerFunctions,
HandleFunction fun, HandleScript script, HandleScope enclosingScope,
HandleScriptSourceObject sourceObject, uint64_t packedFields,
uint32_t sourceStart, uint32_t sourceEnd, uint32_t toStringStart,
uint32_t toStringEnd, uint32_t lineno, uint32_t column) {
// Dummy atom which is not a valid property name.
RootedAtom dummyAtom(cx, cx->names().comma);
@ -4998,9 +5015,9 @@ LazyScript* LazyScript::CreateForXDR(
// holding this lazy script.
HandleFunction dummyFun = fun;
LazyScript* res =
LazyScript::CreateRaw(cx, fun, sourceObject, packedFields, sourceStart,
sourceEnd, toStringStart, lineno, column);
LazyScript* res = LazyScript::CreateRaw(
cx, numClosedOverBindings, numInnerFunctions, fun, sourceObject,
packedFields, sourceStart, sourceEnd, toStringStart, lineno, column);
if (!res) {
return nullptr;
}

Просмотреть файл

@ -2976,18 +2976,15 @@ class LazyScript : public gc::TenuredCell {
static const uint32_t NumClosedOverBindingsBits = 20;
static const uint32_t NumInnerFunctionsBits = 20;
uint32_t numClosedOverBindings_;
uint32_t numInnerFunctions_;
struct PackedView {
uint32_t shouldDeclareArguments : 1;
uint32_t hasThisBinding : 1;
uint32_t isAsync : 1;
uint32_t isBinAST : 1;
uint32_t numClosedOverBindings : NumClosedOverBindingsBits;
// -- 32bit boundary --
uint32_t numInnerFunctions : NumInnerFunctionsBits;
// N.B. These are booleans but need to be uint32_t to pack correctly on
// MSVC. If you add another boolean here, make sure to initialize it in
// LazyScript::Create().
@ -3025,14 +3022,16 @@ class LazyScript : public gc::TenuredCell {
uint32_t lineno_;
uint32_t column_;
LazyScript(JSFunction* fun, ScriptSourceObject& sourceObject, void* table,
LazyScript(uint32_t numClosedOverBindings, uint32_t numInnerFunctions,
JSFunction* fun, ScriptSourceObject& sourceObject, void* table,
uint64_t packedFields, uint32_t sourceStart, uint32_t sourceEnd,
uint32_t toStringStart, uint32_t lineno, uint32_t column);
// Create a LazyScript without initializing the closedOverBindings and the
// innerFunctions. To be GC-safe, the caller must initialize both vectors
// with valid atoms and functions.
static LazyScript* CreateRaw(JSContext* cx, HandleFunction fun,
static LazyScript* CreateRaw(JSContext* cx, uint32_t numClosedOverBindings,
uint32_t numInnerFunctions, HandleFunction fun,
HandleScriptSourceObject sourceObject,
uint64_t packedData, uint32_t sourceStart,
uint32_t sourceEnd, uint32_t toStringStart,
@ -3062,14 +3061,12 @@ class LazyScript : public gc::TenuredCell {
//
// The sourceObject and enclosingScope arguments may be null if the
// enclosing function is also lazy.
static LazyScript* CreateForXDR(JSContext* cx, HandleFunction fun,
HandleScript script,
HandleScope enclosingScope,
HandleScriptSourceObject sourceObject,
uint64_t packedData, uint32_t sourceStart,
uint32_t sourceEnd, uint32_t toStringStart,
uint32_t toStringEnd, uint32_t lineno,
uint32_t column);
static LazyScript* CreateForXDR(
JSContext* cx, uint32_t numClosedOverBindings, uint32_t numInnerFunctions,
HandleFunction fun, HandleScript script, HandleScope enclosingScope,
HandleScriptSourceObject sourceObject, uint64_t packedData,
uint32_t sourceStart, uint32_t sourceEnd, uint32_t toStringStart,
uint32_t toStringEnd, uint32_t lineno, uint32_t column);
static inline JSFunction* functionDelazifying(JSContext* cx,
Handle<LazyScript*>);
@ -3117,10 +3114,10 @@ class LazyScript : public gc::TenuredCell {
ScriptSource* maybeForwardedScriptSource() const;
bool mutedErrors() const { return scriptSource()->mutedErrors(); }
uint32_t numClosedOverBindings() const { return p_.numClosedOverBindings; }
uint32_t numClosedOverBindings() const { return numClosedOverBindings_; }
JSAtom** closedOverBindings() { return (JSAtom**)table_; }
uint32_t numInnerFunctions() const { return p_.numInnerFunctions; }
uint32_t numInnerFunctions() const { return numInnerFunctions_; }
GCPtrFunction* innerFunctions() {
return (GCPtrFunction*)&closedOverBindings()[numClosedOverBindings()];
}