LCOV - code coverage report
Current view: top level - src - elements-kind.h (source / functions) Hit Total Coverage
Test: app.info Lines: 37 38 97.4 %
Date: 2017-10-20 Functions: 6 6 100.0 %

          Line data    Source code
       1             : // Copyright 2012 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #ifndef V8_ELEMENTS_KIND_H_
       6             : #define V8_ELEMENTS_KIND_H_
       7             : 
       8             : #include "src/base/macros.h"
       9             : #include "src/checks.h"
      10             : 
      11             : namespace v8 {
      12             : namespace internal {
      13             : 
      14             : enum ElementsKind {
      15             :   // The "fast" kind for elements that only contain SMI values. Must be first
      16             :   // to make it possible to efficiently check maps for this kind.
      17             :   PACKED_SMI_ELEMENTS,
      18             :   HOLEY_SMI_ELEMENTS,
      19             : 
      20             :   // The "fast" kind for tagged values. Must be second to make it possible to
      21             :   // efficiently check maps for this and the PACKED_SMI_ELEMENTS kind
      22             :   // together at once.
      23             :   PACKED_ELEMENTS,
      24             :   HOLEY_ELEMENTS,
      25             : 
      26             :   // The "fast" kind for unwrapped, non-tagged double values.
      27             :   PACKED_DOUBLE_ELEMENTS,
      28             :   HOLEY_DOUBLE_ELEMENTS,
      29             : 
      30             :   // The "slow" kind.
      31             :   DICTIONARY_ELEMENTS,
      32             : 
      33             :   // Elements kind of the "arguments" object (only in sloppy mode).
      34             :   FAST_SLOPPY_ARGUMENTS_ELEMENTS,
      35             :   SLOW_SLOPPY_ARGUMENTS_ELEMENTS,
      36             : 
      37             :   // For string wrapper objects ("new String('...')"), the string's characters
      38             :   // are overlaid onto a regular elements backing store.
      39             :   FAST_STRING_WRAPPER_ELEMENTS,
      40             :   SLOW_STRING_WRAPPER_ELEMENTS,
      41             : 
      42             :   // Fixed typed arrays.
      43             :   UINT8_ELEMENTS,
      44             :   INT8_ELEMENTS,
      45             :   UINT16_ELEMENTS,
      46             :   INT16_ELEMENTS,
      47             :   UINT32_ELEMENTS,
      48             :   INT32_ELEMENTS,
      49             :   FLOAT32_ELEMENTS,
      50             :   FLOAT64_ELEMENTS,
      51             :   UINT8_CLAMPED_ELEMENTS,
      52             : 
      53             :   // Sentinel ElementsKind for objects with no elements.
      54             :   NO_ELEMENTS,
      55             : 
      56             :   // Derived constants from ElementsKind.
      57             :   FIRST_ELEMENTS_KIND = PACKED_SMI_ELEMENTS,
      58             :   LAST_ELEMENTS_KIND = UINT8_CLAMPED_ELEMENTS,
      59             :   FIRST_FAST_ELEMENTS_KIND = PACKED_SMI_ELEMENTS,
      60             :   LAST_FAST_ELEMENTS_KIND = HOLEY_DOUBLE_ELEMENTS,
      61             :   FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND = UINT8_ELEMENTS,
      62             :   LAST_FIXED_TYPED_ARRAY_ELEMENTS_KIND = UINT8_CLAMPED_ELEMENTS,
      63             :   TERMINAL_FAST_ELEMENTS_KIND = HOLEY_ELEMENTS
      64             : };
      65             : 
      66             : const int kElementsKindCount = LAST_ELEMENTS_KIND - FIRST_ELEMENTS_KIND + 1;
      67             : const int kFastElementsKindCount =
      68             :     LAST_FAST_ELEMENTS_KIND - FIRST_FAST_ELEMENTS_KIND + 1;
      69             : 
      70             : // The number to add to a packed elements kind to reach a holey elements kind
      71             : const int kFastElementsKindPackedToHoley =
      72             :     HOLEY_SMI_ELEMENTS - PACKED_SMI_ELEMENTS;
      73             : 
      74             : int ElementsKindToShiftSize(ElementsKind elements_kind);
      75             : int GetDefaultHeaderSizeForElementsKind(ElementsKind elements_kind);
      76             : const char* ElementsKindToString(ElementsKind kind);
      77             : 
      78             : inline ElementsKind GetInitialFastElementsKind() { return PACKED_SMI_ELEMENTS; }
      79             : 
      80             : ElementsKind GetFastElementsKindFromSequenceIndex(int sequence_number);
      81             : int GetSequenceIndexFromFastElementsKind(ElementsKind elements_kind);
      82             : 
      83             : ElementsKind GetNextTransitionElementsKind(ElementsKind elements_kind);
      84             : 
      85             : inline bool IsDictionaryElementsKind(ElementsKind kind) {
      86             :   return kind == DICTIONARY_ELEMENTS;
      87             : }
      88             : 
      89             : inline bool IsSloppyArgumentsElementsKind(ElementsKind kind) {
      90     7377337 :   return kind == FAST_SLOPPY_ARGUMENTS_ELEMENTS ||
      91     1203327 :          kind == SLOW_SLOPPY_ARGUMENTS_ELEMENTS;
      92             : }
      93             : 
      94             : inline bool IsStringWrapperElementsKind(ElementsKind kind) {
      95     6174177 :   return kind == FAST_STRING_WRAPPER_ELEMENTS ||
      96       93274 :          kind == SLOW_STRING_WRAPPER_ELEMENTS;
      97             : }
      98             : 
      99        2515 : inline bool IsFixedTypedArrayElementsKind(ElementsKind kind) {
     100    34520145 :   return kind >= FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND &&
     101     1545804 :          kind <= LAST_FIXED_TYPED_ARRAY_ELEMENTS_KIND;
     102             : }
     103             : 
     104             : inline bool IsTerminalElementsKind(ElementsKind kind) {
     105      177646 :   return kind == TERMINAL_FAST_ELEMENTS_KIND ||
     106             :          IsFixedTypedArrayElementsKind(kind);
     107             : }
     108             : 
     109        5853 : inline bool IsFastElementsKind(ElementsKind kind) {
     110             :   STATIC_ASSERT(FIRST_FAST_ELEMENTS_KIND == 0);
     111    99739337 :   return kind <= HOLEY_DOUBLE_ELEMENTS;
     112             : }
     113             : 
     114             : inline bool IsTransitionElementsKind(ElementsKind kind) {
     115         837 :   return IsFastElementsKind(kind) || IsFixedTypedArrayElementsKind(kind) ||
     116      429796 :          kind == FAST_SLOPPY_ARGUMENTS_ELEMENTS ||
     117         837 :          kind == FAST_STRING_WRAPPER_ELEMENTS;
     118             : }
     119             : 
     120             : inline bool IsDoubleElementsKind(ElementsKind kind) {
     121    30961766 :   return kind == PACKED_DOUBLE_ELEMENTS || kind == HOLEY_DOUBLE_ELEMENTS;
     122             : }
     123             : 
     124             : 
     125             : inline bool IsFixedFloatElementsKind(ElementsKind kind) {
     126             :   return kind == FLOAT32_ELEMENTS || kind == FLOAT64_ELEMENTS;
     127             : }
     128             : 
     129             : 
     130             : inline bool IsDoubleOrFloatElementsKind(ElementsKind kind) {
     131             :   return IsDoubleElementsKind(kind) || IsFixedFloatElementsKind(kind);
     132             : }
     133             : 
     134             : inline bool IsSmiOrObjectElementsKind(ElementsKind kind) {
     135             :   return kind == PACKED_SMI_ELEMENTS || kind == HOLEY_SMI_ELEMENTS ||
     136     1502121 :          kind == PACKED_ELEMENTS || kind == HOLEY_ELEMENTS;
     137             : }
     138             : 
     139             : inline bool IsSmiElementsKind(ElementsKind kind) {
     140     1775593 :   return kind == PACKED_SMI_ELEMENTS || kind == HOLEY_SMI_ELEMENTS;
     141             : }
     142             : 
     143       26192 : inline bool IsFastNumberElementsKind(ElementsKind kind) {
     144       29251 :   return IsSmiElementsKind(kind) || IsDoubleElementsKind(kind);
     145             : }
     146             : 
     147             : inline bool IsObjectElementsKind(ElementsKind kind) {
     148    10564002 :   return kind == PACKED_ELEMENTS || kind == HOLEY_ELEMENTS;
     149             : }
     150             : 
     151        2419 : inline bool IsHoleyElementsKind(ElementsKind kind) {
     152    16650330 :   return kind == HOLEY_SMI_ELEMENTS || kind == HOLEY_DOUBLE_ELEMENTS ||
     153        2419 :          kind == HOLEY_ELEMENTS;
     154             : }
     155             : 
     156             : inline bool IsHoleyOrDictionaryElementsKind(ElementsKind kind) {
     157     8541412 :   return IsHoleyElementsKind(kind) || kind == DICTIONARY_ELEMENTS;
     158             : }
     159             : 
     160             : 
     161        5224 : inline bool IsFastPackedElementsKind(ElementsKind kind) {
     162     2339261 :   return kind == PACKED_SMI_ELEMENTS || kind == PACKED_DOUBLE_ELEMENTS ||
     163        5224 :          kind == PACKED_ELEMENTS;
     164             : }
     165             : 
     166             : 
     167             : inline ElementsKind GetPackedElementsKind(ElementsKind holey_kind) {
     168      412612 :   if (holey_kind == HOLEY_SMI_ELEMENTS) {
     169             :     return PACKED_SMI_ELEMENTS;
     170             :   }
     171      289786 :   if (holey_kind == HOLEY_DOUBLE_ELEMENTS) {
     172             :     return PACKED_DOUBLE_ELEMENTS;
     173             :   }
     174      289659 :   if (holey_kind == HOLEY_ELEMENTS) {
     175             :     return PACKED_ELEMENTS;
     176             :   }
     177             :   return holey_kind;
     178             : }
     179             : 
     180             : 
     181         761 : inline ElementsKind GetHoleyElementsKind(ElementsKind packed_kind) {
     182    16543055 :   if (packed_kind == PACKED_SMI_ELEMENTS) {
     183             :     return HOLEY_SMI_ELEMENTS;
     184             :   }
     185    11261936 :   if (packed_kind == PACKED_DOUBLE_ELEMENTS) {
     186             :     return HOLEY_DOUBLE_ELEMENTS;
     187             :   }
     188    11021114 :   if (packed_kind == PACKED_ELEMENTS) {
     189             :     return HOLEY_ELEMENTS;
     190             :   }
     191           0 :   return packed_kind;
     192             : }
     193             : 
     194             : 
     195             : inline ElementsKind FastSmiToObjectElementsKind(ElementsKind from_kind) {
     196             :   DCHECK(IsSmiElementsKind(from_kind));
     197             :   return (from_kind == PACKED_SMI_ELEMENTS) ? PACKED_ELEMENTS : HOLEY_ELEMENTS;
     198             : }
     199             : 
     200             : 
     201             : inline bool IsSimpleMapChangeTransition(ElementsKind from_kind,
     202             :                                         ElementsKind to_kind) {
     203        1772 :   return (GetHoleyElementsKind(from_kind) == to_kind) ||
     204        1392 :          (IsSmiElementsKind(from_kind) && IsObjectElementsKind(to_kind));
     205             : }
     206             : 
     207             : 
     208             : bool IsMoreGeneralElementsKindTransition(ElementsKind from_kind,
     209             :                                          ElementsKind to_kind);
     210             : 
     211             : 
     212             : inline ElementsKind GetMoreGeneralElementsKind(ElementsKind from_kind,
     213             :                                                ElementsKind to_kind) {
     214    15102396 :   if (IsMoreGeneralElementsKindTransition(from_kind, to_kind)) {
     215             :     return to_kind;
     216             :   }
     217             :   return from_kind;
     218             : }
     219             : 
     220             : 
     221             : inline bool IsTransitionableFastElementsKind(ElementsKind from_kind) {
     222     8278494 :   return IsFastElementsKind(from_kind) &&
     223             :          from_kind != TERMINAL_FAST_ELEMENTS_KIND;
     224             : }
     225             : 
     226             : 
     227             : }  // namespace internal
     228             : }  // namespace v8
     229             : 
     230             : #endif  // V8_ELEMENTS_KIND_H_

Generated by: LCOV version 1.10