1/*
2 * Copyright (C) 2012 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
32typedef int PropertyOffset;
33
34static constexpr PropertyOffset invalidOffset = -1;
35static constexpr PropertyOffset firstOutOfLineOffset = 100;
36static constexpr PropertyOffset knownPolyProtoOffset = 0;
37static_assert(knownPolyProtoOffset < firstOutOfLineOffset, "We assume in all the JITs that the poly proto offset is an inline offset");
38
39// Declare all of the functions because they tend to do forward calls.
40inline void checkOffset(PropertyOffset);
41inline void checkOffset(PropertyOffset, int inlineCapacity);
42inline void validateOffset(PropertyOffset);
43inline void validateOffset(PropertyOffset, int inlineCapacity);
44inline bool isValidOffset(PropertyOffset);
45inline bool isInlineOffset(PropertyOffset);
46inline bool isOutOfLineOffset(PropertyOffset);
47inline size_t offsetInInlineStorage(PropertyOffset);
48inline size_t offsetInOutOfLineStorage(PropertyOffset);
49inline size_t offsetInRespectiveStorage(PropertyOffset);
50inline size_t numberOfOutOfLineSlotsForLastOffset(PropertyOffset);
51inline size_t numberOfSlotsForLastOffset(PropertyOffset, int inlineCapacity);
52
53inline void checkOffset(PropertyOffset offset)
54{
55 UNUSED_PARAM(offset);
56 ASSERT(offset >= invalidOffset);
57}
58
59inline void checkOffset(PropertyOffset offset, int inlineCapacity)
60{
61 UNUSED_PARAM(offset);
62 UNUSED_PARAM(inlineCapacity);
63 ASSERT(offset >= invalidOffset);
64 ASSERT(offset == invalidOffset
65 || offset < inlineCapacity
66 || isOutOfLineOffset(offset));
67}
68
69inline void validateOffset(PropertyOffset offset)
70{
71 checkOffset(offset);
72 ASSERT(isValidOffset(offset));
73}
74
75inline void validateOffset(PropertyOffset offset, int inlineCapacity)
76{
77 checkOffset(offset, inlineCapacity);
78 ASSERT(isValidOffset(offset));
79}
80
81inline bool isValidOffset(PropertyOffset offset)
82{
83 checkOffset(offset);
84 return offset != invalidOffset;
85}
86
87inline bool isInlineOffset(PropertyOffset offset)
88{
89 checkOffset(offset);
90 return offset < firstOutOfLineOffset;
91}
92
93inline bool isOutOfLineOffset(PropertyOffset offset)
94{
95 checkOffset(offset);
96 return !isInlineOffset(offset);
97}
98
99inline size_t offsetInInlineStorage(PropertyOffset offset)
100{
101 validateOffset(offset);
102 ASSERT(isInlineOffset(offset));
103 return offset;
104}
105
106inline size_t offsetInOutOfLineStorage(PropertyOffset offset)
107{
108 validateOffset(offset);
109 ASSERT(isOutOfLineOffset(offset));
110 return -static_cast<ptrdiff_t>(offset - firstOutOfLineOffset) - 1;
111}
112
113inline size_t offsetInRespectiveStorage(PropertyOffset offset)
114{
115 if (isInlineOffset(offset))
116 return offsetInInlineStorage(offset);
117 return offsetInOutOfLineStorage(offset);
118}
119
120inline size_t numberOfOutOfLineSlotsForLastOffset(PropertyOffset offset)
121{
122 checkOffset(offset);
123 if (offset < firstOutOfLineOffset)
124 return 0;
125 return offset - firstOutOfLineOffset + 1;
126}
127
128inline size_t numberOfSlotsForLastOffset(PropertyOffset offset, int inlineCapacity)
129{
130 checkOffset(offset, inlineCapacity);
131 if (offset < inlineCapacity)
132 return offset + 1;
133 return inlineCapacity + numberOfOutOfLineSlotsForLastOffset(offset);
134}
135
136inline PropertyOffset offsetForPropertyNumber(int propertyNumber, int inlineCapacity)
137{
138 PropertyOffset offset = propertyNumber;
139 if (offset >= inlineCapacity) {
140 offset += firstOutOfLineOffset;
141 offset -= inlineCapacity;
142 }
143 return offset;
144}
145
146} // namespace JSC
147