2
0
Эх сурвалжийг харах

Dont update valueInfo of bytecode constants

Fixes OS#13344808
Meghana Gupta 8 жил өмнө
parent
commit
da020367d0

+ 7 - 0
lib/Backend/GlobOpt.cpp

@@ -2834,6 +2834,11 @@ GlobOpt::OptTagChecks(IR::Instr *instr)
         Value *value = CurrentBlockData()->FindValue(stackSym);
         if (value)
         {
+            ValueInfo *valInfo = value->GetValueInfo();
+            if (valInfo->GetSymStore() && valInfo->GetSymStore()->IsStackSym() && valInfo->GetSymStore()->AsStackSym()->IsFromByteCodeConstantTable())
+            {
+                return false;
+            }
             ValueType valueType = value->GetValueInfo()->Type();
             if (instr->m_opcode == Js::OpCode::BailOnNotObject)
             {
@@ -12474,6 +12479,8 @@ GlobOpt::ChangeValueType(
         !valueInfo->IsArrayValueInfo() ||
         newValueType.IsObject() && newValueType.GetObjectType() == valueInfo->GetObjectType());
 
+    Assert(!valueInfo->GetSymStore() || !valueInfo->GetSymStore()->IsStackSym() || !valueInfo->GetSymStore()->AsStackSym()->IsFromByteCodeConstantTable());
+
     ValueInfo *const newValueInfo =
         preserveSubclassInfo
             ? valueInfo->Copy(alloc)

+ 8 - 0
lib/Backend/GlobOptFields.cpp

@@ -3220,6 +3220,14 @@ GlobOpt::UpdateObjPtrValueType(IR::Opnd * opnd, IR::Instr * instr)
         return;
     }
 
+    ValueInfo *objValueInfo = objVal->GetValueInfo();
+
+    // It is possible for a valueInfo to be not definite and still have a byteCodeConstant as symStore, this is because we conservatively copy valueInfo in prePass
+    if (objValueInfo->GetSymStore() && objValueInfo->GetSymStore()->IsStackSym() && objValueInfo->GetSymStore()->AsStackSym()->IsFromByteCodeConstantTable())
+    {
+        return;
+    }
+
     // Verify that the types we're checking for here have been locked so that the type ID's can't be changed
     // without changing the type.
     if (!propertySymOpnd->HasObjectTypeSym())