Index: src/elements-kind.cc |
diff --git a/src/elements-kind.cc b/src/elements-kind.cc |
index 7b1a65aae1eb169ac019c37e3095900a21d43603..d77b74bc0ea09d87ae5efaae7f8958124a5b32c1 100644 |
--- a/src/elements-kind.cc |
+++ b/src/elements-kind.cc |
@@ -178,6 +178,11 @@ static bool IsTypedArrayElementsKind(ElementsKind elements_kind) { |
} |
+static inline bool IsFastTransitionTarget(ElementsKind elements_kind) { |
+ return IsFastElementsKind(elements_kind) || |
+ elements_kind == DICTIONARY_ELEMENTS; |
+} |
+ |
bool IsMoreGeneralElementsKindTransition(ElementsKind from_kind, |
ElementsKind to_kind) { |
if (IsTypedArrayElementsKind(from_kind) || |
@@ -193,26 +198,29 @@ bool IsMoreGeneralElementsKindTransition(ElementsKind from_kind, |
return false; |
} |
} |
- switch (from_kind) { |
- case FAST_SMI_ELEMENTS: |
- return to_kind != FAST_SMI_ELEMENTS; |
- case FAST_HOLEY_SMI_ELEMENTS: |
- return to_kind != FAST_SMI_ELEMENTS && |
- to_kind != FAST_HOLEY_SMI_ELEMENTS; |
- case FAST_DOUBLE_ELEMENTS: |
- return to_kind != FAST_SMI_ELEMENTS && |
- to_kind != FAST_HOLEY_SMI_ELEMENTS && |
- to_kind != FAST_DOUBLE_ELEMENTS; |
- case FAST_HOLEY_DOUBLE_ELEMENTS: |
- return to_kind == FAST_ELEMENTS || |
- to_kind == FAST_HOLEY_ELEMENTS; |
- case FAST_ELEMENTS: |
- return to_kind == FAST_HOLEY_ELEMENTS; |
- case FAST_HOLEY_ELEMENTS: |
- return false; |
- default: |
- return false; |
+ if (IsFastElementsKind(from_kind) && IsFastTransitionTarget(to_kind)) { |
+ switch (from_kind) { |
+ case FAST_SMI_ELEMENTS: |
+ return to_kind != FAST_SMI_ELEMENTS; |
+ case FAST_HOLEY_SMI_ELEMENTS: |
+ return to_kind != FAST_SMI_ELEMENTS && |
+ to_kind != FAST_HOLEY_SMI_ELEMENTS; |
+ case FAST_DOUBLE_ELEMENTS: |
+ return to_kind != FAST_SMI_ELEMENTS && |
+ to_kind != FAST_HOLEY_SMI_ELEMENTS && |
+ to_kind != FAST_DOUBLE_ELEMENTS; |
+ case FAST_HOLEY_DOUBLE_ELEMENTS: |
+ return to_kind == FAST_ELEMENTS || |
+ to_kind == FAST_HOLEY_ELEMENTS; |
+ case FAST_ELEMENTS: |
+ return to_kind == FAST_HOLEY_ELEMENTS; |
+ case FAST_HOLEY_ELEMENTS: |
+ return false; |
+ default: |
+ return false; |
+ } |
} |
+ return false; |
} |