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
30namespace JSC {
31
32struct 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
109