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 4871 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4882 | 4882 |
4883 // An iterator over all map transitions in an descriptor array, reusing the map | 4883 // An iterator over all map transitions in an descriptor array, reusing the map |
4884 // field of the contens array while it is running. | 4884 // field of the contens array while it is running. |
4885 class IntrusiveMapTransitionIterator { | 4885 class IntrusiveMapTransitionIterator { |
4886 public: | 4886 public: |
4887 explicit IntrusiveMapTransitionIterator(DescriptorArray* descriptor_array) | 4887 explicit IntrusiveMapTransitionIterator(DescriptorArray* descriptor_array) |
4888 : descriptor_array_(descriptor_array) { } | 4888 : descriptor_array_(descriptor_array) { } |
4889 | 4889 |
4890 void Start() { | 4890 void Start() { |
4891 ASSERT(!IsIterating()); | 4891 ASSERT(!IsIterating()); |
4892 if (HasContentArray()) *ContentHeader() = Smi::FromInt(0); | 4892 if (HasDescriptors()) *DescriptorArrayHeader() = Smi::FromInt(0); |
4893 } | 4893 } |
4894 | 4894 |
4895 bool IsIterating() { | 4895 bool IsIterating() { |
4896 return HasContentArray() && (*ContentHeader())->IsSmi(); | 4896 return HasDescriptors() && (*DescriptorArrayHeader())->IsSmi(); |
4897 } | 4897 } |
4898 | 4898 |
4899 Map* Next() { | 4899 Map* Next() { |
4900 ASSERT(IsIterating()); | 4900 ASSERT(IsIterating()); |
4901 FixedArray* contents = ContentArray(); | 4901 // Attention, tricky index manipulation ahead: Two two consecutive indices |
4902 // Attention, tricky index manipulation ahead: Every entry in the contents | 4902 // are assigned to each descriptor. Most descriptors directly advance to the |
4903 // array consists of a value/details pair, so the index is typically even. | 4903 // next descriptor by adding 2 to the index. The exceptions are the |
4904 // An exception is made for CALLBACKS entries: An even index means we look | 4904 // CALLBACKS entries: An even index means we look at its getter, and an odd |
4905 // at its getter, and an odd index means we look at its setter. | 4905 // index means we look at its setter. |
4906 int index = Smi::cast(*ContentHeader())->value(); | 4906 int index = Smi::cast(*DescriptorArrayHeader())->value(); |
4907 while (index < contents->length()) { | 4907 while ((index / 2) < descriptor_array_->number_of_descriptors()) { |
4908 PropertyDetails details(Smi::cast(contents->get(index | 1))); | 4908 PropertyDetails details(descriptor_array_->GetDetails(index / 2)); |
4909 switch (details.type()) { | 4909 switch (details.type()) { |
4910 case MAP_TRANSITION: | 4910 case MAP_TRANSITION: |
4911 case CONSTANT_TRANSITION: | 4911 case CONSTANT_TRANSITION: |
4912 case ELEMENTS_TRANSITION: | 4912 case ELEMENTS_TRANSITION: |
4913 // We definitely have a map transition. | 4913 // We definitely have a map transition. |
4914 *ContentHeader() = Smi::FromInt(index + 2); | 4914 *DescriptorArrayHeader() = Smi::FromInt(index + 2); |
4915 return static_cast<Map*>(contents->get(index)); | 4915 return static_cast<Map*>(descriptor_array_->GetValue(index / 2)); |
4916 case CALLBACKS: { | 4916 case CALLBACKS: { |
4917 // We might have a map transition in a getter or in a setter. | 4917 // We might have a map transition in a getter or in a setter. |
4918 AccessorPair* accessors = | 4918 AccessorPair* accessors = |
4919 static_cast<AccessorPair*>(contents->get(index & ~1)); | 4919 static_cast<AccessorPair*>(descriptor_array_->GetValue(index / 2)) ; |
Florian Schneider
2012/05/22 16:53:09
Long line.
| |
4920 Object* accessor = | 4920 Object* accessor = |
4921 ((index & 1) == 0) ? accessors->getter() : accessors->setter(); | 4921 ((index & 1) == 0) ? accessors->getter() : accessors->setter(); |
4922 index++; | 4922 index++; |
4923 if (accessor->IsMap()) { | 4923 if (accessor->IsMap()) { |
4924 *ContentHeader() = Smi::FromInt(index); | 4924 *DescriptorArrayHeader() = Smi::FromInt(index); |
4925 return static_cast<Map*>(accessor); | 4925 return static_cast<Map*>(accessor); |
4926 } | 4926 } |
4927 break; | 4927 break; |
4928 } | 4928 } |
4929 case NORMAL: | 4929 case NORMAL: |
4930 case FIELD: | 4930 case FIELD: |
4931 case CONSTANT_FUNCTION: | 4931 case CONSTANT_FUNCTION: |
4932 case HANDLER: | 4932 case HANDLER: |
4933 case INTERCEPTOR: | 4933 case INTERCEPTOR: |
4934 case NULL_DESCRIPTOR: | 4934 case NULL_DESCRIPTOR: |
4935 // We definitely have no map transition. | 4935 // We definitely have no map transition. |
4936 index += 2; | 4936 index += 2; |
4937 break; | 4937 break; |
4938 } | 4938 } |
4939 } | 4939 } |
4940 *ContentHeader() = descriptor_array_->GetHeap()->fixed_array_map(); | 4940 *DescriptorArrayHeader() = descriptor_array_->GetHeap()->fixed_array_map(); |
4941 return NULL; | 4941 return NULL; |
4942 } | 4942 } |
4943 | 4943 |
4944 private: | 4944 private: |
4945 bool HasContentArray() { | 4945 bool HasDescriptors() { |
4946 return descriptor_array_-> length() > DescriptorArray::kContentArrayIndex; | 4946 return !descriptor_array_->IsEmpty(); |
4947 } | 4947 } |
4948 | 4948 |
4949 FixedArray* ContentArray() { | 4949 Object** DescriptorArrayHeader() { |
4950 Object* array = descriptor_array_->get(DescriptorArray::kContentArrayIndex); | 4950 return HeapObject::RawField(descriptor_array_, DescriptorArray::kMapOffset); |
4951 return static_cast<FixedArray*>(array); | |
4952 } | |
4953 | |
4954 Object** ContentHeader() { | |
4955 return HeapObject::RawField(ContentArray(), DescriptorArray::kMapOffset); | |
4956 } | 4951 } |
4957 | 4952 |
4958 DescriptorArray* descriptor_array_; | 4953 DescriptorArray* descriptor_array_; |
4959 }; | 4954 }; |
4960 | 4955 |
4961 | 4956 |
4962 // An iterator over all prototype transitions, reusing the map field of the | 4957 // An iterator over all prototype transitions, reusing the map field of the |
4963 // underlying array while it is running. | 4958 // underlying array while it is running. |
4964 class IntrusivePrototypeTransitionIterator { | 4959 class IntrusivePrototypeTransitionIterator { |
4965 public: | 4960 public: |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5046 // this map's map! | 5041 // this map's map! |
5047 void SetParent(TraversableMap* parent) { set_map_no_write_barrier(parent); } | 5042 void SetParent(TraversableMap* parent) { set_map_no_write_barrier(parent); } |
5048 | 5043 |
5049 // Reset the current map's map, returning the parent previously stored in it. | 5044 // Reset the current map's map, returning the parent previously stored in it. |
5050 TraversableMap* GetAndResetParent() { | 5045 TraversableMap* GetAndResetParent() { |
5051 TraversableMap* old_parent = static_cast<TraversableMap*>(map()); | 5046 TraversableMap* old_parent = static_cast<TraversableMap*>(map()); |
5052 set_map_no_write_barrier(GetHeap()->meta_map()); | 5047 set_map_no_write_barrier(GetHeap()->meta_map()); |
5053 return old_parent; | 5048 return old_parent; |
5054 } | 5049 } |
5055 | 5050 |
5051 // Can either be Smi (no instance descriptors), or a descriptor array with the | |
5052 // header overwritten as a Smi (thus iterating). | |
5053 DescriptorArray* MutatedInstanceDescriptors() { | |
5054 Object* object = *HeapObject::RawField(this, kInstanceDescriptorsOrBitField3 Offset); | |
Florian Schneider
2012/05/22 16:53:09
Long line.
| |
5055 if (object->IsSmi()) { | |
5056 return GetHeap()->empty_descriptor_array(); | |
5057 } else { | |
5058 DescriptorArray* descriptor_array = static_cast<DescriptorArray*>(object); | |
5059 ASSERT((*HeapObject::RawField(descriptor_array, | |
5060 DescriptorArray::kMapOffset))->IsSmi()); | |
5061 return descriptor_array; | |
5062 } | |
5063 } | |
5064 | |
5056 // Start iterating over this map's children, possibly destroying a FixedArray | 5065 // Start iterating over this map's children, possibly destroying a FixedArray |
5057 // map (see explanation above). | 5066 // map (see explanation above). |
5058 void ChildIteratorStart() { | 5067 void ChildIteratorStart() { |
5059 IntrusiveMapTransitionIterator(instance_descriptors()).Start(); | 5068 IntrusiveMapTransitionIterator(instance_descriptors()).Start(); |
5060 IntrusivePrototypeTransitionIterator( | 5069 IntrusivePrototypeTransitionIterator( |
5061 unchecked_prototype_transitions()).Start(); | 5070 unchecked_prototype_transitions()).Start(); |
5062 } | 5071 } |
5063 | 5072 |
5064 // If we have an unvisited child map, return that one and advance. If we have | 5073 // If we have an unvisited child map, return that one and advance. If we have |
5065 // none, return NULL and reset any destroyed FixedArray maps. | 5074 // none, return NULL and reset any destroyed FixedArray maps. |
5066 TraversableMap* ChildIteratorNext() { | 5075 TraversableMap* ChildIteratorNext() { |
5067 IntrusiveMapTransitionIterator descriptor_iterator(instance_descriptors()); | |
5068 if (descriptor_iterator.IsIterating()) { | |
5069 Map* next = descriptor_iterator.Next(); | |
5070 if (next != NULL) return static_cast<TraversableMap*>(next); | |
5071 } | |
5072 IntrusivePrototypeTransitionIterator | 5076 IntrusivePrototypeTransitionIterator |
5073 proto_iterator(unchecked_prototype_transitions()); | 5077 proto_iterator(unchecked_prototype_transitions()); |
5074 if (proto_iterator.IsIterating()) { | 5078 if (proto_iterator.IsIterating()) { |
5075 Map* next = proto_iterator.Next(); | 5079 Map* next = proto_iterator.Next(); |
5076 if (next != NULL) return static_cast<TraversableMap*>(next); | 5080 if (next != NULL) return static_cast<TraversableMap*>(next); |
5077 } | 5081 } |
5082 IntrusiveMapTransitionIterator descriptor_iterator(MutatedInstanceDescriptor s()); | |
Florian Schneider
2012/05/22 16:53:09
Long line.
| |
5083 if (descriptor_iterator.IsIterating()) { | |
5084 Map* next = descriptor_iterator.Next(); | |
5085 if (next != NULL) return static_cast<TraversableMap*>(next); | |
5086 } | |
5078 return NULL; | 5087 return NULL; |
5079 } | 5088 } |
5080 }; | 5089 }; |
5081 | 5090 |
5082 | 5091 |
5083 // Traverse the transition tree in postorder without using the C++ stack by | 5092 // Traverse the transition tree in postorder without using the C++ stack by |
5084 // doing pointer reversal. | 5093 // doing pointer reversal. |
5085 void Map::TraverseTransitionTree(TraverseCallback callback, void* data) { | 5094 void Map::TraverseTransitionTree(TraverseCallback callback, void* data) { |
5086 TraversableMap* current = static_cast<TraversableMap*>(this); | 5095 TraversableMap* current = static_cast<TraversableMap*>(this); |
5087 current->ChildIteratorStart(); | 5096 current->ChildIteratorStart(); |
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5631 } | 5640 } |
5632 // Allocate the array of keys. | 5641 // Allocate the array of keys. |
5633 Object* array; | 5642 Object* array; |
5634 { MaybeObject* maybe_array = | 5643 { MaybeObject* maybe_array = |
5635 heap->AllocateFixedArray(ToKeyIndex(number_of_descriptors)); | 5644 heap->AllocateFixedArray(ToKeyIndex(number_of_descriptors)); |
5636 if (!maybe_array->ToObject(&array)) return maybe_array; | 5645 if (!maybe_array->ToObject(&array)) return maybe_array; |
5637 } | 5646 } |
5638 // Do not use DescriptorArray::cast on incomplete object. | 5647 // Do not use DescriptorArray::cast on incomplete object. |
5639 FixedArray* result = FixedArray::cast(array); | 5648 FixedArray* result = FixedArray::cast(array); |
5640 | 5649 |
5641 // Allocate the content array and set it in the descriptor array. | |
5642 { MaybeObject* maybe_array = | |
5643 heap->AllocateFixedArray(number_of_descriptors << 1); | |
5644 if (!maybe_array->ToObject(&array)) return maybe_array; | |
5645 } | |
5646 result->set(kBitField3StorageIndex, Smi::FromInt(0)); | 5650 result->set(kBitField3StorageIndex, Smi::FromInt(0)); |
5647 result->set(kContentArrayIndex, array); | |
5648 result->set(kEnumerationIndexIndex, | 5651 result->set(kEnumerationIndexIndex, |
5649 Smi::FromInt(PropertyDetails::kInitialIndex)); | 5652 Smi::FromInt(PropertyDetails::kInitialIndex)); |
5650 return result; | 5653 return result; |
5651 } | 5654 } |
5652 | 5655 |
5653 | 5656 |
5654 void DescriptorArray::SetEnumCache(FixedArray* bridge_storage, | 5657 void DescriptorArray::SetEnumCache(FixedArray* bridge_storage, |
5655 FixedArray* new_cache, | 5658 FixedArray* new_cache, |
5656 Object* new_index_cache) { | 5659 Object* new_index_cache) { |
5657 ASSERT(bridge_storage->length() >= kEnumCacheBridgeLength); | 5660 ASSERT(bridge_storage->length() >= kEnumCacheBridgeLength); |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5822 MaybeObject* copy_result = | 5825 MaybeObject* copy_result = |
5823 new_descriptors->CopyFrom(next_descriptor++, this, i, witness); | 5826 new_descriptors->CopyFrom(next_descriptor++, this, i, witness); |
5824 if (copy_result->IsFailure()) return copy_result; | 5827 if (copy_result->IsFailure()) return copy_result; |
5825 } | 5828 } |
5826 } | 5829 } |
5827 ASSERT(next_descriptor == new_descriptors->number_of_descriptors()); | 5830 ASSERT(next_descriptor == new_descriptors->number_of_descriptors()); |
5828 | 5831 |
5829 return new_descriptors; | 5832 return new_descriptors; |
5830 } | 5833 } |
5831 | 5834 |
5832 | 5835 // The whiteness witness is needed since sort will reshuffle the entries in the |
5836 // descriptor array. If the descriptor array were to be gray, the sort would | |
5837 // potentially swap a black and a white member. This would result in | |
5838 // accidentally reclaiming the white member if the descriptor array owned the | |
5839 // unique pointer. | |
5833 void DescriptorArray::SortUnchecked(const WhitenessWitness& witness) { | 5840 void DescriptorArray::SortUnchecked(const WhitenessWitness& witness) { |
5834 // In-place heap sort. | 5841 // In-place heap sort. |
5835 int len = number_of_descriptors(); | 5842 int len = number_of_descriptors(); |
5836 | 5843 |
5837 // Bottom-up max-heap construction. | 5844 // Bottom-up max-heap construction. |
5838 // Index of the last node with children | 5845 // Index of the last node with children |
5839 const int max_parent_index = (len / 2) - 1; | 5846 const int max_parent_index = (len / 2) - 1; |
5840 for (int i = max_parent_index; i >= 0; --i) { | 5847 for (int i = max_parent_index; i >= 0; --i) { |
5841 int parent_index = i; | 5848 int parent_index = i; |
5842 const uint32_t parent_hash = GetKey(i)->Hash(); | 5849 const uint32_t parent_hash = GetKey(i)->Hash(); |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5967 pretenure); | 5974 pretenure); |
5968 } | 5975 } |
5969 | 5976 |
5970 | 5977 |
5971 #ifdef DEBUG | 5978 #ifdef DEBUG |
5972 bool DescriptorArray::IsEqualTo(DescriptorArray* other) { | 5979 bool DescriptorArray::IsEqualTo(DescriptorArray* other) { |
5973 if (IsEmpty()) return other->IsEmpty(); | 5980 if (IsEmpty()) return other->IsEmpty(); |
5974 if (other->IsEmpty()) return false; | 5981 if (other->IsEmpty()) return false; |
5975 if (length() != other->length()) return false; | 5982 if (length() != other->length()) return false; |
5976 for (int i = 0; i < length(); ++i) { | 5983 for (int i = 0; i < length(); ++i) { |
5977 if (get(i) != other->get(i) && i != kContentArrayIndex) return false; | 5984 if (get(i) != other->get(i)) return false; |
5978 } | 5985 } |
5979 return GetContentArray()->IsEqualTo(other->GetContentArray()); | 5986 return true; |
5980 } | 5987 } |
5981 #endif | 5988 #endif |
5982 | 5989 |
5983 | 5990 |
5984 bool String::LooksValid() { | 5991 bool String::LooksValid() { |
5985 if (!Isolate::Current()->heap()->Contains(this)) return false; | 5992 if (!Isolate::Current()->heap()->Contains(this)) return false; |
5986 return true; | 5993 return true; |
5987 } | 5994 } |
5988 | 5995 |
5989 | 5996 |
(...skipping 1201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7191 } | 7198 } |
7192 } | 7199 } |
7193 | 7200 |
7194 | 7201 |
7195 void Map::ClearNonLiveTransitions(Heap* heap) { | 7202 void Map::ClearNonLiveTransitions(Heap* heap) { |
7196 DescriptorArray* d = DescriptorArray::cast( | 7203 DescriptorArray* d = DescriptorArray::cast( |
7197 *RawField(this, Map::kInstanceDescriptorsOrBitField3Offset)); | 7204 *RawField(this, Map::kInstanceDescriptorsOrBitField3Offset)); |
7198 if (d->IsEmpty()) return; | 7205 if (d->IsEmpty()) return; |
7199 Smi* NullDescriptorDetails = | 7206 Smi* NullDescriptorDetails = |
7200 PropertyDetails(NONE, NULL_DESCRIPTOR).AsSmi(); | 7207 PropertyDetails(NONE, NULL_DESCRIPTOR).AsSmi(); |
7201 FixedArray* contents = FixedArray::cast( | 7208 for (int i = 0; i < d->number_of_descriptors(); ++i) { |
7202 d->get(DescriptorArray::kContentArrayIndex)); | |
7203 ASSERT(contents->length() >= 2); | |
7204 for (int i = 0; i < contents->length(); i += 2) { | |
7205 // If the pair (value, details) is a map transition, check if the target is | 7209 // If the pair (value, details) is a map transition, check if the target is |
7206 // live. If not, null the descriptor. Also drop the back pointer for that | 7210 // live. If not, null the descriptor. Also drop the back pointer for that |
7207 // map transition, so that this map is not reached again by following a back | 7211 // map transition, so that this map is not reached again by following a back |
7208 // pointer from that non-live map. | 7212 // pointer from that non-live map. |
7209 bool keep_entry = false; | 7213 bool keep_entry = false; |
7210 PropertyDetails details(Smi::cast(contents->get(i + 1))); | 7214 PropertyDetails details(d->GetDetails(i)); |
7211 switch (details.type()) { | 7215 switch (details.type()) { |
7212 case MAP_TRANSITION: | 7216 case MAP_TRANSITION: |
7213 case CONSTANT_TRANSITION: | 7217 case CONSTANT_TRANSITION: |
7214 ClearBackPointer(heap, contents->get(i), &keep_entry); | 7218 ClearBackPointer(heap, d->GetValue(i), &keep_entry); |
7215 break; | 7219 break; |
7216 case ELEMENTS_TRANSITION: { | 7220 case ELEMENTS_TRANSITION: { |
7217 Object* object = contents->get(i); | 7221 Object* object = d->GetValue(i); |
7218 if (object->IsMap()) { | 7222 if (object->IsMap()) { |
7219 ClearBackPointer(heap, object, &keep_entry); | 7223 ClearBackPointer(heap, object, &keep_entry); |
7220 } else { | 7224 } else { |
7221 FixedArray* array = FixedArray::cast(object); | 7225 FixedArray* array = FixedArray::cast(object); |
7222 for (int j = 0; j < array->length(); ++j) { | 7226 for (int j = 0; j < array->length(); ++j) { |
7223 if (ClearBackPointer(heap, array->get(j), &keep_entry)) { | 7227 if (ClearBackPointer(heap, array->get(j), &keep_entry)) { |
7224 array->set_undefined(j); | 7228 array->set_undefined(j); |
7225 } | 7229 } |
7226 } | 7230 } |
7227 } | 7231 } |
7228 break; | 7232 break; |
7229 } | 7233 } |
7230 case CALLBACKS: { | 7234 case CALLBACKS: { |
7231 Object* object = contents->get(i); | 7235 Object* object = d->GetValue(i); |
7232 if (object->IsAccessorPair()) { | 7236 if (object->IsAccessorPair()) { |
7233 AccessorPair* accessors = AccessorPair::cast(object); | 7237 AccessorPair* accessors = AccessorPair::cast(object); |
7234 if (ClearBackPointer(heap, accessors->getter(), &keep_entry)) { | 7238 if (ClearBackPointer(heap, accessors->getter(), &keep_entry)) { |
7235 accessors->set_getter(heap->the_hole_value()); | 7239 accessors->set_getter(heap->the_hole_value()); |
7236 } | 7240 } |
7237 if (ClearBackPointer(heap, accessors->setter(), &keep_entry)) { | 7241 if (ClearBackPointer(heap, accessors->setter(), &keep_entry)) { |
7238 accessors->set_setter(heap->the_hole_value()); | 7242 accessors->set_setter(heap->the_hole_value()); |
7239 } | 7243 } |
7240 } else { | 7244 } else { |
7241 keep_entry = true; | 7245 keep_entry = true; |
7242 } | 7246 } |
7243 break; | 7247 break; |
7244 } | 7248 } |
7245 case NORMAL: | 7249 case NORMAL: |
7246 case FIELD: | 7250 case FIELD: |
7247 case CONSTANT_FUNCTION: | 7251 case CONSTANT_FUNCTION: |
7248 case HANDLER: | 7252 case HANDLER: |
7249 case INTERCEPTOR: | 7253 case INTERCEPTOR: |
7250 case NULL_DESCRIPTOR: | 7254 case NULL_DESCRIPTOR: |
7251 keep_entry = true; | 7255 keep_entry = true; |
7252 break; | 7256 break; |
7253 } | 7257 } |
7254 // Make sure that an entry containing only dead transitions gets collected. | 7258 // Make sure that an entry containing only dead transitions gets collected. |
7255 // What we *really* want to do here is removing this entry completely, but | 7259 // What we *really* want to do here is removing this entry completely, but |
7256 // for technical reasons we can't do this, so we zero it out instead. | 7260 // for technical reasons we can't do this, so we zero it out instead. |
7257 if (!keep_entry) { | 7261 if (!keep_entry) { |
7258 contents->set_unchecked(i + 1, NullDescriptorDetails); | 7262 d->SetDetailsUnchecked(i, NullDescriptorDetails); |
7259 contents->set_null_unchecked(heap, i); | 7263 d->SetNullValueUnchecked(i, heap); |
7260 } | 7264 } |
7261 } | 7265 } |
7262 } | 7266 } |
7263 | 7267 |
7264 | 7268 |
7265 int Map::Hash() { | 7269 int Map::Hash() { |
7266 // For performance reasons we only hash the 3 most variable fields of a map: | 7270 // For performance reasons we only hash the 3 most variable fields of a map: |
7267 // constructor, prototype and bit_field2. | 7271 // constructor, prototype and bit_field2. |
7268 | 7272 |
7269 // Shift away the tag. | 7273 // Shift away the tag. |
(...skipping 5661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
12931 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 12935 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
12932 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 12936 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
12933 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 12937 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
12934 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 12938 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
12935 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 12939 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
12936 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 12940 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
12937 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 12941 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
12938 } | 12942 } |
12939 | 12943 |
12940 } } // namespace v8::internal | 12944 } } // namespace v8::internal |
OLD | NEW |