@@ -5931,39 +5931,43 @@ void EmitReference(ParseNode *pnode, ByteCodeGenerator *byteCodeGenerator, FuncI
5931
5931
// These have to be emitted before the RHS, but they have to persist until
5932
5932
// the end of the expression.
5933
5933
// Emit the call target operands first.
5934
- switch (pnode->AsParseNodeCall ()->pnodeTarget ->nop )
5934
+ // The call target does not need to be emitted for a super call - EmitSuperCall will do this.
5935
+ if (!pnode->AsParseNodeCall ()->isSuperCall )
5935
5936
{
5936
- case knopDot:
5937
- case knopIndex:
5938
- funcInfo->AcquireLoc (pnode->AsParseNodeCall ()->pnodeTarget );
5939
- EmitReference (pnode->AsParseNodeCall ()->pnodeTarget , byteCodeGenerator, funcInfo);
5940
- break ;
5941
-
5942
- case knopName:
5943
- {
5944
- Symbol *sym = pnode->AsParseNodeCall ()->pnodeTarget ->AsParseNodeName ()->sym ;
5945
- if (!sym || sym->GetLocation () == Js::Constants::NoRegister)
5937
+ switch (pnode->AsParseNodeCall ()->pnodeTarget ->nop )
5946
5938
{
5939
+ case knopDot:
5940
+ case knopIndex:
5947
5941
funcInfo->AcquireLoc (pnode->AsParseNodeCall ()->pnodeTarget );
5948
- }
5949
- if (sym && (sym->IsInSlot (byteCodeGenerator, funcInfo) || sym->GetScope ()->GetFunc () != funcInfo))
5942
+ EmitReference (pnode->AsParseNodeCall ()->pnodeTarget , byteCodeGenerator, funcInfo);
5943
+ break ;
5944
+
5945
+ case knopName:
5950
5946
{
5951
- // Can't get the value from the assigned register, so load it here.
5952
- EmitLoad (pnode->AsParseNodeCall ()->pnodeTarget , byteCodeGenerator, funcInfo);
5947
+ Symbol* sym = pnode->AsParseNodeCall ()->pnodeTarget ->AsParseNodeName ()->sym ;
5948
+ if (!sym || sym->GetLocation () == Js::Constants::NoRegister)
5949
+ {
5950
+ funcInfo->AcquireLoc (pnode->AsParseNodeCall ()->pnodeTarget );
5951
+ }
5952
+ if (sym && (sym->IsInSlot (byteCodeGenerator, funcInfo) || sym->GetScope ()->GetFunc () != funcInfo))
5953
+ {
5954
+ // Can't get the value from the assigned register, so load it here.
5955
+ EmitLoad (pnode->AsParseNodeCall ()->pnodeTarget , byteCodeGenerator, funcInfo);
5956
+ }
5957
+ else
5958
+ {
5959
+ // EmitLoad will check for needsDeclaration and emit the Use Before Declaration error
5960
+ // bytecode op as necessary, but EmitReference does not check this (by design). So we
5961
+ // must manually check here.
5962
+ EmitUseBeforeDeclaration (pnode->AsParseNodeCall ()->pnodeTarget ->AsParseNodeName ()->sym , byteCodeGenerator, funcInfo);
5963
+ EmitReference (pnode->AsParseNodeCall ()->pnodeTarget , byteCodeGenerator, funcInfo);
5964
+ }
5965
+ break ;
5953
5966
}
5954
- else
5955
- {
5956
- // EmitLoad will check for needsDeclaration and emit the Use Before Declaration error
5957
- // bytecode op as necessary, but EmitReference does not check this (by design). So we
5958
- // must manually check here.
5959
- EmitUseBeforeDeclaration (pnode->AsParseNodeCall ()->pnodeTarget ->AsParseNodeName ()->sym , byteCodeGenerator, funcInfo);
5960
- EmitReference (pnode->AsParseNodeCall ()->pnodeTarget , byteCodeGenerator, funcInfo);
5967
+ default :
5968
+ EmitLoad (pnode->AsParseNodeCall ()->pnodeTarget , byteCodeGenerator, funcInfo);
5969
+ break ;
5961
5970
}
5962
- break ;
5963
- }
5964
- default :
5965
- EmitLoad (pnode->AsParseNodeCall ()->pnodeTarget , byteCodeGenerator, funcInfo);
5966
- break ;
5967
5971
}
5968
5972
5969
5973
// Now the arg list. We evaluate everything now and emit the ArgOut's later.
@@ -5977,12 +5981,6 @@ void EmitReference(ParseNode *pnode, ByteCodeGenerator *byteCodeGenerator, FuncI
5977
5981
}
5978
5982
Emit (pnodeArg, byteCodeGenerator, funcInfo, false );
5979
5983
}
5980
-
5981
- if (pnode->AsParseNodeCall ()->isSuperCall )
5982
- {
5983
- Emit (pnode->AsParseNodeSuperCall ()->pnodeThis , byteCodeGenerator, funcInfo, false );
5984
- Emit (pnode->AsParseNodeSuperCall ()->pnodeNewTarget , byteCodeGenerator, funcInfo, false );
5985
- }
5986
5984
break ;
5987
5985
5988
5986
default :
@@ -6961,7 +6959,14 @@ void EmitLoad(
6961
6959
case knopCall:
6962
6960
{
6963
6961
ParseNodeCall * pnodeCallLhs = lhs->AsParseNodeCall ();
6964
- if (pnodeCallLhs->pnodeTarget ->nop == knopImport)
6962
+
6963
+ if (pnodeCallLhs->isSuperCall )
6964
+ {
6965
+ funcInfo->AcquireLoc (pnodeCallLhs);
6966
+ EmitReference (pnodeCallLhs, byteCodeGenerator, funcInfo);
6967
+ byteCodeGenerator->EmitSuperCall (funcInfo, pnodeCallLhs->AsParseNodeSuperCall (), /* fReturnValue=*/ false );
6968
+ }
6969
+ else if (pnodeCallLhs->pnodeTarget ->nop == knopImport)
6965
6970
{
6966
6971
ParseNodePtr args = pnodeCallLhs->pnodeArgs ;
6967
6972
Assert (CountArguments (args) == 2 ); // import() takes one argument
0 commit comments