소스 검색

Fix register mismatch in Jit

rhuanjl 5 년 전
부모
커밋
27a0c16aea
1개의 변경된 파일16개의 추가작업 그리고 5개의 파일을 삭제
  1. 16 5
      lib/Runtime/ByteCode/ByteCodeEmitter.cpp

+ 16 - 5
lib/Runtime/ByteCode/ByteCodeEmitter.cpp

@@ -9703,9 +9703,11 @@ void EmitGetAsyncIterator(
     // Iterable does not have a Symbol.asyncIterator method: attempt to get a sync
     // iterable and wrap it with an AsyncFromSyncIterator
     writer->MarkLabel(noAsyncIterator);
-    EmitGetIterator(resultReg, iterableReg, byteCodeGenerator, funcInfo);
-    writer->Reg2(Js::OpCode::NewAsyncFromSyncIterator, resultReg, resultReg);
-
+    Js::RegSlot iteratorReg = funcInfo->AcquireTmpRegister();
+    EmitGetIterator(iteratorReg, iterableReg, byteCodeGenerator, funcInfo);
+    writer->Reg2(Js::OpCode::NewAsyncFromSyncIterator, iteratorReg, iteratorReg);
+    writer->Reg2(Js::OpCode::Ld_A_ReuseLoc, resultReg, iteratorReg);    
+    funcInfo->ReleaseTmpRegister(iteratorReg);
     byteCodeGenerator->Writer()->MarkLabel(finished);
 }
 
@@ -10775,9 +10777,18 @@ void EmitYieldStar(
     writer->MarkLabel(noReturnMethod);
 
     if (isAsync)
-        EmitAwait(resumeValueReg, resumeValueReg, byteCodeGenerator, funcInfo);
+    {
+        Js::RegSlot awaitValue = funcInfo->AcquireTmpRegister();
+        writer->Reg2(Js::OpCode::Ld_A, awaitValue, resumeValueReg);
+
+        EmitAwait(awaitValue, awaitValue, byteCodeGenerator, funcInfo);
+        writer->Reg2(Js::OpCode::Ld_A_ReuseLoc, yieldStarReg, awaitValue);
+
+        funcInfo->ReleaseTmpRegister(awaitValue);
+    }
+    else
+        writer->Reg2(Js::OpCode::Ld_A_ReuseLoc, yieldStarReg, resumeValueReg);
 
-    writer->Reg2(Js::OpCode::Ld_A, yieldStarReg, resumeValueReg);    
     writer->Br(finishReturn);
 
     // Throw case: attempt to call throw