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-impl.h" | 10 #include "src/ic/accessor-assembler-impl.h" |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 void KeyedStoreGenericAssembler::TryRewriteElements( | 111 void KeyedStoreGenericAssembler::TryRewriteElements( |
112 Node* receiver, Node* receiver_map, Node* elements, Node* native_context, | 112 Node* receiver, Node* receiver_map, Node* elements, Node* native_context, |
113 ElementsKind from_kind, ElementsKind to_kind, Label* bailout) { | 113 ElementsKind from_kind, ElementsKind to_kind, Label* bailout) { |
114 DCHECK(IsFastPackedElementsKind(from_kind)); | 114 DCHECK(IsFastPackedElementsKind(from_kind)); |
115 ElementsKind holey_from_kind = GetHoleyElementsKind(from_kind); | 115 ElementsKind holey_from_kind = GetHoleyElementsKind(from_kind); |
116 ElementsKind holey_to_kind = GetHoleyElementsKind(to_kind); | 116 ElementsKind holey_to_kind = GetHoleyElementsKind(to_kind); |
117 if (AllocationSite::GetMode(from_kind, to_kind) == TRACK_ALLOCATION_SITE) { | 117 if (AllocationSite::GetMode(from_kind, to_kind) == TRACK_ALLOCATION_SITE) { |
118 TrapAllocationMemento(receiver, bailout); | 118 TrapAllocationMemento(receiver, bailout); |
119 } | 119 } |
120 Label perform_transition(this), check_holey_map(this); | 120 Label perform_transition(this), check_holey_map(this); |
121 Variable var_target_map(this, MachineType::PointerRepresentation()); | 121 Variable var_target_map(this, MachineRepresentation::kTagged); |
122 // Check if the receiver has the default |from_kind| map. | 122 // Check if the receiver has the default |from_kind| map. |
123 { | 123 { |
124 Node* packed_map = | 124 Node* packed_map = |
125 LoadContextElement(native_context, Context::ArrayMapIndex(from_kind)); | 125 LoadContextElement(native_context, Context::ArrayMapIndex(from_kind)); |
126 GotoIf(WordNotEqual(receiver_map, packed_map), &check_holey_map); | 126 GotoIf(WordNotEqual(receiver_map, packed_map), &check_holey_map); |
127 var_target_map.Bind( | 127 var_target_map.Bind( |
128 LoadContextElement(native_context, Context::ArrayMapIndex(to_kind))); | 128 LoadContextElement(native_context, Context::ArrayMapIndex(to_kind))); |
129 Goto(&perform_transition); | 129 Goto(&perform_transition); |
130 } | 130 } |
131 | 131 |
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
527 Bind(&found_fast); | 527 Bind(&found_fast); |
528 { | 528 { |
529 Node* descriptors = var_meta_storage.value(); | 529 Node* descriptors = var_meta_storage.value(); |
530 Node* name_index = var_entry.value(); | 530 Node* name_index = var_entry.value(); |
531 // TODO(jkummerow): Add helper functions for accessing value and | 531 // TODO(jkummerow): Add helper functions for accessing value and |
532 // details by entry. | 532 // details by entry. |
533 const int kNameToDetailsOffset = (DescriptorArray::kDescriptorDetails - | 533 const int kNameToDetailsOffset = (DescriptorArray::kDescriptorDetails - |
534 DescriptorArray::kDescriptorKey) * | 534 DescriptorArray::kDescriptorKey) * |
535 kPointerSize; | 535 kPointerSize; |
536 Node* details = LoadAndUntagToWord32FixedArrayElement( | 536 Node* details = LoadAndUntagToWord32FixedArrayElement( |
537 descriptors, name_index, kNameToDetailsOffset); | 537 descriptors, name_index, kNameToDetailsOffset, INTPTR_PARAMETERS); |
538 JumpIfDataProperty(details, &ok_to_write, readonly); | 538 JumpIfDataProperty(details, &ok_to_write, readonly); |
539 | 539 |
540 // Accessor case. | 540 // Accessor case. |
541 Variable var_details(this, MachineRepresentation::kWord32); | 541 Variable var_details(this, MachineRepresentation::kWord32); |
542 LoadPropertyFromFastObject(holder, holder_map, descriptors, name_index, | 542 LoadPropertyFromFastObject(holder, holder_map, descriptors, name_index, |
543 &var_details, var_accessor_pair); | 543 &var_details, var_accessor_pair); |
544 var_accessor_holder->Bind(holder); | 544 var_accessor_holder->Bind(holder); |
545 Goto(accessor); | 545 Goto(accessor); |
546 } | 546 } |
547 | 547 |
548 Bind(&found_dict); | 548 Bind(&found_dict); |
549 { | 549 { |
550 Node* dictionary = var_meta_storage.value(); | 550 Node* dictionary = var_meta_storage.value(); |
551 Node* entry = var_entry.value(); | 551 Node* entry = var_entry.value(); |
552 const int kNameToDetailsOffset = (NameDictionary::kEntryDetailsIndex - | 552 const int kNameToDetailsOffset = (NameDictionary::kEntryDetailsIndex - |
553 NameDictionary::kEntryKeyIndex) * | 553 NameDictionary::kEntryKeyIndex) * |
554 kPointerSize; | 554 kPointerSize; |
555 Node* details = LoadAndUntagToWord32FixedArrayElement( | 555 Node* details = LoadAndUntagToWord32FixedArrayElement( |
556 dictionary, entry, kNameToDetailsOffset); | 556 dictionary, entry, kNameToDetailsOffset, INTPTR_PARAMETERS); |
557 JumpIfDataProperty(details, &ok_to_write, readonly); | 557 JumpIfDataProperty(details, &ok_to_write, readonly); |
558 | 558 |
559 // Accessor case. | 559 // Accessor case. |
560 const int kNameToValueOffset = (NameDictionary::kEntryValueIndex - | 560 const int kNameToValueOffset = (NameDictionary::kEntryValueIndex - |
561 NameDictionary::kEntryKeyIndex) * | 561 NameDictionary::kEntryKeyIndex) * |
562 kPointerSize; | 562 kPointerSize; |
563 var_accessor_pair->Bind( | 563 var_accessor_pair->Bind(LoadFixedArrayElement( |
564 LoadFixedArrayElement(dictionary, entry, kNameToValueOffset)); | 564 dictionary, entry, kNameToValueOffset, INTPTR_PARAMETERS)); |
565 var_accessor_holder->Bind(holder); | 565 var_accessor_holder->Bind(holder); |
566 Goto(accessor); | 566 Goto(accessor); |
567 } | 567 } |
568 | 568 |
569 Bind(&found_global); | 569 Bind(&found_global); |
570 { | 570 { |
571 Node* dictionary = var_meta_storage.value(); | 571 Node* dictionary = var_meta_storage.value(); |
572 Node* entry = var_entry.value(); | 572 Node* entry = var_entry.value(); |
573 const int kNameToValueOffset = (GlobalDictionary::kEntryValueIndex - | 573 const int kNameToValueOffset = (GlobalDictionary::kEntryValueIndex - |
574 GlobalDictionary::kEntryKeyIndex) * | 574 GlobalDictionary::kEntryKeyIndex) * |
575 kPointerSize; | 575 kPointerSize; |
576 | 576 |
577 Node* property_cell = | 577 Node* property_cell = LoadFixedArrayElement( |
578 LoadFixedArrayElement(dictionary, entry, kNameToValueOffset); | 578 dictionary, entry, kNameToValueOffset, INTPTR_PARAMETERS); |
579 | 579 |
580 Node* value = | 580 Node* value = |
581 LoadObjectField(property_cell, PropertyCell::kValueOffset); | 581 LoadObjectField(property_cell, PropertyCell::kValueOffset); |
582 GotoIf(WordEqual(value, TheHoleConstant()), &next_proto); | 582 GotoIf(WordEqual(value, TheHoleConstant()), &next_proto); |
583 Node* details = LoadAndUntagToWord32ObjectField( | 583 Node* details = LoadAndUntagToWord32ObjectField( |
584 property_cell, PropertyCell::kDetailsOffset); | 584 property_cell, PropertyCell::kDetailsOffset); |
585 JumpIfDataProperty(details, &ok_to_write, readonly); | 585 JumpIfDataProperty(details, &ok_to_write, readonly); |
586 | 586 |
587 // Accessor case. | 587 // Accessor case. |
588 var_accessor_pair->Bind(value); | 588 var_accessor_pair->Bind(value); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 Label dictionary_found(this, &var_name_index), not_found(this); | 634 Label dictionary_found(this, &var_name_index), not_found(this); |
635 NameDictionaryLookup<NameDictionary>(properties, p->name, &dictionary_found, | 635 NameDictionaryLookup<NameDictionary>(properties, p->name, &dictionary_found, |
636 &var_name_index, ¬_found); | 636 &var_name_index, ¬_found); |
637 Bind(&dictionary_found); | 637 Bind(&dictionary_found); |
638 { | 638 { |
639 Label overwrite(this); | 639 Label overwrite(this); |
640 const int kNameToDetailsOffset = (NameDictionary::kEntryDetailsIndex - | 640 const int kNameToDetailsOffset = (NameDictionary::kEntryDetailsIndex - |
641 NameDictionary::kEntryKeyIndex) * | 641 NameDictionary::kEntryKeyIndex) * |
642 kPointerSize; | 642 kPointerSize; |
643 Node* details = LoadAndUntagToWord32FixedArrayElement( | 643 Node* details = LoadAndUntagToWord32FixedArrayElement( |
644 properties, var_name_index.value(), kNameToDetailsOffset); | 644 properties, var_name_index.value(), kNameToDetailsOffset, |
| 645 INTPTR_PARAMETERS); |
645 JumpIfDataProperty(details, &overwrite, &readonly); | 646 JumpIfDataProperty(details, &overwrite, &readonly); |
646 | 647 |
647 // Accessor case. | 648 // Accessor case. |
648 const int kNameToValueOffset = | 649 const int kNameToValueOffset = |
649 (NameDictionary::kEntryValueIndex - NameDictionary::kEntryKeyIndex) * | 650 (NameDictionary::kEntryValueIndex - NameDictionary::kEntryKeyIndex) * |
650 kPointerSize; | 651 kPointerSize; |
651 var_accessor_pair.Bind(LoadFixedArrayElement( | 652 var_accessor_pair.Bind( |
652 properties, var_name_index.value(), kNameToValueOffset)); | 653 LoadFixedArrayElement(properties, var_name_index.value(), |
| 654 kNameToValueOffset, INTPTR_PARAMETERS)); |
653 var_accessor_holder.Bind(receiver); | 655 var_accessor_holder.Bind(receiver); |
654 Goto(&accessor); | 656 Goto(&accessor); |
655 | 657 |
656 Bind(&overwrite); | 658 Bind(&overwrite); |
657 { | 659 { |
658 StoreFixedArrayElement(properties, var_name_index.value(), p->value, | 660 StoreFixedArrayElement(properties, var_name_index.value(), p->value, |
659 UPDATE_WRITE_BARRIER, kNameToValueOffset, | 661 UPDATE_WRITE_BARRIER, kNameToValueOffset, |
660 INTPTR_PARAMETERS); | 662 INTPTR_PARAMETERS); |
661 Return(p->value); | 663 Return(p->value); |
662 } | 664 } |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
779 Bind(&slow); | 781 Bind(&slow); |
780 { | 782 { |
781 Comment("KeyedStoreGeneric_slow"); | 783 Comment("KeyedStoreGeneric_slow"); |
782 TailCallRuntime(Runtime::kSetProperty, context, receiver, name, value, | 784 TailCallRuntime(Runtime::kSetProperty, context, receiver, name, value, |
783 SmiConstant(language_mode)); | 785 SmiConstant(language_mode)); |
784 } | 786 } |
785 } | 787 } |
786 | 788 |
787 } // namespace internal | 789 } // namespace internal |
788 } // namespace v8 | 790 } // namespace v8 |
OLD | NEW |