Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(202)

Side by Side Diff: src/types-inl.h

Issue 1655833002: Remove the template magic from types.(h|cc), remove types-inl.h. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Undo whitespace change Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/types.cc ('k') | src/typing-asm.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef V8_TYPES_INL_H_
6 #define V8_TYPES_INL_H_
7
8 #include "src/types.h"
9
10 #include "src/factory.h"
11 #include "src/handles-inl.h"
12
13 namespace v8 {
14 namespace internal {
15
16 // -----------------------------------------------------------------------------
17 // TypeImpl
18
19 template<class Config>
20 typename TypeImpl<Config>::bitset TypeImpl<Config>::BitsetType::SignedSmall() {
21 return i::SmiValuesAre31Bits() ? kSigned31 : kSigned32;
22 }
23
24
25 template<class Config>
26 typename TypeImpl<Config>::bitset
27 TypeImpl<Config>::BitsetType::UnsignedSmall() {
28 return i::SmiValuesAre31Bits() ? kUnsigned30 : kUnsigned31;
29 }
30
31
32 #define CONSTRUCT_SIMD_TYPE(NAME, Name, name, lane_count, lane_type) \
33 template<class Config> \
34 typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::Name( \
35 Isolate* isolate, Region* region) { \
36 return Class(i::handle(isolate->heap()->name##_map()), region); \
37 }
38 SIMD128_TYPES(CONSTRUCT_SIMD_TYPE)
39 #undef CONSTRUCT_SIMD_TYPE
40
41
42 template<class Config>
43 TypeImpl<Config>* TypeImpl<Config>::cast(typename Config::Base* object) {
44 TypeImpl* t = static_cast<TypeImpl*>(object);
45 DCHECK(t->IsBitset() || t->IsClass() || t->IsConstant() || t->IsRange() ||
46 t->IsUnion() || t->IsArray() || t->IsFunction() || t->IsContext());
47 return t;
48 }
49
50
51 // Most precise _current_ type of a value (usually its class).
52 template<class Config>
53 typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::NowOf(
54 i::Object* value, Region* region) {
55 if (value->IsSmi() ||
56 i::HeapObject::cast(value)->map()->instance_type() == HEAP_NUMBER_TYPE) {
57 return Of(value, region);
58 }
59 return Class(i::handle(i::HeapObject::cast(value)->map()), region);
60 }
61
62
63 template<class Config>
64 bool TypeImpl<Config>::NowContains(i::Object* value) {
65 DisallowHeapAllocation no_allocation;
66 if (this->IsAny()) return true;
67 if (value->IsHeapObject()) {
68 i::Map* map = i::HeapObject::cast(value)->map();
69 for (Iterator<i::Map> it = this->Classes(); !it.Done(); it.Advance()) {
70 if (*it.Current() == map) return true;
71 }
72 }
73 return this->Contains(value);
74 }
75
76
77 // -----------------------------------------------------------------------------
78 // ZoneTypeConfig
79
80 // static
81 template<class T>
82 T* ZoneTypeConfig::handle(T* type) {
83 return type;
84 }
85
86
87 // static
88 template<class T>
89 T* ZoneTypeConfig::cast(Type* type) {
90 return static_cast<T*>(type);
91 }
92
93
94 // static
95 bool ZoneTypeConfig::is_bitset(Type* type) {
96 return reinterpret_cast<uintptr_t>(type) & 1;
97 }
98
99
100 // static
101 bool ZoneTypeConfig::is_struct(Type* type, int tag) {
102 DCHECK(tag != kRangeStructTag);
103 if (is_bitset(type)) return false;
104 int type_tag = struct_tag(as_struct(type));
105 return type_tag == tag;
106 }
107
108
109 // static
110 bool ZoneTypeConfig::is_range(Type* type) {
111 if (is_bitset(type)) return false;
112 int type_tag = struct_tag(as_struct(type));
113 return type_tag == kRangeStructTag;
114 }
115
116
117 // static
118 bool ZoneTypeConfig::is_class(Type* type) {
119 return false;
120 }
121
122
123 // static
124 ZoneTypeConfig::Type::bitset ZoneTypeConfig::as_bitset(Type* type) {
125 DCHECK(is_bitset(type));
126 return static_cast<Type::bitset>(reinterpret_cast<uintptr_t>(type) ^ 1u);
127 }
128
129
130 // static
131 ZoneTypeConfig::Struct* ZoneTypeConfig::as_struct(Type* type) {
132 DCHECK(!is_bitset(type));
133 return reinterpret_cast<Struct*>(type);
134 }
135
136
137 // static
138 ZoneTypeConfig::Range* ZoneTypeConfig::as_range(Type* type) {
139 DCHECK(!is_bitset(type));
140 return reinterpret_cast<Range*>(type);
141 }
142
143
144 // static
145 i::Handle<i::Map> ZoneTypeConfig::as_class(Type* type) {
146 UNREACHABLE();
147 return i::Handle<i::Map>();
148 }
149
150
151 // static
152 ZoneTypeConfig::Type* ZoneTypeConfig::from_bitset(Type::bitset bitset) {
153 return reinterpret_cast<Type*>(static_cast<uintptr_t>(bitset | 1u));
154 }
155
156
157 // static
158 ZoneTypeConfig::Type* ZoneTypeConfig::from_bitset(
159 Type::bitset bitset, Zone* Zone) {
160 return from_bitset(bitset);
161 }
162
163
164 // static
165 ZoneTypeConfig::Type* ZoneTypeConfig::from_struct(Struct* structure) {
166 return reinterpret_cast<Type*>(structure);
167 }
168
169
170 // static
171 ZoneTypeConfig::Type* ZoneTypeConfig::from_range(Range* range) {
172 return reinterpret_cast<Type*>(range);
173 }
174
175
176 // static
177 ZoneTypeConfig::Type* ZoneTypeConfig::from_class(
178 i::Handle<i::Map> map, Zone* zone) {
179 return from_bitset(0);
180 }
181
182
183 // static
184 ZoneTypeConfig::Struct* ZoneTypeConfig::struct_create(
185 int tag, int length, Zone* zone) {
186 DCHECK(tag != kRangeStructTag);
187 Struct* structure = reinterpret_cast<Struct*>(
188 zone->New(sizeof(void*) * (length + 2))); // NOLINT
189 structure[0] = reinterpret_cast<void*>(tag);
190 structure[1] = reinterpret_cast<void*>(length);
191 return structure;
192 }
193
194
195 // static
196 void ZoneTypeConfig::struct_shrink(Struct* structure, int length) {
197 DCHECK(0 <= length && length <= struct_length(structure));
198 structure[1] = reinterpret_cast<void*>(length);
199 }
200
201
202 // static
203 int ZoneTypeConfig::struct_tag(Struct* structure) {
204 return static_cast<int>(reinterpret_cast<intptr_t>(structure[0]));
205 }
206
207
208 // static
209 int ZoneTypeConfig::struct_length(Struct* structure) {
210 return static_cast<int>(reinterpret_cast<intptr_t>(structure[1]));
211 }
212
213
214 // static
215 Type* ZoneTypeConfig::struct_get(Struct* structure, int i) {
216 DCHECK(0 <= i && i <= struct_length(structure));
217 return static_cast<Type*>(structure[2 + i]);
218 }
219
220
221 // static
222 void ZoneTypeConfig::struct_set(Struct* structure, int i, Type* x) {
223 DCHECK(0 <= i && i <= struct_length(structure));
224 structure[2 + i] = x;
225 }
226
227
228 // static
229 template<class V>
230 i::Handle<V> ZoneTypeConfig::struct_get_value(Struct* structure, int i) {
231 DCHECK(0 <= i && i <= struct_length(structure));
232 return i::Handle<V>(static_cast<V**>(structure[2 + i]));
233 }
234
235
236 // static
237 template<class V>
238 void ZoneTypeConfig::struct_set_value(
239 Struct* structure, int i, i::Handle<V> x) {
240 DCHECK(0 <= i && i <= struct_length(structure));
241 structure[2 + i] = x.location();
242 }
243
244
245 // static
246 ZoneTypeConfig::Range* ZoneTypeConfig::range_create(Zone* zone) {
247 Range* range = reinterpret_cast<Range*>(zone->New(sizeof(Range))); // NOLINT
248 range->tag = reinterpret_cast<void*>(kRangeStructTag);
249 range->bitset = 0;
250 range->limits[0] = 1;
251 range->limits[1] = 0;
252 return range;
253 }
254
255
256 // static
257 int ZoneTypeConfig::range_get_bitset(ZoneTypeConfig::Range* range) {
258 return range->bitset;
259 }
260
261
262 // static
263 void ZoneTypeConfig::range_set_bitset(ZoneTypeConfig::Range* range, int value) {
264 range->bitset = value;
265 }
266
267
268 // static
269 double ZoneTypeConfig::range_get_double(ZoneTypeConfig::Range* range,
270 int index) {
271 DCHECK(index >= 0 && index < 2);
272 return range->limits[index];
273 }
274
275
276 // static
277 void ZoneTypeConfig::range_set_double(ZoneTypeConfig::Range* range, int index,
278 double value, Zone*) {
279 DCHECK(index >= 0 && index < 2);
280 range->limits[index] = value;
281 }
282
283 } // namespace internal
284 } // namespace v8
285
286 #endif // V8_TYPES_INL_H_
OLDNEW
« no previous file with comments | « src/types.cc ('k') | src/typing-asm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698