@@ -223,8 +223,8 @@ bool IsArguments(ParseNode *pnode)
223
223
}
224
224
225
225
bool ApplyEnclosesArgs (ParseNode* fncDecl, ByteCodeGenerator* byteCodeGenerator);
226
- void Emit (ParseNode * pnode, ByteCodeGenerator * byteCodeGenerator, FuncInfo * funcInfo, BOOL fReturnValue , bool isConstructorCall = false , ParseNode *bindPnode = nullptr , bool isTopLevel = false );
227
- void EmitBinaryOpnds (ParseNode * pnode1, ParseNode * pnode2, ByteCodeGenerator * byteCodeGenerator, FuncInfo * funcInfo);
226
+ void Emit (ParseNode* pnode, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo, BOOL fReturnValue , bool isConstructorCall = false , Js::RegSlot bindingNameLocation = Js::Constants::NoRegister , bool isTopLevel = false );
227
+ void EmitBinaryOpnds (ParseNode* pnode1, ParseNode* pnode2, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo, Js::RegSlot computedPropertyLocation = Js::Constants::NoRegister );
228
228
bool IsExpressionStatement (ParseNode* stmt, const Js::ScriptContext *const scriptContext);
229
229
void EmitInvoke (Js::RegSlot location, Js::RegSlot callObjLocation, Js::PropertyId propertyId, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo);
230
230
void EmitInvoke (Js::RegSlot location, Js::RegSlot callObjLocation, Js::PropertyId propertyId, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo, Js::RegSlot arg1Location);
@@ -953,7 +953,7 @@ void ByteCodeGenerator::EmitTopLevelStatement(ParseNode *stmt, FuncInfo *funcInf
953
953
EndStatement (stmt);
954
954
}
955
955
956
- Emit (stmt, this , funcInfo, fReturnValue , false /* isConstructorCall*/ , nullptr /* bindPnode */ , true /* isTopLevel*/ );
956
+ Emit (stmt, this , funcInfo, fReturnValue , false /* isConstructorCall*/ , Js::Constants::NoRegister /* computedPropertyLocation */ , true /* isTopLevel*/ );
957
957
if (funcInfo->IsTmpReg (stmt->location ))
958
958
{
959
959
if (!stmt->isUsed && !fReturnValue )
@@ -8224,22 +8224,6 @@ void EmitInvoke(
8224
8224
byteCodeGenerator->Writer ()->CallI (Js::OpCode::CallI, location, location, 2 , callSiteId);
8225
8225
}
8226
8226
8227
- void EmitComputedFunctionNameVar (ParseNode *nameNode, ParseNodeFnc *exprNode, ByteCodeGenerator *byteCodeGenerator)
8228
- {
8229
- AssertMsg (exprNode != nullptr , " callers of this function should pass in a valid expression Node" );
8230
- Assert (exprNode->HasComputedName ());
8231
-
8232
- if (nameNode == nullptr )
8233
- {
8234
- return ;
8235
- }
8236
-
8237
- if (exprNode->pnodeName == nullptr )
8238
- {
8239
- byteCodeGenerator->Writer ()->Reg2 (Js::OpCode::SetComputedNameVar, exprNode->location , nameNode->location );
8240
- }
8241
- }
8242
-
8243
8227
void EmitMemberNode (ParseNode *memberNode, Js::RegSlot objectLocation, ByteCodeGenerator *byteCodeGenerator, FuncInfo *funcInfo, ParseNode* parentNode, bool useStore, bool * isObjectEmpty = nullptr )
8244
8228
{
8245
8229
ParseNode *nameNode = memberNode->AsParseNodeBin ()->pnode1 ;
@@ -8254,6 +8238,8 @@ void EmitMemberNode(ParseNode *memberNode, Js::RegSlot objectLocation, ByteCodeG
8254
8238
exprNode->AsParseNodeFnc ()->SetHomeObjLocation (objectLocation);
8255
8239
}
8256
8240
8241
+ Js::RegSlot computedNamePropertyKey = Js::Constants::NoRegister;
8242
+
8257
8243
// Moved SetComputedNameVar before LdFld of prototype because loading the prototype undefers the function TypeHandler
8258
8244
// which makes this bytecode too late to influence the function.name.
8259
8245
if (nameNode->nop == knopComputedName)
@@ -8262,10 +8248,13 @@ void EmitMemberNode(ParseNode *memberNode, Js::RegSlot objectLocation, ByteCodeG
8262
8248
// Transparently pass the name expr
8263
8249
// The Emit will replace this with a temp register if necessary to preserve the value.
8264
8250
nameNode->location = nameNode->AsParseNodeUni ()->pnode1 ->location ;
8265
- EmitBinaryOpnds (nameNode, exprNode, byteCodeGenerator, funcInfo);
8266
- if (isFncDecl && !exprNode->AsParseNodeFnc ()->IsClassConstructor ())
8251
+ computedNamePropertyKey = funcInfo->AcquireTmpRegister ();
8252
+
8253
+ EmitBinaryOpnds (nameNode, exprNode, byteCodeGenerator, funcInfo, computedNamePropertyKey);
8254
+
8255
+ if (isFncDecl && !exprNode->AsParseNodeFnc ()->IsClassConstructor () && exprNode->AsParseNodeFnc ()->pnodeName == nullptr )
8267
8256
{
8268
- EmitComputedFunctionNameVar (nameNode , exprNode->AsParseNodeFnc (), byteCodeGenerator );
8257
+ byteCodeGenerator-> Writer ()-> Reg2 (Js::OpCode::SetComputedNameVar , exprNode->location , computedNamePropertyKey );
8269
8258
}
8270
8259
}
8271
8260
@@ -8289,10 +8278,11 @@ void EmitMemberNode(ParseNode *memberNode, Js::RegSlot objectLocation, ByteCodeG
8289
8278
(isClassMember ? Js::OpCode::InitClassMemberSetComputedName : Js::OpCode::InitSetElemI) :
8290
8279
(isClassMember ? Js::OpCode::InitClassMemberComputedName : Js::OpCode::InitComputedProperty);
8291
8280
8292
- byteCodeGenerator->Writer ()->Element (setOp, exprNode->location , objectLocation, nameNode-> location , true );
8281
+ byteCodeGenerator->Writer ()->Element (setOp, exprNode->location , objectLocation, computedNamePropertyKey , true );
8293
8282
8294
8283
funcInfo->ReleaseLoc (exprNode);
8295
8284
funcInfo->ReleaseLoc (nameNode);
8285
+ funcInfo->ReleaseTmpRegister (computedNamePropertyKey);
8296
8286
8297
8287
return ;
8298
8288
}
@@ -9578,7 +9568,7 @@ void EmitJumpCleanup(ParseNodeStmt *pnode, ParseNode *pnodeTarget, ByteCodeGener
9578
9568
}
9579
9569
}
9580
9570
9581
- void EmitBinaryOpnds (ParseNode *pnode1, ParseNode *pnode2, ByteCodeGenerator *byteCodeGenerator, FuncInfo *funcInfo)
9571
+ void EmitBinaryOpnds (ParseNode *pnode1, ParseNode *pnode2, ByteCodeGenerator *byteCodeGenerator, FuncInfo *funcInfo, Js::RegSlot computedPropertyLocation )
9582
9572
{
9583
9573
// If opnd2 can overwrite opnd1, make sure the value of opnd1 is stashed away.
9584
9574
if (MayHaveSideEffectOnNode (pnode1, pnode2))
@@ -9588,15 +9578,12 @@ void EmitBinaryOpnds(ParseNode *pnode1, ParseNode *pnode2, ByteCodeGenerator *by
9588
9578
9589
9579
Emit (pnode1, byteCodeGenerator, funcInfo, false );
9590
9580
9591
- if (pnode1->nop == knopComputedName && pnode2->nop == knopClassDecl &&
9592
- (pnode2->AsParseNodeClass ()->pnodeConstructor == nullptr || pnode2->AsParseNodeClass ()->pnodeConstructor ->nop != knopVarDecl))
9593
- {
9594
- Emit (pnode2, byteCodeGenerator, funcInfo, false , false , pnode1);
9595
- }
9596
- else
9581
+ if (pnode1->nop == knopComputedName && computedPropertyLocation != Js::Constants::NoRegister)
9597
9582
{
9598
- Emit (pnode2, byteCodeGenerator, funcInfo, false );
9583
+ byteCodeGenerator-> Writer ()-> Reg2 (Js::OpCode::Conv_Prop, computedPropertyLocation, pnode1-> location );
9599
9584
}
9585
+
9586
+ Emit (pnode2, byteCodeGenerator, funcInfo, false , false , computedPropertyLocation);
9600
9587
}
9601
9588
9602
9589
void EmitBinaryReference (ParseNode *pnode1, ParseNode *pnode2, ByteCodeGenerator *byteCodeGenerator, FuncInfo *funcInfo, BOOL fLoadLhs )
@@ -10142,7 +10129,7 @@ void TrackGlobalIntAssignments(ParseNodePtr pnode, ByteCodeGenerator * byteCodeG
10142
10129
}
10143
10130
}
10144
10131
10145
- void Emit (ParseNode *pnode, ByteCodeGenerator *byteCodeGenerator, FuncInfo *funcInfo, BOOL fReturnValue , bool isConstructorCall, ParseNode * bindPnode , bool isTopLevel)
10132
+ void Emit (ParseNode *pnode, ByteCodeGenerator *byteCodeGenerator, FuncInfo *funcInfo, BOOL fReturnValue , bool isConstructorCall, Js::RegSlot bindingNameLocation , bool isTopLevel)
10146
10133
{
10147
10134
if (pnode == nullptr )
10148
10135
{
@@ -10966,7 +10953,13 @@ void Emit(ParseNode *pnode, ByteCodeGenerator *byteCodeGenerator, FuncInfo *func
10966
10953
10967
10954
// Constructor
10968
10955
Emit (pnodeClass->pnodeConstructor , byteCodeGenerator, funcInfo, false );
10969
- EmitComputedFunctionNameVar (bindPnode, pnodeClass->pnodeConstructor , byteCodeGenerator);
10956
+
10957
+ if (bindingNameLocation != Js::Constants::NoRegister && !pnodeClass->pnodeConstructor ->pnodeName )
10958
+ {
10959
+ Assert (pnodeClass->pnodeConstructor ->HasComputedName ());
10960
+ byteCodeGenerator->Writer ()->Reg2 (Js::OpCode::SetComputedNameVar, pnodeClass->pnodeConstructor ->location , bindingNameLocation);
10961
+ }
10962
+
10970
10963
if (pnodeClass->pnodeExtends )
10971
10964
{
10972
10965
byteCodeGenerator->StartStatement (pnodeClass->pnodeExtends );
0 commit comments