@@ -8834,11 +8834,14 @@ ParseNodePtr Parser::ParseExpr(int oplMin,
8834
8834
break ;
8835
8835
}
8836
8836
}
8837
- else
8837
+ else // a binary operator
8838
8838
{
8839
+ ParseNode* pnode1 = pnode;
8840
+
8839
8841
// Parse the operand, make a new node, and look for more
8840
8842
IdentToken token;
8841
- pnodeT = ParseExpr<buildAST>(opl, NULL , fAllowIn , FALSE , pNameHint, &hintLength, &hintOffset, &token, false , nullptr , plastRParen);
8843
+ ParseNode* pnode2 = ParseExpr<buildAST>(
8844
+ opl, nullptr , fAllowIn , FALSE , pNameHint, &hintLength, &hintOffset, &token, false , nullptr , plastRParen);
8842
8845
8843
8846
// Detect nested function escapes of the pattern "o.f = function(){...}" or "o[s] = function(){...}".
8844
8847
// Doing so in the parser allows us to disable stack-nested-functions in common cases where an escape
@@ -8850,36 +8853,42 @@ ParseNodePtr Parser::ParseExpr(int oplMin,
8850
8853
8851
8854
if (buildAST)
8852
8855
{
8853
- pnode = CreateBinNode (nop, pnode, pnodeT);
8854
- Assert (pnode->AsParseNodeBin ()->pnode2 != NULL );
8855
- if (pnode->AsParseNodeBin ()->pnode2 ->nop == knopFncDecl)
8856
+ Assert (pnode2 != nullptr );
8857
+ if (pnode2->nop == knopFncDecl)
8856
8858
{
8857
8859
Assert (hintLength >= hintOffset);
8858
- pnode-> AsParseNodeBin ()-> pnode2 ->AsParseNodeFnc ()->hint = pNameHint;
8859
- pnode-> AsParseNodeBin ()-> pnode2 ->AsParseNodeFnc ()->hintLength = hintLength;
8860
- pnode-> AsParseNodeBin ()-> pnode2 ->AsParseNodeFnc ()->hintOffset = hintOffset;
8860
+ pnode2->AsParseNodeFnc ()->hint = pNameHint;
8861
+ pnode2->AsParseNodeFnc ()->hintLength = hintLength;
8862
+ pnode2->AsParseNodeFnc ()->hintOffset = hintOffset;
8861
8863
8862
- if (pnode-> AsParseNodeBin ()-> pnode1 ->nop == knopDot)
8864
+ if (pnode1->nop == knopDot)
8863
8865
{
8864
- pnode-> AsParseNodeBin ()-> pnode2 ->AsParseNodeFnc ()->isNameIdentifierRef = false ;
8866
+ pnode2->AsParseNodeFnc ()->isNameIdentifierRef = false ;
8865
8867
}
8866
- else if (pnode-> AsParseNodeBin ()-> pnode1 ->nop == knopName)
8868
+ else if (pnode1->nop == knopName)
8867
8869
{
8868
- PidRefStack *pidRef = pnode-> AsParseNodeBin ()-> pnode1 ->AsParseNodeName ()->pid ->GetTopRef ();
8870
+ PidRefStack *pidRef = pnode1->AsParseNodeName ()->pid ->GetTopRef ();
8869
8871
pidRef->isFuncAssignment = true ;
8870
8872
}
8871
8873
}
8872
- if (pnode-> AsParseNodeBin ()-> pnode2 ->nop == knopClassDecl && pnode-> AsParseNodeBin ()-> pnode1 ->nop == knopDot)
8874
+ else if (pnode2->nop == knopClassDecl && pnode1->nop == knopDot)
8873
8875
{
8874
- Assert (pnode-> AsParseNodeBin ()-> pnode2 ->AsParseNodeClass ()->pnodeConstructor );
8876
+ Assert (pnode2->AsParseNodeClass ()->pnodeConstructor );
8875
8877
8876
- if (!pnode-> AsParseNodeBin ()-> pnode2 ->AsParseNodeClass ()->pnodeConstructor ->pid )
8878
+ if (!pnode2->AsParseNodeClass ()->pnodeConstructor ->pid )
8877
8879
{
8878
- pnode-> AsParseNodeBin ()-> pnode2 ->AsParseNodeClass ()->pnodeConstructor ->isNameIdentifierRef = false ;
8880
+ pnode2->AsParseNodeClass ()->pnodeConstructor ->isNameIdentifierRef = false ;
8879
8881
}
8880
8882
}
8883
+ else if (pnode1->nop == knopName && nop == knopIn)
8884
+ {
8885
+ PidRefStack* pidRef = pnode1->AsParseNodeName ()->pid ->GetTopRef ();
8886
+ pidRef->SetIsUsedInLdElem (true );
8887
+ }
8888
+
8889
+ pnode = CreateBinNode (nop, pnode1, pnode2);
8881
8890
}
8882
- pNameHint = NULL ;
8891
+ pNameHint = nullptr ;
8883
8892
}
8884
8893
}
8885
8894
0 commit comments