#533: eliminate one potential cause

This commit is contained in:
Cameron Kaiser 2019-08-20 11:51:42 -07:00
parent 46b01b5d42
commit 92cb6b7de4
4 changed files with 28 additions and 4 deletions

View File

@ -1018,6 +1018,14 @@ class FullParseHandler
syntaxParser = nullptr; syntaxParser = nullptr;
} }
// TenFourFox issue 533, from M1263355
bool canSkipLazyInnerFunctions() {
return !!lazyOuterFunction_;
}
bool canSkipLazyClosedOverBindings() {
return !!lazyOuterFunction_;
}
LazyScript* lazyOuterFunction() { LazyScript* lazyOuterFunction() {
return lazyOuterFunction_; return lazyOuterFunction_;
} }

View File

@ -1120,8 +1120,11 @@ Parser<FullParseHandler>::defineFunctionThis()
// Also define a this-binding if direct eval is used, in derived class // Also define a this-binding if direct eval is used, in derived class
// constructors (JSOP_CHECKRETURN relies on it) or if there's a debugger // constructors (JSOP_CHECKRETURN relies on it) or if there's a debugger
// statement. // statement, or if this is a lazy script that has a this-binding
// (TenFourFox issue 533).
if (pc->sc->hasDirectEval() || if (pc->sc->hasDirectEval() ||
(handler.canSkipLazyClosedOverBindings() &&
pc->sc->asFunctionBox()->function()->lazyScript()->hasThisBinding()) ||
pc->sc->asFunctionBox()->isDerivedClassConstructor() || pc->sc->asFunctionBox()->isDerivedClassConstructor() ||
pc->sc->hasDebuggerStatement()) pc->sc->hasDebuggerStatement())
{ {
@ -2936,6 +2939,9 @@ Parser<SyntaxParseHandler>::finishFunctionDefinition(Node pn, FunctionBox* funbo
lazy->setIsDerivedClassConstructor(); lazy->setIsDerivedClassConstructor();
if (funbox->needsHomeObject()) if (funbox->needsHomeObject())
lazy->setNeedsHomeObject(); lazy->setNeedsHomeObject();
// TenFourFox issue 533
if (funbox->hasThisBinding())
lazy->setHasThisBinding();
PropagateTransitiveParseFlags(funbox, lazy); PropagateTransitiveParseFlags(funbox, lazy);
fun->initLazyScript(lazy); fun->initLazyScript(lazy);

View File

@ -4282,6 +4282,7 @@ LazyScript::CreateRaw(ExclusiveContext* cx, HandleFunction fun,
p.hasBeenCloned = false; p.hasBeenCloned = false;
p.treatAsRunOnce = false; p.treatAsRunOnce = false;
p.isAsync = false; p.isAsync = false;
p.hasThisBinding = false;
size_t bytes = (p.numFreeVariables * sizeof(FreeVariable)) size_t bytes = (p.numFreeVariables * sizeof(FreeVariable))
+ (p.numInnerFunctions * sizeof(HeapPtrFunction)); + (p.numInnerFunctions * sizeof(HeapPtrFunction));
@ -4312,6 +4313,7 @@ LazyScript::CreateRaw(ExclusiveContext* cx, HandleFunction fun,
}; };
p.version = version; p.version = version;
p.hasThisBinding = false;
p.numFreeVariables = numFreeVariables; p.numFreeVariables = numFreeVariables;
p.isAsync = false; p.isAsync = false;
p.numInnerFunctions = numInnerFunctions; p.numInnerFunctions = numInnerFunctions;

View File

@ -2150,7 +2150,7 @@ class LazyScript : public gc::TenuredCell
// instead of private to suppress -Wunused-private-field compiler warnings. // instead of private to suppress -Wunused-private-field compiler warnings.
protected: protected:
#if JS_BITS_PER_WORD == 32 #if JS_BITS_PER_WORD == 32
uint32_t padding; //uint32_t padding; // widened after TenFourFox issue 533
#endif #endif
private: private:
@ -2158,8 +2158,7 @@ class LazyScript : public gc::TenuredCell
// Assorted bits that should really be in ScriptSourceObject. // Assorted bits that should really be in ScriptSourceObject.
uint32_t version : 8; uint32_t version : 8;
uint32_t numFreeVariables : 23; uint32_t numFreeVariables : 22;
uint32_t isAsync: 1;
uint32_t numInnerFunctions : 20; uint32_t numInnerFunctions : 20;
uint32_t generatorKindBits : 2; uint32_t generatorKindBits : 2;
@ -2167,6 +2166,8 @@ class LazyScript : public gc::TenuredCell
// N.B. These are booleans but need to be uint32_t to pack correctly on MSVC. // 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 initialze it in // If you add another boolean here, make sure to initialze it in
// LazyScript::CreateRaw(). // LazyScript::CreateRaw().
uint32_t hasThisBinding : 1;
uint32_t isAsync: 1;
uint32_t strict : 1; uint32_t strict : 1;
uint32_t bindingsAccessedDynamically : 1; uint32_t bindingsAccessedDynamically : 1;
uint32_t hasDebuggerStatement : 1; uint32_t hasDebuggerStatement : 1;
@ -2368,6 +2369,13 @@ class LazyScript : public gc::TenuredCell
p_.needsHomeObject = true; p_.needsHomeObject = true;
} }
bool hasThisBinding() const {
return p_.hasThisBinding;
}
void setHasThisBinding() {
p_.hasThisBinding = true;
}
const char* filename() const { const char* filename() const {
return scriptSource()->filename(); return scriptSource()->filename();
} }