OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/ic/keyed-store-generic.h" | 5 #include "src/ic/keyed-store-generic.h" |
6 | 6 |
7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/code-stub-assembler.h" | 8 #include "src/code-stub-assembler.h" |
9 #include "src/contexts.h" | 9 #include "src/contexts.h" |
10 #include "src/ic/accessor-assembler.h" | 10 #include "src/ic/accessor-assembler.h" |
(...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 Label found(this), found_fast(this), found_dict(this), found_global(this); | 532 Label found(this), found_fast(this), found_dict(this), found_global(this); |
533 Variable var_meta_storage(this, MachineRepresentation::kTagged); | 533 Variable var_meta_storage(this, MachineRepresentation::kTagged); |
534 Variable var_entry(this, MachineType::PointerRepresentation()); | 534 Variable var_entry(this, MachineType::PointerRepresentation()); |
535 TryLookupProperty(holder, holder_map, instance_type, name, &found_fast, | 535 TryLookupProperty(holder, holder_map, instance_type, name, &found_fast, |
536 &found_dict, &found_global, &var_meta_storage, | 536 &found_dict, &found_global, &var_meta_storage, |
537 &var_entry, &next_proto, bailout); | 537 &var_entry, &next_proto, bailout); |
538 Bind(&found_fast); | 538 Bind(&found_fast); |
539 { | 539 { |
540 Node* descriptors = var_meta_storage.value(); | 540 Node* descriptors = var_meta_storage.value(); |
541 Node* name_index = var_entry.value(); | 541 Node* name_index = var_entry.value(); |
542 // TODO(jkummerow): Add helper functions for accessing value and | 542 Node* details = |
543 // details by entry. | 543 LoadDetailsByKeyIndex<DescriptorArray>(descriptors, name_index); |
544 const int kNameToDetailsOffset = (DescriptorArray::kDescriptorDetails - | |
545 DescriptorArray::kDescriptorKey) * | |
546 kPointerSize; | |
547 Node* details = LoadAndUntagToWord32FixedArrayElement( | |
548 descriptors, name_index, kNameToDetailsOffset); | |
549 JumpIfDataProperty(details, &ok_to_write, readonly); | 544 JumpIfDataProperty(details, &ok_to_write, readonly); |
550 | 545 |
551 // Accessor case. | 546 // Accessor case. |
552 Variable var_details(this, MachineRepresentation::kWord32); | 547 Variable var_details(this, MachineRepresentation::kWord32); |
553 LoadPropertyFromFastObject(holder, holder_map, descriptors, name_index, | 548 LoadPropertyFromFastObject(holder, holder_map, descriptors, name_index, |
554 &var_details, var_accessor_pair); | 549 &var_details, var_accessor_pair); |
555 var_accessor_holder->Bind(holder); | 550 var_accessor_holder->Bind(holder); |
556 Goto(accessor); | 551 Goto(accessor); |
557 } | 552 } |
558 | 553 |
559 Bind(&found_dict); | 554 Bind(&found_dict); |
560 { | 555 { |
561 Node* dictionary = var_meta_storage.value(); | 556 Node* dictionary = var_meta_storage.value(); |
562 Node* entry = var_entry.value(); | 557 Node* entry = var_entry.value(); |
563 const int kNameToDetailsOffset = (NameDictionary::kEntryDetailsIndex - | 558 Node* details = |
564 NameDictionary::kEntryKeyIndex) * | 559 LoadDetailsByKeyIndex<NameDictionary>(dictionary, entry); |
565 kPointerSize; | |
566 Node* details = LoadAndUntagToWord32FixedArrayElement( | |
567 dictionary, entry, kNameToDetailsOffset); | |
568 JumpIfDataProperty(details, &ok_to_write, readonly); | 560 JumpIfDataProperty(details, &ok_to_write, readonly); |
569 | 561 |
570 // Accessor case. | 562 // Accessor case. |
571 const int kNameToValueOffset = (NameDictionary::kEntryValueIndex - | |
572 NameDictionary::kEntryKeyIndex) * | |
573 kPointerSize; | |
574 var_accessor_pair->Bind( | 563 var_accessor_pair->Bind( |
575 LoadFixedArrayElement(dictionary, entry, kNameToValueOffset)); | 564 LoadValueByKeyIndex<NameDictionary>(dictionary, entry)); |
576 var_accessor_holder->Bind(holder); | 565 var_accessor_holder->Bind(holder); |
577 Goto(accessor); | 566 Goto(accessor); |
578 } | 567 } |
579 | 568 |
580 Bind(&found_global); | 569 Bind(&found_global); |
581 { | 570 { |
582 Node* dictionary = var_meta_storage.value(); | 571 Node* dictionary = var_meta_storage.value(); |
583 Node* entry = var_entry.value(); | 572 Node* entry = var_entry.value(); |
584 const int kNameToValueOffset = (GlobalDictionary::kEntryValueIndex - | |
585 GlobalDictionary::kEntryKeyIndex) * | |
586 kPointerSize; | |
587 | |
588 Node* property_cell = | 573 Node* property_cell = |
589 LoadFixedArrayElement(dictionary, entry, kNameToValueOffset); | 574 LoadValueByKeyIndex<GlobalDictionary>(dictionary, entry); |
590 | |
591 Node* value = | 575 Node* value = |
592 LoadObjectField(property_cell, PropertyCell::kValueOffset); | 576 LoadObjectField(property_cell, PropertyCell::kValueOffset); |
593 GotoIf(WordEqual(value, TheHoleConstant()), &next_proto); | 577 GotoIf(WordEqual(value, TheHoleConstant()), &next_proto); |
594 Node* details = LoadAndUntagToWord32ObjectField( | 578 Node* details = LoadAndUntagToWord32ObjectField( |
595 property_cell, PropertyCell::kDetailsOffset); | 579 property_cell, PropertyCell::kDetailsOffset); |
596 JumpIfDataProperty(details, &ok_to_write, readonly); | 580 JumpIfDataProperty(details, &ok_to_write, readonly); |
597 | 581 |
598 // Accessor case. | 582 // Accessor case. |
599 var_accessor_pair->Bind(value); | 583 var_accessor_pair->Bind(value); |
600 var_accessor_holder->Bind(holder); | 584 var_accessor_holder->Bind(holder); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
641 // We checked for LAST_CUSTOM_ELEMENTS_RECEIVER before, which rules out | 625 // We checked for LAST_CUSTOM_ELEMENTS_RECEIVER before, which rules out |
642 // seeing global objects here (which would need special handling). | 626 // seeing global objects here (which would need special handling). |
643 | 627 |
644 Variable var_name_index(this, MachineType::PointerRepresentation()); | 628 Variable var_name_index(this, MachineType::PointerRepresentation()); |
645 Label dictionary_found(this, &var_name_index), not_found(this); | 629 Label dictionary_found(this, &var_name_index), not_found(this); |
646 NameDictionaryLookup<NameDictionary>(properties, p->name, &dictionary_found, | 630 NameDictionaryLookup<NameDictionary>(properties, p->name, &dictionary_found, |
647 &var_name_index, ¬_found); | 631 &var_name_index, ¬_found); |
648 Bind(&dictionary_found); | 632 Bind(&dictionary_found); |
649 { | 633 { |
650 Label overwrite(this); | 634 Label overwrite(this); |
651 const int kNameToDetailsOffset = (NameDictionary::kEntryDetailsIndex - | 635 Node* details = LoadDetailsByKeyIndex<NameDictionary>( |
652 NameDictionary::kEntryKeyIndex) * | 636 properties, var_name_index.value()); |
653 kPointerSize; | |
654 Node* details = LoadAndUntagToWord32FixedArrayElement( | |
655 properties, var_name_index.value(), kNameToDetailsOffset); | |
656 JumpIfDataProperty(details, &overwrite, &readonly); | 637 JumpIfDataProperty(details, &overwrite, &readonly); |
657 | 638 |
658 // Accessor case. | 639 // Accessor case. |
659 const int kNameToValueOffset = | 640 var_accessor_pair.Bind(LoadValueByKeyIndex<NameDictionary>( |
660 (NameDictionary::kEntryValueIndex - NameDictionary::kEntryKeyIndex) * | 641 properties, var_name_index.value())); |
661 kPointerSize; | |
662 var_accessor_pair.Bind(LoadFixedArrayElement( | |
663 properties, var_name_index.value(), kNameToValueOffset)); | |
664 var_accessor_holder.Bind(receiver); | 642 var_accessor_holder.Bind(receiver); |
665 Goto(&accessor); | 643 Goto(&accessor); |
666 | 644 |
667 Bind(&overwrite); | 645 Bind(&overwrite); |
668 { | 646 { |
669 StoreFixedArrayElement(properties, var_name_index.value(), p->value, | 647 StoreValueByKeyIndex<NameDictionary>(properties, var_name_index.value(), |
670 UPDATE_WRITE_BARRIER, kNameToValueOffset); | 648 p->value); |
671 Return(p->value); | 649 Return(p->value); |
672 } | 650 } |
673 } | 651 } |
674 | 652 |
675 Bind(¬_found); | 653 Bind(¬_found); |
676 { | 654 { |
677 LookupPropertyOnPrototypeChain(receiver_map, p->name, &accessor, | 655 LookupPropertyOnPrototypeChain(receiver_map, p->name, &accessor, |
678 &var_accessor_pair, &var_accessor_holder, | 656 &var_accessor_pair, &var_accessor_holder, |
679 &readonly, slow); | 657 &readonly, slow); |
680 Add<NameDictionary>(properties, p->name, p->value, slow); | 658 Add<NameDictionary>(properties, p->name, p->value, slow); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 Bind(&slow); | 769 Bind(&slow); |
792 { | 770 { |
793 Comment("KeyedStoreGeneric_slow"); | 771 Comment("KeyedStoreGeneric_slow"); |
794 TailCallRuntime(Runtime::kSetProperty, context, receiver, name, value, | 772 TailCallRuntime(Runtime::kSetProperty, context, receiver, name, value, |
795 SmiConstant(language_mode)); | 773 SmiConstant(language_mode)); |
796 } | 774 } |
797 } | 775 } |
798 | 776 |
799 } // namespace internal | 777 } // namespace internal |
800 } // namespace v8 | 778 } // namespace v8 |
OLD | NEW |