| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 <ostream> | 5 #include <ostream> |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/compilation-dependencies.h" | 8 #include "src/compilation-dependencies.h" |
| 9 #include "src/compiler/access-info.h" | 9 #include "src/compiler/access-info.h" |
| 10 #include "src/field-index-inl.h" | 10 #include "src/field-index-inl.h" |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 PropertyAccessInfo PropertyAccessInfo::DataConstant( | 68 PropertyAccessInfo PropertyAccessInfo::DataConstant( |
| 69 Type* receiver_type, Handle<Object> constant, | 69 Type* receiver_type, Handle<Object> constant, |
| 70 MaybeHandle<JSObject> holder) { | 70 MaybeHandle<JSObject> holder) { |
| 71 return PropertyAccessInfo(holder, constant, receiver_type); | 71 return PropertyAccessInfo(holder, constant, receiver_type); |
| 72 } | 72 } |
| 73 | 73 |
| 74 | 74 |
| 75 // static | 75 // static |
| 76 PropertyAccessInfo PropertyAccessInfo::DataField( | 76 PropertyAccessInfo PropertyAccessInfo::DataField( |
| 77 Type* receiver_type, FieldIndex field_index, Type* field_type, | 77 Type* receiver_type, FieldIndex field_index, Type* field_type, |
| 78 MaybeHandle<JSObject> holder, MaybeHandle<Map> transition_map) { | 78 FieldCheck field_check, MaybeHandle<JSObject> holder, |
| 79 return PropertyAccessInfo(holder, transition_map, field_index, field_type, | 79 MaybeHandle<Map> transition_map) { |
| 80 receiver_type); | 80 return PropertyAccessInfo(holder, transition_map, field_index, field_check, |
| 81 field_type, receiver_type); |
| 81 } | 82 } |
| 82 | 83 |
| 83 | 84 |
| 84 ElementAccessInfo::ElementAccessInfo() : receiver_type_(Type::None()) {} | 85 ElementAccessInfo::ElementAccessInfo() : receiver_type_(Type::None()) {} |
| 85 | 86 |
| 86 | 87 |
| 87 ElementAccessInfo::ElementAccessInfo(Type* receiver_type, | 88 ElementAccessInfo::ElementAccessInfo(Type* receiver_type, |
| 88 ElementsKind elements_kind, | 89 ElementsKind elements_kind, |
| 89 MaybeHandle<JSObject> holder) | 90 MaybeHandle<JSObject> holder) |
| 90 : elements_kind_(elements_kind), | 91 : elements_kind_(elements_kind), |
| (...skipping 18 matching lines...) Expand all Loading... |
| 109 Type* receiver_type) | 110 Type* receiver_type) |
| 110 : kind_(kDataConstant), | 111 : kind_(kDataConstant), |
| 111 receiver_type_(receiver_type), | 112 receiver_type_(receiver_type), |
| 112 constant_(constant), | 113 constant_(constant), |
| 113 holder_(holder), | 114 holder_(holder), |
| 114 field_type_(Type::Any()) {} | 115 field_type_(Type::Any()) {} |
| 115 | 116 |
| 116 | 117 |
| 117 PropertyAccessInfo::PropertyAccessInfo(MaybeHandle<JSObject> holder, | 118 PropertyAccessInfo::PropertyAccessInfo(MaybeHandle<JSObject> holder, |
| 118 MaybeHandle<Map> transition_map, | 119 MaybeHandle<Map> transition_map, |
| 119 FieldIndex field_index, Type* field_type, | 120 FieldIndex field_index, |
| 121 FieldCheck field_check, Type* field_type, |
| 120 Type* receiver_type) | 122 Type* receiver_type) |
| 121 : kind_(kDataField), | 123 : kind_(kDataField), |
| 122 receiver_type_(receiver_type), | 124 receiver_type_(receiver_type), |
| 123 transition_map_(transition_map), | 125 transition_map_(transition_map), |
| 124 holder_(holder), | 126 holder_(holder), |
| 125 field_index_(field_index), | 127 field_index_(field_index), |
| 128 field_check_(field_check), |
| 126 field_type_(field_type) {} | 129 field_type_(field_type) {} |
| 127 | 130 |
| 128 | 131 |
| 129 AccessInfoFactory::AccessInfoFactory(CompilationDependencies* dependencies, | 132 AccessInfoFactory::AccessInfoFactory(CompilationDependencies* dependencies, |
| 130 Handle<Context> native_context, Zone* zone) | 133 Handle<Context> native_context, Zone* zone) |
| 131 : dependencies_(dependencies), | 134 : dependencies_(dependencies), |
| 132 native_context_(native_context), | 135 native_context_(native_context), |
| 133 isolate_(native_context->GetIsolate()), | 136 isolate_(native_context->GetIsolate()), |
| 134 type_cache_(TypeCache::Get()), | 137 type_cache_(TypeCache::Get()), |
| 135 zone_(zone) {} | 138 zone_(zone) {} |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 // runtime/GC interaction. | 282 // runtime/GC interaction. |
| 280 field_type = Type::TaggedPointer(); | 283 field_type = Type::TaggedPointer(); |
| 281 } else if (!Type::Any()->Is(field_type)) { | 284 } else if (!Type::Any()->Is(field_type)) { |
| 282 // Add proper code dependencies in case of stable field map(s). | 285 // Add proper code dependencies in case of stable field map(s). |
| 283 Handle<Map> field_owner_map(map->FindFieldOwner(number), isolate()); | 286 Handle<Map> field_owner_map(map->FindFieldOwner(number), isolate()); |
| 284 dependencies()->AssumeFieldType(field_owner_map); | 287 dependencies()->AssumeFieldType(field_owner_map); |
| 285 } | 288 } |
| 286 DCHECK(field_type->Is(Type::TaggedPointer())); | 289 DCHECK(field_type->Is(Type::TaggedPointer())); |
| 287 } | 290 } |
| 288 *access_info = PropertyAccessInfo::DataField( | 291 *access_info = PropertyAccessInfo::DataField( |
| 289 Type::Class(receiver_map, zone()), field_index, field_type, holder); | 292 Type::Class(receiver_map, zone()), field_index, field_type, |
| 293 FieldCheck::kNone, holder); |
| 290 return true; | 294 return true; |
| 291 } else { | 295 } else { |
| 292 // TODO(bmeurer): Add support for accessors. | 296 // TODO(bmeurer): Add support for accessors. |
| 293 return false; | 297 return false; |
| 294 } | 298 } |
| 295 } | 299 } |
| 296 | 300 |
| 297 // Don't search on the prototype chain for special indices in case of | 301 // Don't search on the prototype chain for special indices in case of |
| 298 // integer indexed exotic objects (see ES6 section 9.4.5). | 302 // integer indexed exotic objects (see ES6 section 9.4.5). |
| 299 if (map->IsJSTypedArrayMap() && name->IsString() && | 303 if (map->IsJSTypedArrayMap() && name->IsString() && |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 } else if (IsFastElementsKind(map->elements_kind())) { | 387 } else if (IsFastElementsKind(map->elements_kind())) { |
| 384 field_type = type_cache_.kFixedArrayLengthType; | 388 field_type = type_cache_.kFixedArrayLengthType; |
| 385 } else { | 389 } else { |
| 386 field_type = type_cache_.kJSArrayLengthType; | 390 field_type = type_cache_.kJSArrayLengthType; |
| 387 } | 391 } |
| 388 } | 392 } |
| 389 *access_info = PropertyAccessInfo::DataField(Type::Class(map, zone()), | 393 *access_info = PropertyAccessInfo::DataField(Type::Class(map, zone()), |
| 390 field_index, field_type); | 394 field_index, field_type); |
| 391 return true; | 395 return true; |
| 392 } | 396 } |
| 397 // Check for special JSArrayBufferView field accessors. |
| 398 if (Accessors::IsJSArrayBufferViewFieldAccessor(map, name, &offset)) { |
| 399 FieldIndex field_index = FieldIndex::ForInObjectOffset(offset); |
| 400 Type* field_type = Type::Tagged(); |
| 401 if (Name::Equals(factory()->byte_length_string(), name) || |
| 402 Name::Equals(factory()->byte_offset_string(), name)) { |
| 403 // The JSArrayBufferView::byte_length and JSArrayBufferView::byte_offset |
| 404 // properties are always numbers in the range [0, kMaxSafeInteger]. |
| 405 field_type = type_cache_.kPositiveSafeInteger; |
| 406 } else if (map->IsJSTypedArrayMap()) { |
| 407 DCHECK(Name::Equals(factory()->length_string(), name)); |
| 408 // The JSTypedArray::length property is always a number in the range |
| 409 // [0, kMaxSafeInteger]. |
| 410 field_type = type_cache_.kPositiveSafeInteger; |
| 411 } |
| 412 *access_info = PropertyAccessInfo::DataField( |
| 413 Type::Class(map, zone()), field_index, field_type, |
| 414 FieldCheck::kJSArrayBufferViewBufferNotNeutered); |
| 415 return true; |
| 416 } |
| 393 return false; | 417 return false; |
| 394 } | 418 } |
| 395 | 419 |
| 396 | 420 |
| 397 bool AccessInfoFactory::LookupTransition(Handle<Map> map, Handle<Name> name, | 421 bool AccessInfoFactory::LookupTransition(Handle<Map> map, Handle<Name> name, |
| 398 MaybeHandle<JSObject> holder, | 422 MaybeHandle<JSObject> holder, |
| 399 PropertyAccessInfo* access_info) { | 423 PropertyAccessInfo* access_info) { |
| 400 // Check if the {map} has a data transition with the given {name}. | 424 // Check if the {map} has a data transition with the given {name}. |
| 401 if (map->unused_property_fields() == 0) return false; | 425 if (map->unused_property_fields() == 0) return false; |
| 402 Handle<Map> transition_map; | 426 Handle<Map> transition_map; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 433 return false; | 457 return false; |
| 434 } else if (!Type::Any()->Is(field_type)) { | 458 } else if (!Type::Any()->Is(field_type)) { |
| 435 // Add proper code dependencies in case of stable field map(s). | 459 // Add proper code dependencies in case of stable field map(s). |
| 436 Handle<Map> field_owner_map(transition_map->FindFieldOwner(number), | 460 Handle<Map> field_owner_map(transition_map->FindFieldOwner(number), |
| 437 isolate()); | 461 isolate()); |
| 438 dependencies()->AssumeFieldType(field_owner_map); | 462 dependencies()->AssumeFieldType(field_owner_map); |
| 439 } | 463 } |
| 440 DCHECK(field_type->Is(Type::TaggedPointer())); | 464 DCHECK(field_type->Is(Type::TaggedPointer())); |
| 441 } | 465 } |
| 442 dependencies()->AssumeMapNotDeprecated(transition_map); | 466 dependencies()->AssumeMapNotDeprecated(transition_map); |
| 443 *access_info = | 467 *access_info = PropertyAccessInfo::DataField( |
| 444 PropertyAccessInfo::DataField(Type::Class(map, zone()), field_index, | 468 Type::Class(map, zone()), field_index, field_type, FieldCheck::kNone, |
| 445 field_type, holder, transition_map); | 469 holder, transition_map); |
| 446 return true; | 470 return true; |
| 447 } | 471 } |
| 448 return false; | 472 return false; |
| 449 } | 473 } |
| 450 | 474 |
| 451 | 475 |
| 452 Factory* AccessInfoFactory::factory() const { return isolate()->factory(); } | 476 Factory* AccessInfoFactory::factory() const { return isolate()->factory(); } |
| 453 | 477 |
| 454 } // namespace compiler | 478 } // namespace compiler |
| 455 } // namespace internal | 479 } // namespace internal |
| 456 } // namespace v8 | 480 } // namespace v8 |
| OLD | NEW |