summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/dfg/DFGArrayMode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGArrayMode.cpp')
-rw-r--r--Source/JavaScriptCore/dfg/DFGArrayMode.cpp34
1 files changed, 25 insertions, 9 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGArrayMode.cpp b/Source/JavaScriptCore/dfg/DFGArrayMode.cpp
index cd3944fb4..eda578205 100644
--- a/Source/JavaScriptCore/dfg/DFGArrayMode.cpp
+++ b/Source/JavaScriptCore/dfg/DFGArrayMode.cpp
@@ -40,8 +40,12 @@ Array::Mode fromObserved(ArrayModes modes, bool makeSafe)
switch (modes) {
case 0:
return Array::Undecided;
- case IsJSArray:
- return makeSafe ? Array::JSArrayOutOfBounds : Array::JSArray;
+ case asArrayModes(NonArrayWithArrayStorage):
+ return makeSafe ? Array::ArrayStorageOutOfBounds : Array::ArrayStorage;
+ case asArrayModes(ArrayWithArrayStorage):
+ return makeSafe ? Array::ArrayWithArrayStorageOutOfBounds : Array::ArrayWithArrayStorage;
+ case asArrayModes(NonArrayWithArrayStorage) | asArrayModes(ArrayWithArrayStorage):
+ return makeSafe ? Array::PossiblyArrayWithArrayStorageOutOfBounds : Array::PossiblyArrayWithArrayStorage;
default:
// We know that this is possibly a kind of array for which, though there is no
// useful data in the array profile, we may be able to extract useful data from
@@ -120,10 +124,14 @@ bool modeAlreadyChecked(AbstractValue& value, Array::Mode arrayMode)
case Array::String:
return isStringSpeculation(value.m_type);
- case Array::JSArray:
- case Array::JSArrayOutOfBounds:
+ case NON_ARRAY_ARRAY_STORAGE_MODES:
return value.m_currentKnownStructure.hasSingleton()
- && value.m_currentKnownStructure.singleton()->classInfo() == &JSArray::s_info;
+ && (value.m_currentKnownStructure.singleton()->indexingType() & HasArrayStorage);
+
+ case ARRAY_WITH_ARRAY_STORAGE_MODES:
+ return value.m_currentKnownStructure.hasSingleton()
+ && (value.m_currentKnownStructure.singleton()->indexingType() & HasArrayStorage)
+ && (value.m_currentKnownStructure.singleton()->indexingType() & IsArray);
case Array::Arguments:
return isArgumentsSpeculation(value.m_type);
@@ -174,10 +182,18 @@ const char* modeToString(Array::Mode mode)
return "ForceExit";
case Array::String:
return "String";
- case Array::JSArray:
- return "JSArray";
- case Array::JSArrayOutOfBounds:
- return "JSArrayOutOfBounds";
+ case Array::ArrayStorage:
+ return "ArrayStorage";
+ case Array::ArrayStorageOutOfBounds:
+ return "ArrayStorageOutOfBounds";
+ case Array::ArrayWithArrayStorage:
+ return "ArrayWithArrayStorage";
+ case Array::ArrayWithArrayStorageOutOfBounds:
+ return "ArrayWithArrayStorageOutOfBounds";
+ case Array::PossiblyArrayWithArrayStorage:
+ return "PossiblyArrayWithArrayStorage";
+ case Array::PossiblyArrayWithArrayStorageOutOfBounds:
+ return "PossiblyArrayWithArrayStorageOutOfBounds";
case Array::Arguments:
return "Arguments";
case Array::Int8Array: