| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 5717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5728 set(kEnumerationIndexIndex, bridge_storage); | 5728 set(kEnumerationIndexIndex, bridge_storage); |
| 5729 } | 5729 } |
| 5730 } | 5730 } |
| 5731 | 5731 |
| 5732 | 5732 |
| 5733 static bool InsertionPointFound(String* key1, String* key2) { | 5733 static bool InsertionPointFound(String* key1, String* key2) { |
| 5734 return key1->Hash() > key2->Hash() || key1 == key2; | 5734 return key1->Hash() > key2->Hash() || key1 == key2; |
| 5735 } | 5735 } |
| 5736 | 5736 |
| 5737 | 5737 |
| 5738 void DescriptorArray::CopyFrom(Handle<DescriptorArray> dst, |
| 5739 int dst_index, |
| 5740 Handle<DescriptorArray> src, |
| 5741 int src_index, |
| 5742 const WhitenessWitness& witness) { |
| 5743 CALL_HEAP_FUNCTION_VOID(dst->GetIsolate(), |
| 5744 dst->CopyFrom(dst_index, *src, src_index, witness)); |
| 5745 } |
| 5746 |
| 5747 |
| 5748 MaybeObject* DescriptorArray::CopyFrom(int dst_index, |
| 5749 DescriptorArray* src, |
| 5750 int src_index, |
| 5751 const WhitenessWitness& witness) { |
| 5752 Object* value = src->GetValue(src_index); |
| 5753 PropertyDetails details(src->GetDetails(src_index)); |
| 5754 if (details.type() == CALLBACKS && value->IsAccessorPair()) { |
| 5755 MaybeObject* maybe_copy = |
| 5756 AccessorPair::cast(value)->CopyWithoutTransitions(); |
| 5757 if (!maybe_copy->To(&value)) return maybe_copy; |
| 5758 } |
| 5759 Descriptor desc(src->GetKey(src_index), value, details); |
| 5760 Set(dst_index, &desc, witness); |
| 5761 return this; |
| 5762 } |
| 5763 |
| 5764 |
| 5738 MaybeObject* DescriptorArray::CopyInsert(Descriptor* descriptor, | 5765 MaybeObject* DescriptorArray::CopyInsert(Descriptor* descriptor, |
| 5739 TransitionFlag transition_flag) { | 5766 TransitionFlag transition_flag) { |
| 5740 // Transitions are only kept when inserting another transition. | 5767 // Transitions are only kept when inserting another transition. |
| 5741 // This precondition is not required by this function's implementation, but | 5768 // This precondition is not required by this function's implementation, but |
| 5742 // is currently required by the semantics of maps, so we check it. | 5769 // is currently required by the semantics of maps, so we check it. |
| 5743 // Conversely, we filter after replacing, so replacing a transition and | 5770 // Conversely, we filter after replacing, so replacing a transition and |
| 5744 // removing all other transitions is not supported. | 5771 // removing all other transitions is not supported. |
| 5745 bool remove_transitions = transition_flag == REMOVE_TRANSITIONS; | 5772 bool remove_transitions = transition_flag == REMOVE_TRANSITIONS; |
| 5746 ASSERT(remove_transitions == !descriptor->ContainsTransition()); | 5773 ASSERT(remove_transitions == !descriptor->ContainsTransition()); |
| 5747 ASSERT(descriptor->GetDetails().type() != NULL_DESCRIPTOR); | 5774 ASSERT(descriptor->GetDetails().type() != NULL_DESCRIPTOR); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5811 int insertion_index = -1; | 5838 int insertion_index = -1; |
| 5812 int from_index = 0; | 5839 int from_index = 0; |
| 5813 while (from_index < number_of_descriptors()) { | 5840 while (from_index < number_of_descriptors()) { |
| 5814 if (insertion_index < 0 && | 5841 if (insertion_index < 0 && |
| 5815 InsertionPointFound(GetKey(from_index), descriptor->GetKey())) { | 5842 InsertionPointFound(GetKey(from_index), descriptor->GetKey())) { |
| 5816 insertion_index = to_index++; | 5843 insertion_index = to_index++; |
| 5817 if (replacing) from_index++; | 5844 if (replacing) from_index++; |
| 5818 } else { | 5845 } else { |
| 5819 if (!(IsNullDescriptor(from_index) || | 5846 if (!(IsNullDescriptor(from_index) || |
| 5820 (remove_transitions && IsTransitionOnly(from_index)))) { | 5847 (remove_transitions && IsTransitionOnly(from_index)))) { |
| 5821 new_descriptors->CopyFrom(to_index++, this, from_index, witness); | 5848 MaybeObject* copy_result = |
| 5849 new_descriptors->CopyFrom(to_index++, this, from_index, witness); |
| 5850 if (copy_result->IsFailure()) return copy_result; |
| 5822 } | 5851 } |
| 5823 from_index++; | 5852 from_index++; |
| 5824 } | 5853 } |
| 5825 } | 5854 } |
| 5826 if (insertion_index < 0) insertion_index = to_index++; | 5855 if (insertion_index < 0) insertion_index = to_index++; |
| 5827 new_descriptors->Set(insertion_index, descriptor, witness); | 5856 new_descriptors->Set(insertion_index, descriptor, witness); |
| 5828 | 5857 |
| 5829 ASSERT(to_index == new_descriptors->number_of_descriptors()); | 5858 ASSERT(to_index == new_descriptors->number_of_descriptors()); |
| 5830 SLOW_ASSERT(new_descriptors->IsSortedNoDuplicates()); | 5859 SLOW_ASSERT(new_descriptors->IsSortedNoDuplicates()); |
| 5831 | 5860 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 5851 return maybe_result; | 5880 return maybe_result; |
| 5852 } | 5881 } |
| 5853 } | 5882 } |
| 5854 | 5883 |
| 5855 DescriptorArray::WhitenessWitness witness(new_descriptors); | 5884 DescriptorArray::WhitenessWitness witness(new_descriptors); |
| 5856 | 5885 |
| 5857 // Copy the content. | 5886 // Copy the content. |
| 5858 int next_descriptor = 0; | 5887 int next_descriptor = 0; |
| 5859 for (int i = 0; i < number_of_descriptors(); i++) { | 5888 for (int i = 0; i < number_of_descriptors(); i++) { |
| 5860 if (IsProperty(i)) { | 5889 if (IsProperty(i)) { |
| 5861 new_descriptors->CopyFrom(next_descriptor++, this, i, witness); | 5890 MaybeObject* copy_result = |
| 5891 new_descriptors->CopyFrom(next_descriptor++, this, i, witness); |
| 5892 if (copy_result->IsFailure()) return copy_result; |
| 5862 } | 5893 } |
| 5863 } | 5894 } |
| 5864 ASSERT(next_descriptor == new_descriptors->number_of_descriptors()); | 5895 ASSERT(next_descriptor == new_descriptors->number_of_descriptors()); |
| 5865 | 5896 |
| 5866 return new_descriptors; | 5897 return new_descriptors; |
| 5867 } | 5898 } |
| 5868 | 5899 |
| 5869 | 5900 |
| 5870 void DescriptorArray::SortUnchecked(const WhitenessWitness& witness) { | 5901 void DescriptorArray::SortUnchecked(const WhitenessWitness& witness) { |
| 5871 // In-place heap sort. | 5902 // In-place heap sort. |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5964 if ((entry->Hash() == hash) && | 5995 if ((entry->Hash() == hash) && |
| 5965 name->Equals(entry) && | 5996 name->Equals(entry) && |
| 5966 !is_null_descriptor(number)) { | 5997 !is_null_descriptor(number)) { |
| 5967 return number; | 5998 return number; |
| 5968 } | 5999 } |
| 5969 } | 6000 } |
| 5970 return kNotFound; | 6001 return kNotFound; |
| 5971 } | 6002 } |
| 5972 | 6003 |
| 5973 | 6004 |
| 6005 MaybeObject* AccessorPair::CopyWithoutTransitions() { |
| 6006 Heap* heap = GetHeap(); |
| 6007 AccessorPair* copy; |
| 6008 { MaybeObject* maybe_copy = heap->AllocateAccessorPair(); |
| 6009 if (!maybe_copy->To(©)) return maybe_copy; |
| 6010 } |
| 6011 copy->set_getter(getter()->IsMap() ? heap->the_hole_value() : getter()); |
| 6012 copy->set_setter(setter()->IsMap() ? heap->the_hole_value() : setter()); |
| 6013 return copy; |
| 6014 } |
| 6015 |
| 6016 |
| 5974 MaybeObject* DeoptimizationInputData::Allocate(int deopt_entry_count, | 6017 MaybeObject* DeoptimizationInputData::Allocate(int deopt_entry_count, |
| 5975 PretenureFlag pretenure) { | 6018 PretenureFlag pretenure) { |
| 5976 ASSERT(deopt_entry_count > 0); | 6019 ASSERT(deopt_entry_count > 0); |
| 5977 return HEAP->AllocateFixedArray(LengthFor(deopt_entry_count), | 6020 return HEAP->AllocateFixedArray(LengthFor(deopt_entry_count), |
| 5978 pretenure); | 6021 pretenure); |
| 5979 } | 6022 } |
| 5980 | 6023 |
| 5981 | 6024 |
| 5982 MaybeObject* DeoptimizationOutputData::Allocate(int number_of_deopt_points, | 6025 MaybeObject* DeoptimizationOutputData::Allocate(int number_of_deopt_points, |
| 5983 PretenureFlag pretenure) { | 6026 PretenureFlag pretenure) { |
| (...skipping 7047 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13031 if (break_point_objects()->IsUndefined()) return 0; | 13074 if (break_point_objects()->IsUndefined()) return 0; |
| 13032 // Single break point. | 13075 // Single break point. |
| 13033 if (!break_point_objects()->IsFixedArray()) return 1; | 13076 if (!break_point_objects()->IsFixedArray()) return 1; |
| 13034 // Multiple break points. | 13077 // Multiple break points. |
| 13035 return FixedArray::cast(break_point_objects())->length(); | 13078 return FixedArray::cast(break_point_objects())->length(); |
| 13036 } | 13079 } |
| 13037 #endif // ENABLE_DEBUGGER_SUPPORT | 13080 #endif // ENABLE_DEBUGGER_SUPPORT |
| 13038 | 13081 |
| 13039 | 13082 |
| 13040 } } // namespace v8::internal | 13083 } } // namespace v8::internal |
| OLD | NEW |