@@ -596,11 +596,67 @@ using namespace Js;
596
596
return scriptContext->GetLibrary()->GetArrayType();
597
597
}
598
598
599
- JavascriptArray *JavascriptArray::GetArrayForArrayOrObjectWithArray (const Var var)
599
+ JavascriptArray *JavascriptArray::Jit_GetArrayForArrayOrObjectWithArray (const Var var)
600
600
{
601
601
bool isObjectWithArray;
602
- TypeId arrayTypeId;
603
- return GetArrayForArrayOrObjectWithArray(var, &isObjectWithArray, &arrayTypeId);
602
+ return Jit_GetArrayForArrayOrObjectWithArray(var, &isObjectWithArray);
603
+ }
604
+
605
+ JavascriptArray *JavascriptArray::Jit_GetArrayForArrayOrObjectWithArray(const Var var, bool *const isObjectWithArrayRef)
606
+ {
607
+ Assert(var);
608
+ Assert(isObjectWithArrayRef);
609
+
610
+ *isObjectWithArrayRef = false;
611
+
612
+ if (!RecyclableObject::Is(var))
613
+ {
614
+ return nullptr;
615
+ }
616
+
617
+ JavascriptArray *array = nullptr;
618
+ INT_PTR vtable = VirtualTableInfoBase::GetVirtualTable(var);
619
+ if (!Jit_TryGetArrayForObjectWithArray(var, isObjectWithArrayRef, &vtable, &array))
620
+ {
621
+ return nullptr;
622
+ }
623
+
624
+ if (vtable != VirtualTableInfo<JavascriptArray>::Address &&
625
+ vtable != VirtualTableInfo<CrossSiteObject<JavascriptArray>>::Address &&
626
+ vtable != VirtualTableInfo<JavascriptNativeIntArray>::Address &&
627
+ vtable != VirtualTableInfo<CrossSiteObject<JavascriptNativeIntArray>>::Address &&
628
+ vtable != VirtualTableInfo<JavascriptNativeFloatArray>::Address &&
629
+ vtable != VirtualTableInfo<CrossSiteObject<JavascriptNativeFloatArray>>::Address)
630
+ {
631
+ return nullptr;
632
+ }
633
+
634
+ if (!array)
635
+ {
636
+ array = FromVar(var);
637
+ }
638
+ return array;
639
+ }
640
+
641
+ bool JavascriptArray::Jit_TryGetArrayForObjectWithArray(const Var var, bool *const isObjectWithArrayRef, INT_PTR* pVTable, JavascriptArray** pArray)
642
+ {
643
+ Assert(isObjectWithArrayRef);
644
+ Assert(pVTable);
645
+ Assert(pArray);
646
+
647
+ if (*pVTable == VirtualTableInfo<DynamicObject>::Address ||
648
+ *pVTable == VirtualTableInfo<CrossSiteObject<DynamicObject>>::Address)
649
+ {
650
+ ArrayObject* objectArray = DynamicObject::FromVar(var)->GetObjectArray();
651
+ *pArray = (objectArray && Is(objectArray)) ? FromVar(objectArray) : nullptr;
652
+ if (!(*pArray))
653
+ {
654
+ return false;
655
+ }
656
+ *isObjectWithArrayRef = true;
657
+ *pVTable = VirtualTableInfoBase::GetVirtualTable(*pArray);
658
+ }
659
+ return true;
604
660
}
605
661
606
662
JavascriptArray *JavascriptArray::GetArrayForArrayOrObjectWithArray(
@@ -664,7 +720,7 @@ using namespace Js;
664
720
const SparseArraySegmentBase *JavascriptArray::Jit_GetArrayHeadSegmentForArrayOrObjectWithArray(const Var var)
665
721
{
666
722
JIT_HELPER_NOT_REENTRANT_NOLOCK_HEADER(Array_Jit_GetArrayHeadSegmentForArrayOrObjectWithArray);
667
- JavascriptArray *const array = GetArrayForArrayOrObjectWithArray (var);
723
+ JavascriptArray *const array = Jit_GetArrayForArrayOrObjectWithArray (var);
668
724
return array ? array->head : nullptr;
669
725
JIT_HELPER_END(Array_Jit_GetArrayHeadSegmentForArrayOrObjectWithArray);
670
726
}
@@ -701,8 +757,7 @@ using namespace Js;
701
757
{
702
758
JIT_HELPER_NOT_REENTRANT_NOLOCK_HEADER(Array_Jit_GetArrayLength);
703
759
bool isObjectWithArray;
704
- TypeId arrayTypeId;
705
- JavascriptArray *const array = GetArrayForArrayOrObjectWithArray(var, &isObjectWithArray, &arrayTypeId);
760
+ JavascriptArray *const array = Jit_GetArrayForArrayOrObjectWithArray(var, &isObjectWithArray);
706
761
return array && !isObjectWithArray ? array->GetLength() : 0;
707
762
JIT_HELPER_END(Array_Jit_GetArrayLength);
708
763
}
@@ -717,7 +772,7 @@ using namespace Js;
717
772
DynamicObjectFlags JavascriptArray::Jit_GetArrayFlagsForArrayOrObjectWithArray(const Var var)
718
773
{
719
774
JIT_HELPER_NOT_REENTRANT_NOLOCK_HEADER(Array_Jit_GetArrayFlagsForArrayOrObjectWithArray);
720
- JavascriptArray *const array = GetArrayForArrayOrObjectWithArray (var);
775
+ JavascriptArray *const array = Jit_GetArrayForArrayOrObjectWithArray (var);
721
776
return array && array->UsesObjectArrayOrFlagsAsFlags() ? array->GetFlags() : DynamicObjectFlags::None;
722
777
JIT_HELPER_END(Array_Jit_GetArrayFlagsForArrayOrObjectWithArray);
723
778
}
0 commit comments