/ bytecode / ExpressionRangeInfo.h
ExpressionRangeInfo.h
  1  /*
  2   * Copyright (C) 2012-2013, 2016 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/StdLibExtras.h>
 29  
 30  namespace JSC {
 31  
 32  struct ExpressionRangeInfo {
 33      // Line and column values are encoded in 1 of 3 modes depending on the size
 34      // of their values. These modes are:
 35      //
 36      //   1. FatLine: 22-bit line, 8-bit column.
 37      //   2. FatColumn: 8-bit line, 22-bit column.
 38      //   3. FatLineAndColumn: 32-bit line, 32-bit column.
 39      //
 40      // For the first 2 modes, the line and column will be encoded in the 30-bit
 41      // position field in the ExpressionRangeInfo. For the FatLineAndColumn mode,
 42      // the position field will hold an index into a FatPosition vector which
 43      // holds the FatPosition records with the full 32-bit line and column values.
 44  
 45      enum {
 46          FatLineMode,
 47          FatColumnMode,
 48          FatLineAndColumnMode
 49      };
 50  
 51      struct FatPosition {
 52          uint32_t line;
 53          uint32_t column;
 54      };
 55  
 56      enum {
 57          FatLineModeLineShift = 8,
 58          FatLineModeLineMask = (1 << 22) - 1,
 59          FatLineModeColumnMask = (1 << 8) - 1,
 60          FatColumnModeLineShift = 22,
 61          FatColumnModeLineMask = (1 << 8) - 1,
 62          FatColumnModeColumnMask = (1 << 22) - 1
 63      };
 64  
 65      enum {
 66          MaxOffset = (1 << 7) - 1, 
 67          MaxDivot = (1 << 25) - 1,
 68          MaxFatLineModeLine = (1 << 22) - 1,
 69          MaxFatLineModeColumn = (1 << 8) - 1,
 70          MaxFatColumnModeLine = (1 << 8) - 1,
 71          MaxFatColumnModeColumn = (1 << 22) - 1
 72      };
 73  
 74      void encodeFatLineMode(unsigned line, unsigned column)
 75      {
 76          ASSERT(line <= MaxFatLineModeLine);
 77          ASSERT(column <= MaxFatLineModeColumn);
 78          position = ((line & FatLineModeLineMask) << FatLineModeLineShift | (column & FatLineModeColumnMask));
 79      }
 80  
 81      void encodeFatColumnMode(unsigned line, unsigned column)
 82      {
 83          ASSERT(line <= MaxFatColumnModeLine);
 84          ASSERT(column <= MaxFatColumnModeColumn);
 85          position = ((line & FatColumnModeLineMask) << FatColumnModeLineShift | (column & FatColumnModeColumnMask));
 86      }
 87  
 88      void decodeFatLineMode(unsigned& line, unsigned& column) const
 89      {
 90          line = (position >> FatLineModeLineShift) & FatLineModeLineMask;
 91          column = position & FatLineModeColumnMask;
 92      }
 93  
 94      void decodeFatColumnMode(unsigned& line, unsigned& column) const
 95      {
 96          line = (position >> FatColumnModeLineShift) & FatColumnModeLineMask;
 97          column = position & FatColumnModeColumnMask;
 98      }
 99  
100      uint32_t instructionOffset : 25;
101      uint32_t startOffset : 7;
102      uint32_t divotPoint : 25;
103      uint32_t endOffset : 7;
104      uint32_t mode : 2;
105      uint32_t position : 30;
106  };
107  
108  } // namespace JSC