/ bytecode / DataFormat.h
DataFormat.h
  1  /*
  2   * Copyright (C) 2011-2020 Apple Inc. All rights reserved.
  3   *
  4   * Redistribution and use in source and binary forms, with or without
  5   * modification, are permitted provided that the following conditions
  6   * are met:
  7   * 1. Redistributions of source code must retain the above copyright
  8   *    notice, this list of conditions and the following disclaimer.
  9   * 2. Redistributions in binary form must reproduce the above copyright
 10   *    notice, this list of conditions and the following disclaimer in the
 11   *    documentation and/or other materials provided with the distribution.
 12   *
 13   * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 14   * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 15   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 16   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 17   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 18   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 19   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 20   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 21   * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 22   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 23   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 24   */
 25  
 26  #pragma once
 27  
 28  #include <wtf/Assertions.h>
 29  
 30  namespace JSC {
 31  
 32  // === DataFormat ===
 33  //
 34  // This enum tracks the current representation in which a value is being held.
 35  // Values may be unboxed primitives (int32, double, or cell), or boxed as a JSValue.
 36  // For boxed values, we may know the type of boxing that has taken place.
 37  // (May also need bool, array, object, string types!)
 38  enum DataFormat : uint8_t {
 39      DataFormatNone = 0,
 40      DataFormatInt32 = 1,
 41      DataFormatInt52 = 2, // Int52's are left-shifted by 12 by default.
 42      DataFormatStrictInt52 = 3, // "Strict" Int52 means it's not shifted.
 43      DataFormatDouble = 4,
 44      DataFormatBoolean = 5,
 45      DataFormatCell = 6,
 46      DataFormatStorage = 7,
 47      DataFormatBigInt32 = 8, // FIXME: https://bugs.webkit.org/show_bug.cgi?id=210957 Actually support BigInt32 DataFormat.
 48      DataFormatJS = 16,
 49      DataFormatJSInt32 = DataFormatJS | DataFormatInt32,
 50      DataFormatJSDouble = DataFormatJS | DataFormatDouble,
 51      DataFormatJSCell = DataFormatJS | DataFormatCell,
 52      DataFormatJSBoolean = DataFormatJS | DataFormatBoolean,
 53      DataFormatJSBigInt32 = DataFormatJS | DataFormatBigInt32,
 54  
 55      // Marker deliminating ordinary data formats and OSR-only data formats.
 56      DataFormatOSRMarker = 32, 
 57      
 58      // Special data formats used only for OSR.
 59      DataFormatDead = 33, // Implies jsUndefined().
 60  };
 61  
 62  inline const char* dataFormatToString(DataFormat dataFormat)
 63  {
 64      switch (dataFormat) {
 65      case DataFormatNone:
 66          return "None";
 67      case DataFormatInt32:
 68          return "Int32";
 69      case DataFormatInt52:
 70          return "Int52";
 71      case DataFormatStrictInt52:
 72          return "StrictInt52";
 73      case DataFormatDouble:
 74          return "Double";
 75      case DataFormatCell:
 76          return "Cell";
 77      case DataFormatBoolean:
 78          return "Boolean";
 79      case DataFormatStorage:
 80          return "Storage";
 81      case DataFormatBigInt32:
 82          return "BigInt32";
 83      case DataFormatJS:
 84          return "JS";
 85      case DataFormatJSInt32:
 86          return "JSInt32";
 87      case DataFormatJSDouble:
 88          return "JSDouble";
 89      case DataFormatJSCell:
 90          return "JSCell";
 91      case DataFormatJSBoolean:
 92          return "JSBoolean";
 93      case DataFormatJSBigInt32:
 94          return "JSBigInt32";
 95      case DataFormatDead:
 96          return "Dead";
 97      default:
 98          RELEASE_ASSERT_NOT_REACHED();
 99          return "Unknown";
100      }
101  }
102  
103  inline bool isJSFormat(DataFormat format, DataFormat expectedFormat)
104  {
105      ASSERT(expectedFormat & DataFormatJS);
106      return (format | DataFormatJS) == expectedFormat;
107  }
108  
109  inline bool isJSInt32(DataFormat format)
110  {
111      return isJSFormat(format, DataFormatJSInt32);
112  }
113  
114  inline bool isJSDouble(DataFormat format)
115  {
116      return isJSFormat(format, DataFormatJSDouble);
117  }
118  
119  inline bool isJSCell(DataFormat format)
120  {
121      return isJSFormat(format, DataFormatJSCell);
122  }
123  
124  inline bool isJSBoolean(DataFormat format)
125  {
126      return isJSFormat(format, DataFormatJSBoolean);
127  }
128  
129  } // namespace JSC
130  
131  namespace WTF {
132  
133  class PrintStream;
134  void printInternal(PrintStream&, JSC::DataFormat);
135  
136  } // namespace WTF