summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/dfg/DFGArrayMode.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGArrayMode.h')
-rw-r--r--Source/JavaScriptCore/dfg/DFGArrayMode.h107
1 files changed, 88 insertions, 19 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGArrayMode.h b/Source/JavaScriptCore/dfg/DFGArrayMode.h
index d4be9c0eb..a666bb83f 100644
--- a/Source/JavaScriptCore/dfg/DFGArrayMode.h
+++ b/Source/JavaScriptCore/dfg/DFGArrayMode.h
@@ -54,6 +54,15 @@ enum Mode {
String,
// Modes of conventional indexed storage where the check is non side-effecting.
+ Contiguous,
+ ContiguousToTail,
+ ContiguousOutOfBounds,
+ ArrayWithContiguous,
+ ArrayWithContiguousToTail,
+ ArrayWithContiguousOutOfBounds,
+ PossiblyArrayWithContiguous,
+ PossiblyArrayWithContiguousToTail,
+ PossiblyArrayWithContiguousOutOfBounds,
ArrayStorage,
ArrayStorageToHole,
SlowPutArrayStorage,
@@ -68,8 +77,11 @@ enum Mode {
PossiblyArrayWithArrayStorageOutOfBounds,
// Modes of conventional indexed storage where the check is side-effecting.
- BlankToArrayStorage,
- BlankToSlowPutArrayStorage,
+ ToContiguous,
+ ToArrayStorage,
+ ArrayToArrayStorage,
+ PossiblyArrayToArrayStorage,
+ ToSlowPutArrayStorage,
Arguments,
Int8Array,
@@ -89,6 +101,32 @@ enum Mode {
// have the word "ArrayStorage" in them.
// First: helpers for non-side-effecting checks.
+#define NON_ARRAY_CONTIGUOUS_MODES \
+ Array::Contiguous: \
+ case Array::ContiguousToTail: \
+ case Array::ContiguousOutOfBounds: \
+ case Array::PossiblyArrayWithContiguous: \
+ case Array::PossiblyArrayWithContiguousToTail: \
+ case Array::PossiblyArrayWithContiguousOutOfBounds
+#define ARRAY_WITH_CONTIGUOUS_MODES \
+ Array::ArrayWithContiguous: \
+ case Array::ArrayWithContiguousToTail: \
+ case Array::ArrayWithContiguousOutOfBounds
+#define ALL_CONTIGUOUS_MODES \
+ NON_ARRAY_CONTIGUOUS_MODES: \
+ case ARRAY_WITH_CONTIGUOUS_MODES
+#define IN_BOUNDS_CONTIGUOUS_MODES \
+ Array::Contiguous: \
+ case Array::ArrayWithContiguous: \
+ case Array::PossiblyArrayWithContiguous
+#define CONTIGUOUS_TO_TAIL_MODES \
+ Array::ContiguousToTail: \
+ case Array::ArrayWithContiguousToTail: \
+ case Array::PossiblyArrayWithContiguousToTail
+#define OUT_OF_BOUNDS_CONTIGUOUS_MODES \
+ Array::ContiguousOutOfBounds: \
+ case Array::ArrayWithContiguousOutOfBounds: \
+ case Array::PossiblyArrayWithContiguousOutOfBounds
#define NON_ARRAY_ARRAY_STORAGE_MODES \
Array::ArrayStorage: \
case Array::ArrayStorageToHole: \
@@ -106,33 +144,43 @@ enum Mode {
#define ALL_ARRAY_STORAGE_MODES \
NON_ARRAY_ARRAY_STORAGE_MODES: \
case ARRAY_WITH_ARRAY_STORAGE_MODES
+#define IN_BOUNDS_ARRAY_STORAGE_MODES \
+ Array::ArrayStorage: \
+ case Array::ArrayWithArrayStorage: \
+ case Array::PossiblyArrayWithArrayStorage
#define ARRAY_STORAGE_TO_HOLE_MODES \
Array::ArrayStorageToHole: \
case Array::ArrayWithArrayStorageToHole: \
case Array::PossiblyArrayWithArrayStorageToHole
-#define IN_BOUNDS_ARRAY_STORAGE_MODES \
- ARRAY_STORAGE_TO_HOLE_MODES: \
- case Array::ArrayStorage: \
- case Array::ArrayWithArrayStorage: \
- case Array::PossiblyArrayWithArrayStorage
#define SLOW_PUT_ARRAY_STORAGE_MODES \
Array::SlowPutArrayStorage: \
case Array::ArrayWithSlowPutArrayStorage: \
case Array::PossiblyArrayWithSlowPutArrayStorage
#define OUT_OF_BOUNDS_ARRAY_STORAGE_MODES \
- SLOW_PUT_ARRAY_STORAGE_MODES: \
- case Array::ArrayStorageOutOfBounds: \
+ Array::ArrayStorageOutOfBounds: \
case Array::ArrayWithArrayStorageOutOfBounds: \
case Array::PossiblyArrayWithArrayStorageOutOfBounds
// Next: helpers for side-effecting checks.
-#define EFFECTFUL_NON_ARRAY_ARRAY_STORAGE_MODES \
- Array::BlankToArrayStorage: \
- case Array::BlankToSlowPutArrayStorage
-#define ALL_EFFECTFUL_ARRAY_STORAGE_MODES \
- EFFECTFUL_NON_ARRAY_ARRAY_STORAGE_MODES
-#define SLOW_PUT_EFFECTFUL_ARRAY_STORAGE_MODES \
- Array::BlankToSlowPutArrayStorage
+#define NON_ARRAY_EFFECTFUL_MODES \
+ Array::ToContiguous: \
+ case Array::ToArrayStorage: \
+ case Array::ToSlowPutArrayStorage: \
+ case Array::PossiblyArrayToArrayStorage
+#define ARRAY_EFFECTFUL_MODES \
+ Array::ArrayToArrayStorage
+#define ALL_EFFECTFUL_CONTIGUOUS_MODES \
+ Array::ToContiguous
+#define ALL_EFFECTFUL_ARRAY_STORAGE_MODES \
+ Array::ToArrayStorage: \
+ case Array::ToSlowPutArrayStorage: \
+ case Array::ArrayToArrayStorage: \
+ case Array::PossiblyArrayToArrayStorage
+#define SLOW_PUT_EFFECTFUL_ARRAY_STORAGE_MODES \
+ Array::ToSlowPutArrayStorage
+#define ALL_EFFECTFUL_MODES \
+ ALL_EFFECTFUL_CONTIGUOUS_MODES: \
+ case ALL_EFFECTFUL_ARRAY_STORAGE_MODES
Array::Mode fromObserved(ArrayProfile*, Array::Action, bool makeSafe);
@@ -145,8 +193,9 @@ const char* modeToString(Array::Mode);
inline bool modeUsesButterfly(Array::Mode arrayMode)
{
switch (arrayMode) {
+ case ALL_CONTIGUOUS_MODES:
case ALL_ARRAY_STORAGE_MODES:
- case ALL_EFFECTFUL_ARRAY_STORAGE_MODES:
+ case ALL_EFFECTFUL_MODES:
return true;
default:
return false;
@@ -156,7 +205,9 @@ inline bool modeUsesButterfly(Array::Mode arrayMode)
inline bool modeIsJSArray(Array::Mode arrayMode)
{
switch (arrayMode) {
+ case ARRAY_WITH_CONTIGUOUS_MODES:
case ARRAY_WITH_ARRAY_STORAGE_MODES:
+ case ARRAY_EFFECTFUL_MODES:
return true;
default:
return false;
@@ -166,6 +217,9 @@ inline bool modeIsJSArray(Array::Mode arrayMode)
inline bool isInBoundsAccess(Array::Mode arrayMode)
{
switch (arrayMode) {
+ case IN_BOUNDS_CONTIGUOUS_MODES:
+ case CONTIGUOUS_TO_TAIL_MODES:
+ case ARRAY_STORAGE_TO_HOLE_MODES:
case IN_BOUNDS_ARRAY_STORAGE_MODES:
return true;
default:
@@ -184,11 +238,24 @@ inline bool isSlowPutAccess(Array::Mode arrayMode)
}
}
+inline bool mayStoreToTail(Array::Mode arrayMode)
+{
+ switch (arrayMode) {
+ case CONTIGUOUS_TO_TAIL_MODES:
+ case OUT_OF_BOUNDS_CONTIGUOUS_MODES:
+ case ALL_EFFECTFUL_CONTIGUOUS_MODES:
+ return true;
+ default:
+ return false;
+ }
+}
+
inline bool mayStoreToHole(Array::Mode arrayMode)
{
switch (arrayMode) {
case ARRAY_STORAGE_TO_HOLE_MODES:
case OUT_OF_BOUNDS_ARRAY_STORAGE_MODES:
+ case SLOW_PUT_ARRAY_STORAGE_MODES:
case ALL_EFFECTFUL_ARRAY_STORAGE_MODES:
return true;
default:
@@ -249,7 +316,9 @@ inline bool modeSupportsLength(Array::Mode mode)
case Array::Unprofiled:
case Array::ForceExit:
case Array::Generic:
+ case NON_ARRAY_CONTIGUOUS_MODES:
case NON_ARRAY_ARRAY_STORAGE_MODES:
+ case NON_ARRAY_EFFECTFUL_MODES:
return false;
default:
return true;
@@ -259,7 +328,7 @@ inline bool modeSupportsLength(Array::Mode mode)
inline bool benefitsFromStructureCheck(Array::Mode mode)
{
switch (mode) {
- case ALL_EFFECTFUL_ARRAY_STORAGE_MODES:
+ case ALL_EFFECTFUL_MODES:
case Array::Undecided:
case Array::Unprofiled:
case Array::ForceExit:
@@ -273,7 +342,7 @@ inline bool benefitsFromStructureCheck(Array::Mode mode)
inline bool isEffectful(Array::Mode mode)
{
switch (mode) {
- case ALL_EFFECTFUL_ARRAY_STORAGE_MODES:
+ case ALL_EFFECTFUL_MODES:
return true;
default:
return false;