ExpressionRangeInfo.h 3.9 KB

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