OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_TYPES_INL_H_ | 5 #ifndef V8_TYPES_INL_H_ |
6 #define V8_TYPES_INL_H_ | 6 #define V8_TYPES_INL_H_ |
7 | 7 |
8 #include "types.h" | 8 #include "types.h" |
9 | 9 |
10 #include "factory.h" | 10 #include "factory.h" |
11 #include "handles-inl.h" | 11 #include "handles-inl.h" |
12 | 12 |
13 namespace v8 { | 13 namespace v8 { |
14 namespace internal { | 14 namespace internal { |
15 | 15 |
16 // static | 16 // static |
| 17 ZoneTypeConfig::Tagged* ZoneTypeConfig::tagged_create( |
| 18 Tag tag, int size, Zone* zone) { |
| 19 Tagged* tagged = new(zone) Tagged(size + 1, zone); |
| 20 tagged->Add(reinterpret_cast<void*>(tag), zone); |
| 21 tagged->AddBlock(NULL, size, zone); |
| 22 return tagged; |
| 23 } |
| 24 |
| 25 |
| 26 // static |
| 27 void ZoneTypeConfig::tagged_shrink(Tagged* tagged, int size) { |
| 28 tagged->Rewind(size + 1); |
| 29 } |
| 30 |
| 31 |
| 32 // static |
| 33 ZoneTypeConfig::Tag ZoneTypeConfig::tagged_tag(Tagged* tagged) { |
| 34 return static_cast<Tag>(reinterpret_cast<intptr_t>(tagged->at(0))); |
| 35 } |
| 36 |
| 37 |
| 38 // static |
| 39 template<class T> |
| 40 T ZoneTypeConfig::tagged_get(Tagged* tagged, int i) { |
| 41 return reinterpret_cast<T>(tagged->at(i + 1)); |
| 42 } |
| 43 |
| 44 |
| 45 // static |
| 46 template<class T> |
| 47 void ZoneTypeConfig::tagged_set(Tagged* tagged, int i, T value) { |
| 48 tagged->at(i + 1) = reinterpret_cast<void*>(value); |
| 49 } |
| 50 |
| 51 |
| 52 // static |
| 53 int ZoneTypeConfig::tagged_length(Tagged* tagged) { |
| 54 return tagged->length() - 1; |
| 55 } |
| 56 |
| 57 |
| 58 // static |
17 Type* ZoneTypeConfig::handle(Type* type) { | 59 Type* ZoneTypeConfig::handle(Type* type) { |
18 return type; | 60 return type; |
19 } | 61 } |
20 | 62 |
21 | 63 |
22 // static | 64 // static |
| 65 bool ZoneTypeConfig::is(Type* type, Tag tag) { |
| 66 return is_tagged(type) && tagged_tag(as_tagged(type)) == tag; |
| 67 } |
| 68 |
| 69 |
| 70 // static |
23 bool ZoneTypeConfig::is_bitset(Type* type) { | 71 bool ZoneTypeConfig::is_bitset(Type* type) { |
24 return reinterpret_cast<intptr_t>(type) & 1; | 72 return reinterpret_cast<intptr_t>(type) & 1; |
25 } | 73 } |
26 | 74 |
27 | 75 |
28 // static | 76 // static |
29 bool ZoneTypeConfig::is_struct(Type* type) { | 77 bool ZoneTypeConfig::is_tagged(Type* type) { |
30 return !is_bitset(type); | 78 return !is_bitset(type); |
31 } | 79 } |
32 | 80 |
33 | 81 |
34 // static | 82 // static |
35 bool ZoneTypeConfig::is_class(Type* type) { | 83 bool ZoneTypeConfig::is_class(Type* type) { |
36 return is_struct(type) && struct_tag(as_struct(type)) == Type::kClassTag; | 84 return is(type, kClassTag); |
37 } | 85 } |
38 | 86 |
39 | 87 |
40 // static | 88 // static |
41 bool ZoneTypeConfig::is_constant(Type* type) { | 89 bool ZoneTypeConfig::is_constant(Type* type) { |
42 return is_struct(type) && struct_tag(as_struct(type)) == Type::kConstantTag; | 90 return is(type, kConstantTag); |
43 } | 91 } |
44 | 92 |
45 | 93 |
| 94 // static |
| 95 bool ZoneTypeConfig::is_union(Type* type) { |
| 96 return is(type, kUnionTag); |
| 97 } |
| 98 |
| 99 |
| 100 // static |
| 101 bool ZoneTypeConfig::tagged_is_union(Tagged* tagged) { |
| 102 return is(from_tagged(tagged), kUnionTag); |
| 103 } |
| 104 |
| 105 |
46 // static | 106 // static |
47 int ZoneTypeConfig::as_bitset(Type* type) { | 107 int ZoneTypeConfig::as_bitset(Type* type) { |
48 ASSERT(is_bitset(type)); | 108 ASSERT(is_bitset(type)); |
49 return static_cast<int>(reinterpret_cast<intptr_t>(type) >> 1); | 109 return static_cast<int>(reinterpret_cast<intptr_t>(type) >> 1); |
50 } | 110 } |
51 | 111 |
52 | 112 |
53 // static | 113 // static |
54 ZoneTypeConfig::Struct* ZoneTypeConfig::as_struct(Type* type) { | 114 ZoneTypeConfig::Tagged* ZoneTypeConfig::as_tagged(Type* type) { |
55 ASSERT(is_struct(type)); | 115 ASSERT(is_tagged(type)); |
56 return reinterpret_cast<Struct*>(type); | 116 return reinterpret_cast<Tagged*>(type); |
57 } | 117 } |
58 | 118 |
59 | 119 |
60 // static | 120 // static |
61 i::Handle<i::Map> ZoneTypeConfig::as_class(Type* type) { | 121 i::Handle<i::Map> ZoneTypeConfig::as_class(Type* type) { |
62 ASSERT(is_class(type)); | 122 ASSERT(is_class(type)); |
63 return i::Handle<i::Map>(static_cast<i::Map**>(as_struct(type)->args[1])); | 123 return i::Handle<i::Map>(tagged_get<i::Map**>(as_tagged(type), 1)); |
64 } | 124 } |
65 | 125 |
66 | 126 |
67 // static | 127 // static |
68 i::Handle<i::Object> ZoneTypeConfig::as_constant(Type* type) { | 128 i::Handle<i::Object> ZoneTypeConfig::as_constant(Type* type) { |
69 ASSERT(is_constant(type)); | 129 ASSERT(is_constant(type)); |
70 return i::Handle<i::Object>( | 130 return i::Handle<i::Object>(tagged_get<i::Object**>(as_tagged(type), 1)); |
71 static_cast<i::Object**>(as_struct(type)->args[1])); | |
72 } | 131 } |
73 | 132 |
74 | 133 |
| 134 // static |
| 135 ZoneTypeConfig::Unioned* ZoneTypeConfig::as_union(Type* type) { |
| 136 ASSERT(is_union(type)); |
| 137 return tagged_as_union(as_tagged(type)); |
| 138 } |
| 139 |
| 140 |
| 141 // static |
| 142 ZoneTypeConfig::Unioned* ZoneTypeConfig::tagged_as_union(Tagged* tagged) { |
| 143 ASSERT(tagged_is_union(tagged)); |
| 144 return reinterpret_cast<Unioned*>(tagged); |
| 145 } |
| 146 |
| 147 |
75 // static | 148 // static |
76 ZoneTypeConfig::Type* ZoneTypeConfig::from_bitset(int bitset) { | 149 ZoneTypeConfig::Type* ZoneTypeConfig::from_bitset(int bitset) { |
77 return reinterpret_cast<Type*>((bitset << 1) | 1); | 150 return reinterpret_cast<Type*>((bitset << 1) | 1); |
78 } | 151 } |
79 | 152 |
80 | 153 |
81 // static | 154 // static |
82 ZoneTypeConfig::Type* ZoneTypeConfig::from_bitset(int bitset, Zone* Zone) { | 155 ZoneTypeConfig::Type* ZoneTypeConfig::from_bitset(int bitset, Zone* Zone) { |
83 return from_bitset(bitset); | 156 return from_bitset(bitset); |
84 } | 157 } |
85 | 158 |
86 | 159 |
87 // static | 160 // static |
88 ZoneTypeConfig::Type* ZoneTypeConfig::from_struct(Struct* structured) { | 161 ZoneTypeConfig::Type* ZoneTypeConfig::from_tagged(Tagged* tagged) { |
89 return reinterpret_cast<Type*>(structured); | 162 return reinterpret_cast<Type*>(tagged); |
90 } | 163 } |
91 | 164 |
92 | 165 |
93 // static | 166 // static |
94 ZoneTypeConfig::Type* ZoneTypeConfig::from_class( | 167 ZoneTypeConfig::Type* ZoneTypeConfig::from_class( |
95 i::Handle<i::Map> map, int lub, Zone* zone) { | 168 i::Handle<i::Map> map, int lub, Zone* zone) { |
96 Struct* structured = struct_create(Type::kClassTag, 2, zone); | 169 Tagged* tagged = tagged_create(kClassTag, 2, zone); |
97 structured->args[0] = from_bitset(lub); | 170 tagged_set(tagged, 0, lub); |
98 structured->args[1] = map.location(); | 171 tagged_set(tagged, 1, map.location()); |
99 return from_struct(structured); | 172 return from_tagged(tagged); |
100 } | 173 } |
101 | 174 |
102 | 175 |
103 // static | 176 // static |
104 ZoneTypeConfig::Type* ZoneTypeConfig::from_constant( | 177 ZoneTypeConfig::Type* ZoneTypeConfig::from_constant( |
105 i::Handle<i::Object> value, int lub, Zone* zone) { | 178 i::Handle<i::Object> value, int lub, Zone* zone) { |
106 Struct* structured = struct_create(Type::kConstantTag, 2, zone); | 179 Tagged* tagged = tagged_create(kConstantTag, 2, zone); |
107 structured->args[0] = from_bitset(lub); | 180 tagged_set(tagged, 0, lub); |
108 structured->args[1] = value.location(); | 181 tagged_set(tagged, 1, value.location()); |
109 return from_struct(structured); | 182 return from_tagged(tagged); |
110 } | 183 } |
111 | 184 |
112 | 185 |
113 // static | 186 // static |
114 ZoneTypeConfig::Struct* ZoneTypeConfig::struct_create( | 187 ZoneTypeConfig::Type* ZoneTypeConfig::from_union(Unioned* unioned) { |
115 int tag, int length, Zone* zone) { | 188 return from_tagged(tagged_from_union(unioned)); |
116 Struct* structured = reinterpret_cast<Struct*>( | |
117 zone->New(sizeof(Struct) + sizeof(void*) * (length - 1))); // NOLINT | |
118 structured->tag = tag; | |
119 structured->length = length; | |
120 return structured; | |
121 } | 189 } |
122 | 190 |
123 | 191 |
124 // static | 192 // static |
125 void ZoneTypeConfig::struct_shrink(Struct* structured, int length) { | 193 ZoneTypeConfig::Tagged* ZoneTypeConfig::tagged_from_union(Unioned* unioned) { |
126 ASSERT(0 <= length && length <= structured->length); | 194 return reinterpret_cast<Tagged*>(unioned); |
127 structured->length = length; | |
128 } | 195 } |
129 | 196 |
130 | 197 |
131 // static | 198 // static |
132 int ZoneTypeConfig::struct_tag(Struct* structured) { | 199 ZoneTypeConfig::Unioned* ZoneTypeConfig::union_create(int size, Zone* zone) { |
133 return structured->tag; | 200 return tagged_as_union(tagged_create(kUnionTag, size, zone)); |
134 } | 201 } |
135 | 202 |
136 | 203 |
137 // static | 204 // static |
138 Type* ZoneTypeConfig::struct_get(Struct* structured, int i) { | 205 void ZoneTypeConfig::union_shrink(Unioned* unioned, int size) { |
139 ASSERT(0 <= i && i < structured->length); | 206 tagged_shrink(tagged_from_union(unioned), size); |
140 return static_cast<Type*>(structured->args[i]); | |
141 } | 207 } |
142 | 208 |
143 | 209 |
144 // static | 210 // static |
145 void ZoneTypeConfig::struct_set(Struct* structured, int i, Type* type) { | 211 ZoneTypeConfig::Type* ZoneTypeConfig::union_get(Unioned* unioned, int i) { |
146 ASSERT(0 <= i && i < structured->length); | 212 Type* type = tagged_get<Type*>(tagged_from_union(unioned), i); |
147 structured->args[i] = type; | 213 ASSERT(!is_union(type)); |
| 214 return type; |
148 } | 215 } |
149 | 216 |
150 | 217 |
151 // static | 218 // static |
152 int ZoneTypeConfig::struct_length(Struct* structured) { | 219 void ZoneTypeConfig::union_set(Unioned* unioned, int i, Type* type) { |
153 return structured->length; | 220 ASSERT(!is_union(type)); |
| 221 tagged_set(tagged_from_union(unioned), i, type); |
| 222 } |
| 223 |
| 224 |
| 225 // static |
| 226 int ZoneTypeConfig::union_length(Unioned* unioned) { |
| 227 return tagged_length(tagged_from_union(unioned)); |
154 } | 228 } |
155 | 229 |
156 | 230 |
157 // static | 231 // static |
158 int ZoneTypeConfig::lub_bitset(Type* type) { | 232 int ZoneTypeConfig::lub_bitset(Type* type) { |
159 ASSERT(is_class(type) || is_constant(type)); | 233 ASSERT(is_class(type) || is_constant(type)); |
160 return as_bitset(struct_get(as_struct(type), 0)); | 234 return static_cast<int>(tagged_get<intptr_t>(as_tagged(type), 0)); |
161 } | 235 } |
162 | 236 |
163 // -------------------------------------------------------------------------- // | 237 // -------------------------------------------------------------------------- // |
164 | 238 |
165 // static | 239 // static |
166 i::Handle<HeapTypeConfig::Type> HeapTypeConfig::handle(Type* type) { | 240 i::Handle<HeapTypeConfig::Type> HeapTypeConfig::handle(Type* type) { |
167 return i::handle(type, i::HeapObject::cast(type)->GetIsolate()); | 241 return i::handle(type, i::HeapObject::cast(type)->GetIsolate()); |
168 } | 242 } |
169 | 243 |
170 | 244 |
171 // static | 245 // static |
172 bool HeapTypeConfig::is_bitset(Type* type) { | 246 bool HeapTypeConfig::is_bitset(Type* type) { |
173 return type->IsSmi(); | 247 return type->IsSmi(); |
174 } | 248 } |
175 | 249 |
176 | 250 |
177 // static | 251 // static |
178 bool HeapTypeConfig::is_class(Type* type) { | 252 bool HeapTypeConfig::is_class(Type* type) { |
179 return type->IsMap(); | 253 return type->IsMap(); |
180 } | 254 } |
181 | 255 |
182 | 256 |
183 // static | 257 // static |
184 bool HeapTypeConfig::is_constant(Type* type) { | 258 bool HeapTypeConfig::is_constant(Type* type) { |
185 return type->IsBox(); | 259 return type->IsBox(); |
186 } | 260 } |
187 | 261 |
188 | 262 |
189 // static | 263 // static |
190 bool HeapTypeConfig::is_struct(Type* type) { | 264 bool HeapTypeConfig::is_union(Type* type) { |
191 return type->IsFixedArray(); | 265 return type->IsFixedArray(); |
192 } | 266 } |
193 | 267 |
194 | 268 |
195 // static | 269 // static |
196 int HeapTypeConfig::as_bitset(Type* type) { | 270 int HeapTypeConfig::as_bitset(Type* type) { |
197 return Smi::cast(type)->value(); | 271 return Smi::cast(type)->value(); |
198 } | 272 } |
199 | 273 |
200 | 274 |
201 // static | 275 // static |
202 i::Handle<i::Map> HeapTypeConfig::as_class(Type* type) { | 276 i::Handle<i::Map> HeapTypeConfig::as_class(Type* type) { |
203 return i::handle(i::Map::cast(type)); | 277 return i::handle(i::Map::cast(type)); |
204 } | 278 } |
205 | 279 |
206 | 280 |
207 // static | 281 // static |
208 i::Handle<i::Object> HeapTypeConfig::as_constant(Type* type) { | 282 i::Handle<i::Object> HeapTypeConfig::as_constant(Type* type) { |
209 i::Box* box = i::Box::cast(type); | 283 i::Box* box = i::Box::cast(type); |
210 return i::handle(box->value(), box->GetIsolate()); | 284 return i::handle(box->value(), box->GetIsolate()); |
211 } | 285 } |
212 | 286 |
213 | 287 |
214 // static | 288 // static |
215 i::Handle<HeapTypeConfig::Struct> HeapTypeConfig::as_struct(Type* type) { | 289 i::Handle<HeapTypeConfig::Unioned> HeapTypeConfig::as_union(Type* type) { |
216 return i::handle(Struct::cast(type)); | 290 return i::handle(i::FixedArray::cast(type)); |
217 } | 291 } |
218 | 292 |
219 | 293 |
220 // static | 294 // static |
221 HeapTypeConfig::Type* HeapTypeConfig::from_bitset(int bitset) { | 295 HeapTypeConfig::Type* HeapTypeConfig::from_bitset(int bitset) { |
222 return Type::cast(i::Smi::FromInt(bitset)); | 296 return Type::cast(i::Smi::FromInt(bitset)); |
223 } | 297 } |
224 | 298 |
225 | 299 |
226 // static | 300 // static |
(...skipping 12 matching lines...) Expand all Loading... |
239 | 313 |
240 // static | 314 // static |
241 i::Handle<HeapTypeConfig::Type> HeapTypeConfig::from_constant( | 315 i::Handle<HeapTypeConfig::Type> HeapTypeConfig::from_constant( |
242 i::Handle<i::Object> value, int lub, Isolate* isolate) { | 316 i::Handle<i::Object> value, int lub, Isolate* isolate) { |
243 i::Handle<Box> box = isolate->factory()->NewBox(value); | 317 i::Handle<Box> box = isolate->factory()->NewBox(value); |
244 return i::Handle<Type>::cast(i::Handle<Object>::cast(box)); | 318 return i::Handle<Type>::cast(i::Handle<Object>::cast(box)); |
245 } | 319 } |
246 | 320 |
247 | 321 |
248 // static | 322 // static |
249 i::Handle<HeapTypeConfig::Type> HeapTypeConfig::from_struct( | 323 i::Handle<HeapTypeConfig::Type> HeapTypeConfig::from_union( |
250 i::Handle<Struct> structured) { | 324 i::Handle<Unioned> unioned) { |
251 return i::Handle<Type>::cast(i::Handle<Object>::cast(structured)); | 325 return i::Handle<Type>::cast(i::Handle<Object>::cast(unioned)); |
252 } | 326 } |
253 | 327 |
254 | 328 |
255 // static | 329 // static |
256 i::Handle<HeapTypeConfig::Struct> HeapTypeConfig::struct_create( | 330 i::Handle<HeapTypeConfig::Unioned> HeapTypeConfig::union_create( |
257 int tag, int length, Isolate* isolate) { | 331 int size, Isolate* isolate) { |
258 i::Handle<Struct> structured = isolate->factory()->NewFixedArray(length + 1); | 332 return isolate->factory()->NewFixedArray(size); |
259 structured->set(0, i::Smi::FromInt(tag)); | |
260 return structured; | |
261 } | 333 } |
262 | 334 |
263 | 335 |
264 // static | 336 // static |
265 void HeapTypeConfig::struct_shrink(i::Handle<Struct> structured, int length) { | 337 void HeapTypeConfig::union_shrink(i::Handle<Unioned> unioned, int size) { |
266 structured->Shrink(length + 1); | 338 unioned->Shrink(size); |
267 } | 339 } |
268 | 340 |
269 | 341 |
270 // static | 342 // static |
271 int HeapTypeConfig::struct_tag(i::Handle<Struct> structured) { | 343 i::Handle<HeapTypeConfig::Type> HeapTypeConfig::union_get( |
272 return static_cast<i::Smi*>(structured->get(0))->value(); | 344 i::Handle<Unioned> unioned, int i) { |
| 345 Type* type = static_cast<Type*>(unioned->get(i)); |
| 346 ASSERT(!is_union(type)); |
| 347 return i::handle(type, unioned->GetIsolate()); |
273 } | 348 } |
274 | 349 |
275 | 350 |
276 // static | 351 // static |
277 i::Handle<HeapTypeConfig::Type> HeapTypeConfig::struct_get( | 352 void HeapTypeConfig::union_set( |
278 i::Handle<Struct> structured, int i) { | 353 i::Handle<Unioned> unioned, int i, i::Handle<Type> type) { |
279 Type* type = static_cast<Type*>(structured->get(i + 1)); | 354 ASSERT(!is_union(*type)); |
280 return i::handle(type, structured->GetIsolate()); | 355 unioned->set(i, *type); |
281 } | 356 } |
282 | 357 |
283 | 358 |
284 // static | 359 // static |
285 void HeapTypeConfig::struct_set( | 360 int HeapTypeConfig::union_length(i::Handle<Unioned> unioned) { |
286 i::Handle<Struct> structured, int i, i::Handle<Type> type) { | 361 return unioned->length(); |
287 structured->set(i + 1, *type); | |
288 } | 362 } |
289 | 363 |
290 | 364 |
291 // static | |
292 int HeapTypeConfig::struct_length(i::Handle<Struct> structured) { | |
293 return structured->length() - 1; | |
294 } | |
295 | |
296 | |
297 // static | 365 // static |
298 int HeapTypeConfig::lub_bitset(Type* type) { | 366 int HeapTypeConfig::lub_bitset(Type* type) { |
299 return 0; // kNone, which causes recomputation. | 367 return 0; // kNone, which causes recomputation. |
300 } | 368 } |
301 | 369 |
302 } } // namespace v8::internal | 370 } } // namespace v8::internal |
303 | 371 |
304 #endif // V8_TYPES_INL_H_ | 372 #endif // V8_TYPES_INL_H_ |
OLD | NEW |