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 2304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2315 // Get the cached index for the descriptors lookup, or find and cache it. | 2315 // Get the cached index for the descriptors lookup, or find and cache it. |
2316 DescriptorArray* descriptors = instance_descriptors(); | 2316 DescriptorArray* descriptors = instance_descriptors(); |
2317 DescriptorLookupCache* cache = GetIsolate()->descriptor_lookup_cache(); | 2317 DescriptorLookupCache* cache = GetIsolate()->descriptor_lookup_cache(); |
2318 int index = cache->Lookup(descriptors, sentinel_name); | 2318 int index = cache->Lookup(descriptors, sentinel_name); |
2319 if (index == DescriptorLookupCache::kAbsent) { | 2319 if (index == DescriptorLookupCache::kAbsent) { |
2320 index = descriptors->Search(sentinel_name); | 2320 index = descriptors->Search(sentinel_name); |
2321 cache->Update(descriptors, sentinel_name, index); | 2321 cache->Update(descriptors, sentinel_name, index); |
2322 } | 2322 } |
2323 // If the transition already exists, return its descriptor. | 2323 // If the transition already exists, return its descriptor. |
2324 if (index != DescriptorArray::kNotFound) { | 2324 if (index != DescriptorArray::kNotFound) { |
2325 PropertyDetails details(descriptors->GetDetails(index)); | 2325 PropertyDetails details = descriptors->GetDetails(index); |
2326 if (details.type() == ELEMENTS_TRANSITION) { | 2326 if (details.type() == ELEMENTS_TRANSITION) { |
2327 return descriptors->GetValue(index); | 2327 return descriptors->GetValue(index); |
2328 } else { | 2328 } else { |
2329 if (safe_to_add_transition != NULL) { | 2329 if (safe_to_add_transition != NULL) { |
2330 *safe_to_add_transition = false; | 2330 *safe_to_add_transition = false; |
2331 } | 2331 } |
2332 } | 2332 } |
2333 } | 2333 } |
2334 return NULL; | 2334 return NULL; |
2335 } | 2335 } |
(...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3337 } else { | 3337 } else { |
3338 property_count += 2; // Make space for two more properties. | 3338 property_count += 2; // Make space for two more properties. |
3339 } | 3339 } |
3340 StringDictionary* dictionary; | 3340 StringDictionary* dictionary; |
3341 { MaybeObject* maybe_dictionary = StringDictionary::Allocate(property_count); | 3341 { MaybeObject* maybe_dictionary = StringDictionary::Allocate(property_count); |
3342 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; | 3342 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; |
3343 } | 3343 } |
3344 | 3344 |
3345 DescriptorArray* descs = map_of_this->instance_descriptors(); | 3345 DescriptorArray* descs = map_of_this->instance_descriptors(); |
3346 for (int i = 0; i < descs->number_of_descriptors(); i++) { | 3346 for (int i = 0; i < descs->number_of_descriptors(); i++) { |
3347 PropertyDetails details(descs->GetDetails(i)); | 3347 PropertyDetails details = descs->GetDetails(i); |
3348 switch (details.type()) { | 3348 switch (details.type()) { |
3349 case CONSTANT_FUNCTION: { | 3349 case CONSTANT_FUNCTION: { |
3350 PropertyDetails d = | 3350 PropertyDetails d = |
3351 PropertyDetails(details.attributes(), NORMAL, details.index()); | 3351 PropertyDetails(details.attributes(), NORMAL, details.index()); |
3352 Object* value = descs->GetConstantFunction(i); | 3352 Object* value = descs->GetConstantFunction(i); |
3353 MaybeObject* maybe_dictionary = | 3353 MaybeObject* maybe_dictionary = |
3354 dictionary->Add(descs->GetKey(i), value, d); | 3354 dictionary->Add(descs->GetKey(i), value, d); |
3355 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; | 3355 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; |
3356 break; | 3356 break; |
3357 } | 3357 } |
(...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4199 } | 4199 } |
4200 } | 4200 } |
4201 return true; | 4201 return true; |
4202 } | 4202 } |
4203 | 4203 |
4204 | 4204 |
4205 int Map::NumberOfDescribedProperties(PropertyAttributes filter) { | 4205 int Map::NumberOfDescribedProperties(PropertyAttributes filter) { |
4206 int result = 0; | 4206 int result = 0; |
4207 DescriptorArray* descs = instance_descriptors(); | 4207 DescriptorArray* descs = instance_descriptors(); |
4208 for (int i = 0; i < descs->number_of_descriptors(); i++) { | 4208 for (int i = 0; i < descs->number_of_descriptors(); i++) { |
4209 PropertyDetails details(descs->GetDetails(i)); | 4209 PropertyDetails details = descs->GetDetails(i); |
4210 if (descs->IsProperty(i) && (details.attributes() & filter) == 0) { | 4210 if (descs->IsProperty(i) && (details.attributes() & filter) == 0) { |
4211 result++; | 4211 result++; |
4212 } | 4212 } |
4213 } | 4213 } |
4214 return result; | 4214 return result; |
4215 } | 4215 } |
4216 | 4216 |
4217 | 4217 |
4218 int Map::PropertyIndexFor(String* name) { | 4218 int Map::PropertyIndexFor(String* name) { |
4219 DescriptorArray* descs = instance_descriptors(); | 4219 DescriptorArray* descs = instance_descriptors(); |
(...skipping 1460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5680 CALL_HEAP_FUNCTION_VOID(dst->GetIsolate(), | 5680 CALL_HEAP_FUNCTION_VOID(dst->GetIsolate(), |
5681 dst->CopyFrom(dst_index, *src, src_index, witness)); | 5681 dst->CopyFrom(dst_index, *src, src_index, witness)); |
5682 } | 5682 } |
5683 | 5683 |
5684 | 5684 |
5685 MaybeObject* DescriptorArray::CopyFrom(int dst_index, | 5685 MaybeObject* DescriptorArray::CopyFrom(int dst_index, |
5686 DescriptorArray* src, | 5686 DescriptorArray* src, |
5687 int src_index, | 5687 int src_index, |
5688 const WhitenessWitness& witness) { | 5688 const WhitenessWitness& witness) { |
5689 Object* value = src->GetValue(src_index); | 5689 Object* value = src->GetValue(src_index); |
5690 PropertyDetails details(src->GetDetails(src_index)); | 5690 PropertyDetails details = src->GetDetails(src_index); |
5691 if (details.type() == CALLBACKS && value->IsAccessorPair()) { | 5691 if (details.type() == CALLBACKS && value->IsAccessorPair()) { |
5692 MaybeObject* maybe_copy = | 5692 MaybeObject* maybe_copy = |
5693 AccessorPair::cast(value)->CopyWithoutTransitions(); | 5693 AccessorPair::cast(value)->CopyWithoutTransitions(); |
5694 if (!maybe_copy->To(&value)) return maybe_copy; | 5694 if (!maybe_copy->To(&value)) return maybe_copy; |
5695 } | 5695 } |
5696 Descriptor desc(src->GetKey(src_index), value, details); | 5696 Descriptor desc(src->GetKey(src_index), value, details); |
5697 Set(dst_index, &desc, witness); | 5697 Set(dst_index, &desc, witness); |
5698 return this; | 5698 return this; |
5699 } | 5699 } |
5700 | 5700 |
(...skipping 22 matching lines...) Expand all Loading... |
5723 } | 5723 } |
5724 | 5724 |
5725 // If key is in descriptor, we replace it in-place when filtering. | 5725 // If key is in descriptor, we replace it in-place when filtering. |
5726 // Count a null descriptor for key as inserted, not replaced. | 5726 // Count a null descriptor for key as inserted, not replaced. |
5727 int index = Search(descriptor->GetKey()); | 5727 int index = Search(descriptor->GetKey()); |
5728 const bool replacing = (index != kNotFound); | 5728 const bool replacing = (index != kNotFound); |
5729 bool keep_enumeration_index = false; | 5729 bool keep_enumeration_index = false; |
5730 if (replacing) { | 5730 if (replacing) { |
5731 // We are replacing an existing descriptor. We keep the enumeration | 5731 // We are replacing an existing descriptor. We keep the enumeration |
5732 // index of a visible property. | 5732 // index of a visible property. |
5733 PropertyType t = PropertyDetails(GetDetails(index)).type(); | 5733 PropertyType t = GetDetails(index).type(); |
5734 if (t == CONSTANT_FUNCTION || | 5734 if (t == CONSTANT_FUNCTION || |
5735 t == FIELD || | 5735 t == FIELD || |
5736 t == CALLBACKS || | 5736 t == CALLBACKS || |
5737 t == INTERCEPTOR) { | 5737 t == INTERCEPTOR) { |
5738 keep_enumeration_index = true; | 5738 keep_enumeration_index = true; |
5739 } else if (remove_transitions) { | 5739 } else if (remove_transitions) { |
5740 // Replaced descriptor has been counted as removed if it is | 5740 // Replaced descriptor has been counted as removed if it is |
5741 // a transition that will be replaced. Adjust count in this case. | 5741 // a transition that will be replaced. Adjust count in this case. |
5742 ++new_size; | 5742 ++new_size; |
5743 } | 5743 } |
5744 } else { | 5744 } else { |
5745 ++new_size; | 5745 ++new_size; |
5746 } | 5746 } |
5747 | 5747 |
5748 DescriptorArray* new_descriptors; | 5748 DescriptorArray* new_descriptors; |
5749 { MaybeObject* maybe_result = Allocate(new_size); | 5749 { MaybeObject* maybe_result = Allocate(new_size); |
5750 if (!maybe_result->To(&new_descriptors)) return maybe_result; | 5750 if (!maybe_result->To(&new_descriptors)) return maybe_result; |
5751 } | 5751 } |
5752 | 5752 |
5753 DescriptorArray::WhitenessWitness witness(new_descriptors); | 5753 DescriptorArray::WhitenessWitness witness(new_descriptors); |
5754 | 5754 |
5755 // Set the enumeration index in the descriptors and set the enumeration index | 5755 // Set the enumeration index in the descriptors and set the enumeration index |
5756 // in the result. | 5756 // in the result. |
5757 int enumeration_index = NextEnumerationIndex(); | 5757 int enumeration_index = NextEnumerationIndex(); |
5758 if (!descriptor->ContainsTransition()) { | 5758 if (!descriptor->ContainsTransition()) { |
5759 if (keep_enumeration_index) { | 5759 if (keep_enumeration_index) { |
5760 descriptor->SetEnumerationIndex( | 5760 descriptor->SetEnumerationIndex(GetDetails(index).index()); |
5761 PropertyDetails(GetDetails(index)).index()); | |
5762 } else { | 5761 } else { |
5763 descriptor->SetEnumerationIndex(enumeration_index); | 5762 descriptor->SetEnumerationIndex(enumeration_index); |
5764 ++enumeration_index; | 5763 ++enumeration_index; |
5765 } | 5764 } |
5766 } | 5765 } |
5767 new_descriptors->SetNextEnumerationIndex(enumeration_index); | 5766 new_descriptors->SetNextEnumerationIndex(enumeration_index); |
5768 | 5767 |
5769 // Copy the descriptors, filtering out transitions and null descriptors, | 5768 // Copy the descriptors, filtering out transitions and null descriptors, |
5770 // and inserting or replacing a descriptor. | 5769 // and inserting or replacing a descriptor. |
5771 int to_index = 0; | 5770 int to_index = 0; |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5895 continue; | 5894 continue; |
5896 } | 5895 } |
5897 if (mid_hash < hash) { | 5896 if (mid_hash < hash) { |
5898 low = mid + 1; | 5897 low = mid + 1; |
5899 continue; | 5898 continue; |
5900 } | 5899 } |
5901 // Found an element with the same hash-code. | 5900 // Found an element with the same hash-code. |
5902 ASSERT(hash == mid_hash); | 5901 ASSERT(hash == mid_hash); |
5903 // There might be more, so we find the first one and | 5902 // There might be more, so we find the first one and |
5904 // check them all to see if we have a match. | 5903 // check them all to see if we have a match. |
5905 if (name == mid_name && !is_null_descriptor(mid)) return mid; | 5904 if (name == mid_name && !IsNullDescriptor(mid)) return mid; |
5906 while ((mid > low) && (GetKey(mid - 1)->Hash() == hash)) mid--; | 5905 while ((mid > low) && (GetKey(mid - 1)->Hash() == hash)) mid--; |
5907 for (; (mid <= high) && (GetKey(mid)->Hash() == hash); mid++) { | 5906 for (; (mid <= high) && (GetKey(mid)->Hash() == hash); mid++) { |
5908 if (GetKey(mid)->Equals(name) && !is_null_descriptor(mid)) return mid; | 5907 if (GetKey(mid)->Equals(name) && !IsNullDescriptor(mid)) return mid; |
5909 } | 5908 } |
5910 break; | 5909 break; |
5911 } | 5910 } |
5912 return kNotFound; | 5911 return kNotFound; |
5913 } | 5912 } |
5914 | 5913 |
5915 | 5914 |
5916 int DescriptorArray::LinearSearch(String* name, int len) { | 5915 int DescriptorArray::LinearSearch(String* name, int len) { |
5917 uint32_t hash = name->Hash(); | 5916 uint32_t hash = name->Hash(); |
5918 for (int number = 0; number < len; number++) { | 5917 for (int number = 0; number < len; number++) { |
5919 String* entry = GetKey(number); | 5918 String* entry = GetKey(number); |
5920 if ((entry->Hash() == hash) && | 5919 if ((entry->Hash() == hash) && |
5921 name->Equals(entry) && | 5920 name->Equals(entry) && |
5922 !is_null_descriptor(number)) { | 5921 !IsNullDescriptor(number)) { |
5923 return number; | 5922 return number; |
5924 } | 5923 } |
5925 } | 5924 } |
5926 return kNotFound; | 5925 return kNotFound; |
5927 } | 5926 } |
5928 | 5927 |
5929 | 5928 |
5930 MaybeObject* AccessorPair::CopyWithoutTransitions() { | 5929 MaybeObject* AccessorPair::CopyWithoutTransitions() { |
5931 Heap* heap = GetHeap(); | 5930 Heap* heap = GetHeap(); |
5932 AccessorPair* copy; | 5931 AccessorPair* copy; |
(...skipping 7031 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12964 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 12963 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
12965 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 12964 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
12966 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 12965 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
12967 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 12966 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
12968 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 12967 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
12969 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 12968 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
12970 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 12969 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
12971 } | 12970 } |
12972 | 12971 |
12973 } } // namespace v8::internal | 12972 } } // namespace v8::internal |
OLD | NEW |