Chromium Code Reviews| 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 "src/lookup.h" | 5 #include "src/lookup.h" |
| 6 | 6 |
| 7 #include "src/bootstrapper.h" | 7 #include "src/bootstrapper.h" |
| 8 #include "src/deoptimizer.h" | 8 #include "src/deoptimizer.h" |
| 9 #include "src/elements.h" | 9 #include "src/elements.h" |
| 10 #include "src/field-type.h" | 10 #include "src/field-type.h" |
| (...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 586 Handle<JSObject> holder = GetHolder<JSObject>(); | 586 Handle<JSObject> holder = GetHolder<JSObject>(); |
| 587 ElementsAccessor* accessor = holder->GetElementsAccessor(); | 587 ElementsAccessor* accessor = holder->GetElementsAccessor(); |
| 588 return accessor->Get(holder, number_); | 588 return accessor->Get(holder, number_); |
| 589 } else if (holder_->IsJSGlobalObject()) { | 589 } else if (holder_->IsJSGlobalObject()) { |
| 590 Handle<JSObject> holder = GetHolder<JSObject>(); | 590 Handle<JSObject> holder = GetHolder<JSObject>(); |
| 591 result = holder->global_dictionary()->ValueAt(number_); | 591 result = holder->global_dictionary()->ValueAt(number_); |
| 592 DCHECK(result->IsPropertyCell()); | 592 DCHECK(result->IsPropertyCell()); |
| 593 result = PropertyCell::cast(result)->value(); | 593 result = PropertyCell::cast(result)->value(); |
| 594 } else if (!holder_->HasFastProperties()) { | 594 } else if (!holder_->HasFastProperties()) { |
| 595 result = holder_->property_dictionary()->ValueAt(number_); | 595 result = holder_->property_dictionary()->ValueAt(number_); |
| 596 } else if (property_details_.type() == v8::internal::DATA) { | 596 } else if (property_details_.location() == kField) { |
|
Jakob Kummerow
2017/01/12 15:40:30
DCHECK_EQ(kData, details.kind());
Igor Sheludko
2017/01/12 15:52:31
Done.
| |
| 597 Handle<JSObject> holder = GetHolder<JSObject>(); | 597 Handle<JSObject> holder = GetHolder<JSObject>(); |
| 598 FieldIndex field_index = FieldIndex::ForDescriptor(holder->map(), number_); | 598 FieldIndex field_index = FieldIndex::ForDescriptor(holder->map(), number_); |
| 599 return JSObject::FastPropertyAt(holder, property_details_.representation(), | 599 return JSObject::FastPropertyAt(holder, property_details_.representation(), |
| 600 field_index); | 600 field_index); |
| 601 } else { | 601 } else { |
| 602 result = holder_->map()->instance_descriptors()->GetValue(number_); | 602 result = holder_->map()->instance_descriptors()->GetValue(number_); |
| 603 } | 603 } |
| 604 return handle(result, isolate_); | 604 return handle(result, isolate_); |
| 605 } | 605 } |
| 606 | 606 |
| 607 int LookupIterator::GetFieldDescriptorIndex() const { | 607 int LookupIterator::GetFieldDescriptorIndex() const { |
| 608 DCHECK(has_property_); | 608 DCHECK(has_property_); |
| 609 DCHECK(holder_->HasFastProperties()); | 609 DCHECK(holder_->HasFastProperties()); |
| 610 DCHECK_EQ(v8::internal::DATA, property_details_.type()); | 610 DCHECK_EQ(kField, property_details_.location()); |
| 611 DCHECK_EQ(kData, property_details_.kind()); | |
| 611 return descriptor_number(); | 612 return descriptor_number(); |
| 612 } | 613 } |
| 613 | 614 |
| 614 int LookupIterator::GetAccessorIndex() const { | 615 int LookupIterator::GetAccessorIndex() const { |
| 615 DCHECK(has_property_); | 616 DCHECK(has_property_); |
| 616 DCHECK(holder_->HasFastProperties()); | 617 DCHECK(holder_->HasFastProperties()); |
| 617 DCHECK_EQ(v8::internal::ACCESSOR_CONSTANT, property_details_.type()); | 618 DCHECK_EQ(kDescriptor, property_details_.location()); |
| 619 DCHECK_EQ(kAccessor, property_details_.kind()); | |
| 618 return descriptor_number(); | 620 return descriptor_number(); |
| 619 } | 621 } |
| 620 | 622 |
| 621 | 623 |
| 622 int LookupIterator::GetConstantIndex() const { | 624 int LookupIterator::GetConstantIndex() const { |
| 623 DCHECK(has_property_); | 625 DCHECK(has_property_); |
| 624 DCHECK(holder_->HasFastProperties()); | 626 DCHECK(holder_->HasFastProperties()); |
| 625 DCHECK_EQ(v8::internal::DATA_CONSTANT, property_details_.type()); | 627 DCHECK_EQ(kDescriptor, property_details_.location()); |
| 628 DCHECK_EQ(kData, property_details_.kind()); | |
| 626 DCHECK(!IsElement()); | 629 DCHECK(!IsElement()); |
| 627 return descriptor_number(); | 630 return descriptor_number(); |
| 628 } | 631 } |
| 629 | 632 |
| 630 | 633 |
| 631 FieldIndex LookupIterator::GetFieldIndex() const { | 634 FieldIndex LookupIterator::GetFieldIndex() const { |
| 632 DCHECK(has_property_); | 635 DCHECK(has_property_); |
| 633 DCHECK(holder_->HasFastProperties()); | 636 DCHECK(holder_->HasFastProperties()); |
| 634 DCHECK_EQ(v8::internal::DATA, property_details_.type()); | 637 DCHECK_EQ(kField, property_details_.location()); |
| 635 DCHECK(!IsElement()); | 638 DCHECK(!IsElement()); |
| 636 Map* holder_map = holder_->map(); | 639 Map* holder_map = holder_->map(); |
| 637 int index = | 640 int index = |
| 638 holder_map->instance_descriptors()->GetFieldIndex(descriptor_number()); | 641 holder_map->instance_descriptors()->GetFieldIndex(descriptor_number()); |
| 639 bool is_double = representation().IsDouble(); | 642 bool is_double = representation().IsDouble(); |
| 640 return FieldIndex::ForPropertyIndex(holder_map, index, is_double); | 643 return FieldIndex::ForPropertyIndex(holder_map, index, is_double); |
| 641 } | 644 } |
| 642 | 645 |
| 643 Handle<FieldType> LookupIterator::GetFieldType() const { | 646 Handle<FieldType> LookupIterator::GetFieldType() const { |
| 644 DCHECK(has_property_); | 647 DCHECK(has_property_); |
| 645 DCHECK(holder_->HasFastProperties()); | 648 DCHECK(holder_->HasFastProperties()); |
| 646 DCHECK_EQ(v8::internal::DATA, property_details_.type()); | 649 DCHECK_EQ(kField, property_details_.location()); |
| 647 return handle( | 650 return handle( |
| 648 holder_->map()->instance_descriptors()->GetFieldType(descriptor_number()), | 651 holder_->map()->instance_descriptors()->GetFieldType(descriptor_number()), |
| 649 isolate_); | 652 isolate_); |
| 650 } | 653 } |
| 651 | 654 |
| 652 | 655 |
| 653 Handle<PropertyCell> LookupIterator::GetPropertyCell() const { | 656 Handle<PropertyCell> LookupIterator::GetPropertyCell() const { |
| 654 DCHECK(!IsElement()); | 657 DCHECK(!IsElement()); |
| 655 Handle<JSGlobalObject> holder = GetHolder<JSGlobalObject>(); | 658 Handle<JSGlobalObject> holder = GetHolder<JSGlobalObject>(); |
| 656 Object* value = holder->global_dictionary()->ValueAt(dictionary_entry()); | 659 Object* value = holder->global_dictionary()->ValueAt(dictionary_entry()); |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 673 | 676 |
| 674 | 677 |
| 675 void LookupIterator::WriteDataValue(Handle<Object> value) { | 678 void LookupIterator::WriteDataValue(Handle<Object> value) { |
| 676 DCHECK_EQ(DATA, state_); | 679 DCHECK_EQ(DATA, state_); |
| 677 Handle<JSReceiver> holder = GetHolder<JSReceiver>(); | 680 Handle<JSReceiver> holder = GetHolder<JSReceiver>(); |
| 678 if (IsElement()) { | 681 if (IsElement()) { |
| 679 Handle<JSObject> object = Handle<JSObject>::cast(holder); | 682 Handle<JSObject> object = Handle<JSObject>::cast(holder); |
| 680 ElementsAccessor* accessor = object->GetElementsAccessor(); | 683 ElementsAccessor* accessor = object->GetElementsAccessor(); |
| 681 accessor->Set(object, number_, *value); | 684 accessor->Set(object, number_, *value); |
| 682 } else if (holder->HasFastProperties()) { | 685 } else if (holder->HasFastProperties()) { |
| 683 if (property_details_.type() == v8::internal::DATA) { | 686 if (property_details_.location() == kField) { |
| 684 JSObject::cast(*holder)->WriteToField(descriptor_number(), | 687 JSObject::cast(*holder)->WriteToField(descriptor_number(), |
| 685 property_details_, *value); | 688 property_details_, *value); |
| 686 } else { | 689 } else { |
| 687 DCHECK_EQ(v8::internal::DATA_CONSTANT, property_details_.type()); | 690 DCHECK_EQ(kDescriptor, property_details_.location()); |
| 688 } | 691 } |
| 689 } else if (holder->IsJSGlobalObject()) { | 692 } else if (holder->IsJSGlobalObject()) { |
| 690 GlobalDictionary* dictionary = JSObject::cast(*holder)->global_dictionary(); | 693 GlobalDictionary* dictionary = JSObject::cast(*holder)->global_dictionary(); |
| 691 Object* cell = dictionary->ValueAt(dictionary_entry()); | 694 Object* cell = dictionary->ValueAt(dictionary_entry()); |
| 692 DCHECK(cell->IsPropertyCell()); | 695 DCHECK(cell->IsPropertyCell()); |
| 693 PropertyCell::cast(cell)->set_value(*value); | 696 PropertyCell::cast(cell)->set_value(*value); |
| 694 } else { | 697 } else { |
| 695 NameDictionary* dictionary = holder->property_dictionary(); | 698 NameDictionary* dictionary = holder->property_dictionary(); |
| 696 dictionary->ValueAtPut(dictionary_entry(), *value); | 699 dictionary->ValueAtPut(dictionary_entry(), *value); |
| 697 } | 700 } |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 870 | 873 |
| 871 // We have found a cached property! Modify the iterator accordingly. | 874 // We have found a cached property! Modify the iterator accordingly. |
| 872 name_ = maybe_name.ToHandleChecked(); | 875 name_ = maybe_name.ToHandleChecked(); |
| 873 Restart(); | 876 Restart(); |
| 874 CHECK_EQ(state(), LookupIterator::DATA); | 877 CHECK_EQ(state(), LookupIterator::DATA); |
| 875 return true; | 878 return true; |
| 876 } | 879 } |
| 877 | 880 |
| 878 } // namespace internal | 881 } // namespace internal |
| 879 } // namespace v8 | 882 } // namespace v8 |
| OLD | NEW |