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 #include <iomanip> | 5 #include <iomanip> |
6 | 6 |
7 #include "src/types.h" | 7 #include "src/types.h" |
8 | 8 |
9 #include "src/ostreams.h" | 9 #include "src/ostreams.h" |
10 #include "src/types-inl.h" | 10 #include "src/types-inl.h" |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 } | 146 } |
147 return bitset; | 147 return bitset; |
148 } | 148 } |
149 if (type->IsClass()) { | 149 if (type->IsClass()) { |
150 // Little hack to avoid the need for a region for handlification here... | 150 // Little hack to avoid the need for a region for handlification here... |
151 return Config::is_class(type) ? Lub(*Config::as_class(type)) : | 151 return Config::is_class(type) ? Lub(*Config::as_class(type)) : |
152 type->AsClass()->Bound(NULL)->AsBitset(); | 152 type->AsClass()->Bound(NULL)->AsBitset(); |
153 } | 153 } |
154 if (type->IsConstant()) return type->AsConstant()->Bound()->AsBitset(); | 154 if (type->IsConstant()) return type->AsConstant()->Bound()->AsBitset(); |
155 if (type->IsRange()) return type->AsRange()->BitsetLub(); | 155 if (type->IsRange()) return type->AsRange()->BitsetLub(); |
156 if (type->IsContext()) return kInternal & kTaggedPtr; | 156 if (type->IsContext()) return kInternal & kTaggedPointer; |
157 if (type->IsArray()) return kArray; | 157 if (type->IsArray()) return kArray; |
158 if (type->IsFunction()) return kFunction; | 158 if (type->IsFunction()) return kOtherObject; // TODO(rossberg): kFunction |
159 UNREACHABLE(); | 159 UNREACHABLE(); |
160 return kNone; | 160 return kNone; |
161 } | 161 } |
162 | 162 |
163 | 163 |
164 template<class Config> | 164 template<class Config> |
165 typename TypeImpl<Config>::bitset | 165 typename TypeImpl<Config>::bitset |
166 TypeImpl<Config>::BitsetType::Lub(i::Map* map) { | 166 TypeImpl<Config>::BitsetType::Lub(i::Map* map) { |
167 DisallowHeapAllocation no_allocation; | 167 DisallowHeapAllocation no_allocation; |
168 switch (map->instance_type()) { | 168 switch (map->instance_type()) { |
(...skipping 24 matching lines...) Expand all Loading... |
193 case ODDBALL_TYPE: { | 193 case ODDBALL_TYPE: { |
194 Heap* heap = map->GetHeap(); | 194 Heap* heap = map->GetHeap(); |
195 if (map == heap->undefined_map()) return kUndefined; | 195 if (map == heap->undefined_map()) return kUndefined; |
196 if (map == heap->null_map()) return kNull; | 196 if (map == heap->null_map()) return kNull; |
197 if (map == heap->boolean_map()) return kBoolean; | 197 if (map == heap->boolean_map()) return kBoolean; |
198 DCHECK(map == heap->the_hole_map() || | 198 DCHECK(map == heap->the_hole_map() || |
199 map == heap->uninitialized_map() || | 199 map == heap->uninitialized_map() || |
200 map == heap->no_interceptor_result_sentinel_map() || | 200 map == heap->no_interceptor_result_sentinel_map() || |
201 map == heap->termination_exception_map() || | 201 map == heap->termination_exception_map() || |
202 map == heap->arguments_marker_map()); | 202 map == heap->arguments_marker_map()); |
203 return kInternal & kTaggedPtr; | 203 return kInternal & kTaggedPointer; |
204 } | 204 } |
205 case HEAP_NUMBER_TYPE: | 205 case HEAP_NUMBER_TYPE: |
206 return kNumber & kTaggedPtr; | 206 return kNumber & kTaggedPointer; |
207 case JS_VALUE_TYPE: | 207 case JS_VALUE_TYPE: |
208 case JS_DATE_TYPE: | 208 case JS_DATE_TYPE: |
209 case JS_OBJECT_TYPE: | 209 case JS_OBJECT_TYPE: |
210 case JS_CONTEXT_EXTENSION_OBJECT_TYPE: | 210 case JS_CONTEXT_EXTENSION_OBJECT_TYPE: |
211 case JS_GENERATOR_OBJECT_TYPE: | 211 case JS_GENERATOR_OBJECT_TYPE: |
212 case JS_MODULE_TYPE: | 212 case JS_MODULE_TYPE: |
213 case JS_GLOBAL_OBJECT_TYPE: | 213 case JS_GLOBAL_OBJECT_TYPE: |
214 case JS_BUILTINS_OBJECT_TYPE: | 214 case JS_BUILTINS_OBJECT_TYPE: |
215 case JS_GLOBAL_PROXY_TYPE: | 215 case JS_GLOBAL_PROXY_TYPE: |
216 case JS_ARRAY_BUFFER_TYPE: | 216 case JS_ARRAY_BUFFER_TYPE: |
217 case JS_TYPED_ARRAY_TYPE: | 217 case JS_TYPED_ARRAY_TYPE: |
218 case JS_DATA_VIEW_TYPE: | 218 case JS_DATA_VIEW_TYPE: |
219 case JS_SET_TYPE: | 219 case JS_SET_TYPE: |
220 case JS_MAP_TYPE: | 220 case JS_MAP_TYPE: |
221 case JS_SET_ITERATOR_TYPE: | 221 case JS_SET_ITERATOR_TYPE: |
222 case JS_MAP_ITERATOR_TYPE: | 222 case JS_MAP_ITERATOR_TYPE: |
223 case JS_WEAK_MAP_TYPE: | 223 case JS_WEAK_MAP_TYPE: |
224 case JS_WEAK_SET_TYPE: | 224 case JS_WEAK_SET_TYPE: |
225 if (map->is_undetectable()) return kUndetectable; | 225 if (map->is_undetectable()) return kUndetectable; |
226 return kOtherObject; | 226 return kOtherObject; |
227 case JS_ARRAY_TYPE: | 227 case JS_ARRAY_TYPE: |
228 return kArray; | 228 return kArray; |
229 case JS_FUNCTION_TYPE: | 229 case JS_FUNCTION_TYPE: |
230 return kFunction; | 230 return kOtherObject; // TODO(rossberg): there should be a Function type. |
231 case JS_REGEXP_TYPE: | 231 case JS_REGEXP_TYPE: |
232 return kRegExp; | 232 return kOtherObject; // TODO(rossberg): there should be a RegExp type. |
233 case JS_PROXY_TYPE: | 233 case JS_PROXY_TYPE: |
234 case JS_FUNCTION_PROXY_TYPE: | 234 case JS_FUNCTION_PROXY_TYPE: |
235 return kProxy; | 235 return kProxy; |
236 case MAP_TYPE: | 236 case MAP_TYPE: |
237 // When compiling stub templates, the meta map is used as a place holder | 237 // When compiling stub templates, the meta map is used as a place holder |
238 // for the actual map with which the template is later instantiated. | 238 // for the actual map with which the template is later instantiated. |
239 // We treat it as a kind of type variable whose upper bound is Any. | 239 // We treat it as a kind of type variable whose upper bound is Any. |
240 // TODO(rossberg): for caching of CompareNilIC stubs to work correctly, | 240 // TODO(rossberg): for caching of CompareNilIC stubs to work correctly, |
241 // we must exclude Undetectable here. This makes no sense, really, | 241 // we must exclude Undetectable here. This makes no sense, really, |
242 // because it means that the template isn't actually parametric. | 242 // because it means that the template isn't actually parametric. |
243 // Also, it doesn't apply elsewhere. 8-( | 243 // Also, it doesn't apply elsewhere. 8-( |
244 // We ought to find a cleaner solution for compiling stubs parameterised | 244 // We ought to find a cleaner solution for compiling stubs parameterised |
245 // over type or class variables, esp ones with bounds... | 245 // over type or class variables, esp ones with bounds... |
246 return kDetectable; | 246 return kDetectable; |
247 case DECLARED_ACCESSOR_INFO_TYPE: | 247 case DECLARED_ACCESSOR_INFO_TYPE: |
248 case EXECUTABLE_ACCESSOR_INFO_TYPE: | 248 case EXECUTABLE_ACCESSOR_INFO_TYPE: |
249 case SHARED_FUNCTION_INFO_TYPE: | 249 case SHARED_FUNCTION_INFO_TYPE: |
250 case ACCESSOR_PAIR_TYPE: | 250 case ACCESSOR_PAIR_TYPE: |
251 case FIXED_ARRAY_TYPE: | 251 case FIXED_ARRAY_TYPE: |
252 case BYTE_ARRAY_TYPE: | 252 case BYTE_ARRAY_TYPE: |
253 case FOREIGN_TYPE: | 253 case FOREIGN_TYPE: |
254 case CODE_TYPE: | 254 case CODE_TYPE: |
255 return kInternal & kTaggedPtr; | 255 return kInternal & kTaggedPointer; |
256 default: | 256 default: |
257 UNREACHABLE(); | 257 UNREACHABLE(); |
258 return kNone; | 258 return kNone; |
259 } | 259 } |
260 } | 260 } |
261 | 261 |
262 | 262 |
263 template<class Config> | 263 template<class Config> |
264 typename TypeImpl<Config>::bitset | 264 typename TypeImpl<Config>::bitset |
265 TypeImpl<Config>::BitsetType::Lub(i::Object* value) { | 265 TypeImpl<Config>::BitsetType::Lub(i::Object* value) { |
266 DisallowHeapAllocation no_allocation; | 266 DisallowHeapAllocation no_allocation; |
267 if (value->IsNumber()) { | 267 if (value->IsNumber()) { |
268 return Lub(value->Number()) & (value->IsSmi() ? kTaggedInt : kTaggedPtr); | 268 return Lub(value->Number()) & |
| 269 (value->IsSmi() ? kTaggedSigned : kTaggedPointer); |
269 } | 270 } |
270 return Lub(i::HeapObject::cast(value)->map()); | 271 return Lub(i::HeapObject::cast(value)->map()); |
271 } | 272 } |
272 | 273 |
273 | 274 |
274 template<class Config> | 275 template<class Config> |
275 typename TypeImpl<Config>::bitset | 276 typename TypeImpl<Config>::bitset |
276 TypeImpl<Config>::BitsetType::Lub(double value) { | 277 TypeImpl<Config>::BitsetType::Lub(double value) { |
277 DisallowHeapAllocation no_allocation; | 278 DisallowHeapAllocation no_allocation; |
278 if (i::IsMinusZero(value)) return kMinusZero; | 279 if (i::IsMinusZero(value)) return kMinusZero; |
(...skipping 813 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1092 template class TypeImpl<HeapTypeConfig>::Iterator<i::Object>; | 1093 template class TypeImpl<HeapTypeConfig>::Iterator<i::Object>; |
1093 | 1094 |
1094 template TypeImpl<ZoneTypeConfig>::TypeHandle | 1095 template TypeImpl<ZoneTypeConfig>::TypeHandle |
1095 TypeImpl<ZoneTypeConfig>::Convert<HeapType>( | 1096 TypeImpl<ZoneTypeConfig>::Convert<HeapType>( |
1096 TypeImpl<HeapTypeConfig>::TypeHandle, TypeImpl<ZoneTypeConfig>::Region*); | 1097 TypeImpl<HeapTypeConfig>::TypeHandle, TypeImpl<ZoneTypeConfig>::Region*); |
1097 template TypeImpl<HeapTypeConfig>::TypeHandle | 1098 template TypeImpl<HeapTypeConfig>::TypeHandle |
1098 TypeImpl<HeapTypeConfig>::Convert<Type>( | 1099 TypeImpl<HeapTypeConfig>::Convert<Type>( |
1099 TypeImpl<ZoneTypeConfig>::TypeHandle, TypeImpl<HeapTypeConfig>::Region*); | 1100 TypeImpl<ZoneTypeConfig>::TypeHandle, TypeImpl<HeapTypeConfig>::Region*); |
1100 | 1101 |
1101 } } // namespace v8::internal | 1102 } } // namespace v8::internal |
OLD | NEW |