Skip to content

Commit 0779c3e

Browse files
committed
Move the check to see if function expression name is captured in the param scope into BindPidRefsInScope instead of requiring a separate PidRefStack walk
1 parent adfb5cc commit 0779c3e

File tree

1 file changed

+14
-25
lines changed

1 file changed

+14
-25
lines changed

lib/Parser/Parse.cpp

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1826,26 +1826,6 @@ void Parser::FinishParseBlock(ParseNodeBlock *pnodeBlock, bool needScanRCurly)
18261826
}
18271827
}
18281828

1829-
void CheckFncExprNameCapturedInParamScope(ParseNodeFnc* pnodeFnc, ParseNodeBlock* pnodeFncExprScope)
1830-
{
1831-
ParseNodeBlock* bodyScope = pnodeFnc->pnodeBodyScope;
1832-
ParseNodePtr pnodeName = pnodeFnc->pnodeName;
1833-
1834-
if (bodyScope == nullptr || pnodeName == nullptr || !pnodeFnc->IsBodyAndParamScopeMerged())
1835-
{
1836-
return;
1837-
}
1838-
1839-
for (PidRefStack* ref = pnodeName->AsParseNodeVar()->pid->GetTopRef(); ref && ref->id > pnodeFncExprScope->blockId; ref = ref->prev)
1840-
{
1841-
if (ref->id < bodyScope->blockId && ref->id > pnodeFncExprScope->blockId)
1842-
{
1843-
pnodeFncExprScope->scope->SetIsObject();
1844-
return;
1845-
}
1846-
}
1847-
}
1848-
18491829
void Parser::FinishParseFncExprScope(ParseNodeFnc * pnodeFnc, ParseNodeBlock * pnodeFncExprScope)
18501830
{
18511831
int fncExprScopeId = pnodeFncExprScope->blockId;
@@ -1993,6 +1973,20 @@ void Parser::BindPidRefsInScope(IdentPtr pid, Symbol *sym, int blockId, uint max
19931973
}
19941974
}
19951975

1976+
if (m_currentNodeFunc && m_currentNodeFunc->pnodeName && pid == m_currentNodeFunc->pnodeName->pid && !m_currentNodeFunc->IsDeclaration() && m_currentNodeFunc->IsBodyAndParamScopeMerged())
1977+
{
1978+
Scope* funcExprScope = m_currentNodeFunc->scope;
1979+
Assert(funcExprScope->GetScopeType() == ScopeType_FuncExpr);
1980+
1981+
ParseNodeBlock* bodyScope = m_currentNodeFunc->pnodeBodyScope;
1982+
Assert(bodyScope->blockType == PnodeBlockType::Function);
1983+
1984+
if (ref->GetScopeId() < bodyScope->blockId && ref->GetScopeId() > blockId)
1985+
{
1986+
funcExprScope->SetIsObject();
1987+
}
1988+
}
1989+
19961990
if (ref->GetScopeId() == blockId)
19971991
{
19981992
break;
@@ -6038,11 +6032,6 @@ void Parser::ParseFncDeclHelper(ParseNodeFnc * pnodeFnc, LPCOLESTR pNameHint, us
60386032

60396033
if (pnodeBlock)
60406034
{
6041-
if (pnodeFncExprScope)
6042-
{
6043-
CheckFncExprNameCapturedInParamScope(pnodeFnc, pnodeFncExprScope);
6044-
}
6045-
60466035
FinishParseBlock(pnodeBlock, *pNeedScanRCurly);
60476036
}
60486037

0 commit comments

Comments
 (0)