]> git.saurik.com Git - apple/javascriptcore.git/blob - runtime/PropertyOffset.h
JavaScriptCore-1218.tar.gz
[apple/javascriptcore.git] / runtime / PropertyOffset.h
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 #ifndef PropertyOffset_h
27 #define PropertyOffset_h
28
29 #include <wtf/Platform.h>
30 #include <wtf/StdLibExtras.h>
31
32 namespace JSC {
33
34 typedef int PropertyOffset;
35
36 static const PropertyOffset invalidOffset = -1;
37 static const PropertyOffset firstOutOfLineOffset = 100;
38
39 // Declare all of the functions because they tend to do forward calls.
40 inline void checkOffset(PropertyOffset);
41 inline void checkOffset(PropertyOffset, int inlineCapacity);
42 inline void validateOffset(PropertyOffset);
43 inline void validateOffset(PropertyOffset, int inlineCapacity);
44 inline bool isValidOffset(PropertyOffset);
45 inline bool isInlineOffset(PropertyOffset);
46 inline bool isOutOfLineOffset(PropertyOffset);
47 inline size_t offsetInInlineStorage(PropertyOffset);
48 inline size_t offsetInOutOfLineStorage(PropertyOffset);
49 inline size_t offsetInRespectiveStorage(PropertyOffset);
50 inline size_t numberOfOutOfLineSlotsForLastOffset(PropertyOffset);
51 inline size_t numberOfSlotsForLastOffset(PropertyOffset, int inlineCapacity);
52
53 inline void checkOffset(PropertyOffset offset)
54 {
55 UNUSED_PARAM(offset);
56 ASSERT(offset >= invalidOffset);
57 }
58
59 inline 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
69 inline void validateOffset(PropertyOffset offset)
70 {
71 checkOffset(offset);
72 ASSERT(isValidOffset(offset));
73 }
74
75 inline void validateOffset(PropertyOffset offset, int inlineCapacity)
76 {
77 checkOffset(offset, inlineCapacity);
78 ASSERT(isValidOffset(offset));
79 }
80
81 inline bool isValidOffset(PropertyOffset offset)
82 {
83 checkOffset(offset);
84 return offset != invalidOffset;
85 }
86
87 inline bool isInlineOffset(PropertyOffset offset)
88 {
89 checkOffset(offset);
90 return offset < firstOutOfLineOffset;
91 }
92
93 inline bool isOutOfLineOffset(PropertyOffset offset)
94 {
95 checkOffset(offset);
96 return !isInlineOffset(offset);
97 }
98
99 inline size_t offsetInInlineStorage(PropertyOffset offset)
100 {
101 validateOffset(offset);
102 ASSERT(isInlineOffset(offset));
103 return offset;
104 }
105
106 inline size_t offsetInOutOfLineStorage(PropertyOffset offset)
107 {
108 validateOffset(offset);
109 ASSERT(isOutOfLineOffset(offset));
110 return -static_cast<ptrdiff_t>(offset - firstOutOfLineOffset) - 1;
111 }
112
113 inline size_t offsetInRespectiveStorage(PropertyOffset offset)
114 {
115 if (isInlineOffset(offset))
116 return offsetInInlineStorage(offset);
117 return offsetInOutOfLineStorage(offset);
118 }
119
120 inline size_t numberOfOutOfLineSlotsForLastOffset(PropertyOffset offset)
121 {
122 checkOffset(offset);
123 if (offset < firstOutOfLineOffset)
124 return 0;
125 return offset - firstOutOfLineOffset + 1;
126 }
127
128 inline 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
136 inline 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
148 #endif // PropertyOffset_h