| 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 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 *map, index, field_representation.IsDouble()); | 270 *map, index, field_representation.IsDouble()); |
| 271 Type* field_type = Type::Tagged(); | 271 Type* field_type = Type::Tagged(); |
| 272 if (field_representation.IsSmi()) { | 272 if (field_representation.IsSmi()) { |
| 273 field_type = type_cache_.kSmi; | 273 field_type = type_cache_.kSmi; |
| 274 } else if (field_representation.IsDouble()) { | 274 } else if (field_representation.IsDouble()) { |
| 275 field_type = type_cache_.kFloat64; | 275 field_type = type_cache_.kFloat64; |
| 276 } else if (field_representation.IsHeapObject()) { | 276 } else if (field_representation.IsHeapObject()) { |
| 277 // Extract the field type from the property details (make sure its | 277 // Extract the field type from the property details (make sure its |
| 278 // representation is TaggedPointer to reflect the heap object case). | 278 // representation is TaggedPointer to reflect the heap object case). |
| 279 field_type = Type::Intersect( | 279 field_type = Type::Intersect( |
| 280 Type::Convert<HeapType>( | 280 descriptors->GetFieldType(number)->Convert(zone()), |
| 281 handle(descriptors->GetFieldType(number), isolate()), zone()), | |
| 282 Type::TaggedPointer(), zone()); | 281 Type::TaggedPointer(), zone()); |
| 283 if (field_type->Is(Type::None())) { | 282 if (field_type->Is(Type::None())) { |
| 284 // Store is not safe if the field type was cleared. | 283 // Store is not safe if the field type was cleared. |
| 285 if (access_mode == AccessMode::kStore) return false; | 284 if (access_mode == AccessMode::kStore) return false; |
| 286 | 285 |
| 287 // The field type was cleared by the GC, so we don't know anything | 286 // The field type was cleared by the GC, so we don't know anything |
| 288 // about the contents now. | 287 // about the contents now. |
| 289 // TODO(bmeurer): It would be awesome to make this saner in the | 288 // TODO(bmeurer): It would be awesome to make this saner in the |
| 290 // runtime/GC interaction. | 289 // runtime/GC interaction. |
| 291 field_type = Type::TaggedPointer(); | 290 field_type = Type::TaggedPointer(); |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 *transition_map, index, field_representation.IsDouble()); | 446 *transition_map, index, field_representation.IsDouble()); |
| 448 Type* field_type = Type::Tagged(); | 447 Type* field_type = Type::Tagged(); |
| 449 if (field_representation.IsSmi()) { | 448 if (field_representation.IsSmi()) { |
| 450 field_type = type_cache_.kSmi; | 449 field_type = type_cache_.kSmi; |
| 451 } else if (field_representation.IsDouble()) { | 450 } else if (field_representation.IsDouble()) { |
| 452 field_type = type_cache_.kFloat64; | 451 field_type = type_cache_.kFloat64; |
| 453 } else if (field_representation.IsHeapObject()) { | 452 } else if (field_representation.IsHeapObject()) { |
| 454 // Extract the field type from the property details (make sure its | 453 // Extract the field type from the property details (make sure its |
| 455 // representation is TaggedPointer to reflect the heap object case). | 454 // representation is TaggedPointer to reflect the heap object case). |
| 456 field_type = Type::Intersect( | 455 field_type = Type::Intersect( |
| 457 Type::Convert<HeapType>( | 456 transition_map->instance_descriptors()->GetFieldType(number)->Convert( |
| 458 handle( | |
| 459 transition_map->instance_descriptors()->GetFieldType(number), | |
| 460 isolate()), | |
| 461 zone()), | 457 zone()), |
| 462 Type::TaggedPointer(), zone()); | 458 Type::TaggedPointer(), zone()); |
| 463 if (field_type->Is(Type::None())) { | 459 if (field_type->Is(Type::None())) { |
| 464 // Store is not safe if the field type was cleared. | 460 // Store is not safe if the field type was cleared. |
| 465 return false; | 461 return false; |
| 466 } else if (!Type::Any()->Is(field_type)) { | 462 } else if (!Type::Any()->Is(field_type)) { |
| 467 // Add proper code dependencies in case of stable field map(s). | 463 // Add proper code dependencies in case of stable field map(s). |
| 468 Handle<Map> field_owner_map(transition_map->FindFieldOwner(number), | 464 Handle<Map> field_owner_map(transition_map->FindFieldOwner(number), |
| 469 isolate()); | 465 isolate()); |
| 470 dependencies()->AssumeFieldType(field_owner_map); | 466 dependencies()->AssumeFieldType(field_owner_map); |
| 471 } | 467 } |
| 472 DCHECK(field_type->Is(Type::TaggedPointer())); | 468 DCHECK(field_type->Is(Type::TaggedPointer())); |
| 473 } | 469 } |
| 474 dependencies()->AssumeMapNotDeprecated(transition_map); | 470 dependencies()->AssumeMapNotDeprecated(transition_map); |
| 475 *access_info = PropertyAccessInfo::DataField( | 471 *access_info = PropertyAccessInfo::DataField( |
| 476 Type::Class(map, zone()), field_index, field_type, FieldCheck::kNone, | 472 Type::Class(map, zone()), field_index, field_type, FieldCheck::kNone, |
| 477 holder, transition_map); | 473 holder, transition_map); |
| 478 return true; | 474 return true; |
| 479 } | 475 } |
| 480 return false; | 476 return false; |
| 481 } | 477 } |
| 482 | 478 |
| 483 | 479 |
| 484 Factory* AccessInfoFactory::factory() const { return isolate()->factory(); } | 480 Factory* AccessInfoFactory::factory() const { return isolate()->factory(); } |
| 485 | 481 |
| 486 } // namespace compiler | 482 } // namespace compiler |
| 487 } // namespace internal | 483 } // namespace internal |
| 488 } // namespace v8 | 484 } // namespace v8 |
| OLD | NEW |