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 1320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1331 } | 1331 } |
1332 | 1332 |
1333 switch (type) { | 1333 switch (type) { |
1334 case FIXED_ARRAY_TYPE: | 1334 case FIXED_ARRAY_TYPE: |
1335 FixedArray::BodyDescriptor::IterateBody(this, object_size, v); | 1335 FixedArray::BodyDescriptor::IterateBody(this, object_size, v); |
1336 break; | 1336 break; |
1337 case FIXED_DOUBLE_ARRAY_TYPE: | 1337 case FIXED_DOUBLE_ARRAY_TYPE: |
1338 break; | 1338 break; |
1339 case JS_OBJECT_TYPE: | 1339 case JS_OBJECT_TYPE: |
1340 case JS_CONTEXT_EXTENSION_OBJECT_TYPE: | 1340 case JS_CONTEXT_EXTENSION_OBJECT_TYPE: |
| 1341 case JS_MODULE_TYPE: |
1341 case JS_VALUE_TYPE: | 1342 case JS_VALUE_TYPE: |
1342 case JS_DATE_TYPE: | 1343 case JS_DATE_TYPE: |
1343 case JS_ARRAY_TYPE: | 1344 case JS_ARRAY_TYPE: |
1344 case JS_SET_TYPE: | 1345 case JS_SET_TYPE: |
1345 case JS_MAP_TYPE: | 1346 case JS_MAP_TYPE: |
1346 case JS_WEAK_MAP_TYPE: | 1347 case JS_WEAK_MAP_TYPE: |
1347 case JS_REGEXP_TYPE: | 1348 case JS_REGEXP_TYPE: |
1348 case JS_GLOBAL_PROXY_TYPE: | 1349 case JS_GLOBAL_PROXY_TYPE: |
1349 case JS_GLOBAL_OBJECT_TYPE: | 1350 case JS_GLOBAL_OBJECT_TYPE: |
1350 case JS_BUILTINS_OBJECT_TYPE: | 1351 case JS_BUILTINS_OBJECT_TYPE: |
(...skipping 963 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2314 // 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. |
2315 DescriptorArray* descriptors = instance_descriptors(); | 2316 DescriptorArray* descriptors = instance_descriptors(); |
2316 DescriptorLookupCache* cache = GetIsolate()->descriptor_lookup_cache(); | 2317 DescriptorLookupCache* cache = GetIsolate()->descriptor_lookup_cache(); |
2317 int index = cache->Lookup(descriptors, sentinel_name); | 2318 int index = cache->Lookup(descriptors, sentinel_name); |
2318 if (index == DescriptorLookupCache::kAbsent) { | 2319 if (index == DescriptorLookupCache::kAbsent) { |
2319 index = descriptors->Search(sentinel_name); | 2320 index = descriptors->Search(sentinel_name); |
2320 cache->Update(descriptors, sentinel_name, index); | 2321 cache->Update(descriptors, sentinel_name, index); |
2321 } | 2322 } |
2322 // If the transition already exists, return its descriptor. | 2323 // If the transition already exists, return its descriptor. |
2323 if (index != DescriptorArray::kNotFound) { | 2324 if (index != DescriptorArray::kNotFound) { |
2324 PropertyDetails details(descriptors->GetDetails(index)); | 2325 PropertyDetails details = descriptors->GetDetails(index); |
2325 if (details.type() == ELEMENTS_TRANSITION) { | 2326 if (details.type() == ELEMENTS_TRANSITION) { |
2326 return descriptors->GetValue(index); | 2327 return descriptors->GetValue(index); |
2327 } else { | 2328 } else { |
2328 if (safe_to_add_transition != NULL) { | 2329 if (safe_to_add_transition != NULL) { |
2329 *safe_to_add_transition = false; | 2330 *safe_to_add_transition = false; |
2330 } | 2331 } |
2331 } | 2332 } |
2332 } | 2333 } |
2333 return NULL; | 2334 return NULL; |
2334 } | 2335 } |
(...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3018 object->GetIsolate(), | 3019 object->GetIsolate(), |
3019 object->SetLocalPropertyIgnoreAttributes(*key, *value, attributes), | 3020 object->SetLocalPropertyIgnoreAttributes(*key, *value, attributes), |
3020 Object); | 3021 Object); |
3021 } | 3022 } |
3022 | 3023 |
3023 | 3024 |
3024 MaybeObject* JSObject::SetLocalPropertyIgnoreAttributes( | 3025 MaybeObject* JSObject::SetLocalPropertyIgnoreAttributes( |
3025 String* name, | 3026 String* name, |
3026 Object* value, | 3027 Object* value, |
3027 PropertyAttributes attributes) { | 3028 PropertyAttributes attributes) { |
3028 | |
3029 // Make sure that the top context does not change when doing callbacks or | 3029 // Make sure that the top context does not change when doing callbacks or |
3030 // interceptor calls. | 3030 // interceptor calls. |
3031 AssertNoContextChange ncc; | 3031 AssertNoContextChange ncc; |
3032 Isolate* isolate = GetIsolate(); | 3032 Isolate* isolate = GetIsolate(); |
3033 LookupResult result(isolate); | 3033 LookupResult result(isolate); |
3034 LocalLookup(name, &result); | 3034 LocalLookup(name, &result); |
3035 // Check access rights if needed. | 3035 // Check access rights if needed. |
3036 if (IsAccessCheckNeeded()) { | 3036 if (IsAccessCheckNeeded()) { |
3037 if (!isolate->MayNamedAccess(this, name, v8::ACCESS_SET)) { | 3037 if (!isolate->MayNamedAccess(this, name, v8::ACCESS_SET)) { |
3038 return SetPropertyWithFailedAccessCheck(&result, | 3038 return SetPropertyWithFailedAccessCheck(&result, |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3087 return ConvertDescriptorToField(name, value, attributes); | 3087 return ConvertDescriptorToField(name, value, attributes); |
3088 case CONSTANT_TRANSITION: | 3088 case CONSTANT_TRANSITION: |
3089 // Replace with a MAP_TRANSITION to a new map with a FIELD, even | 3089 // Replace with a MAP_TRANSITION to a new map with a FIELD, even |
3090 // if the value is a function. | 3090 // if the value is a function. |
3091 return ConvertDescriptorToFieldAndMapTransition(name, value, attributes); | 3091 return ConvertDescriptorToFieldAndMapTransition(name, value, attributes); |
3092 case NULL_DESCRIPTOR: | 3092 case NULL_DESCRIPTOR: |
3093 case ELEMENTS_TRANSITION: | 3093 case ELEMENTS_TRANSITION: |
3094 return ConvertDescriptorToFieldAndMapTransition(name, value, attributes); | 3094 return ConvertDescriptorToFieldAndMapTransition(name, value, attributes); |
3095 case HANDLER: | 3095 case HANDLER: |
3096 UNREACHABLE(); | 3096 UNREACHABLE(); |
3097 return value; | |
3098 } | 3097 } |
3099 UNREACHABLE(); // keep the compiler happy | 3098 UNREACHABLE(); // keep the compiler happy |
3100 return value; | 3099 return value; |
3101 } | 3100 } |
3102 | 3101 |
3103 | 3102 |
3104 PropertyAttributes JSObject::GetPropertyAttributePostInterceptor( | 3103 PropertyAttributes JSObject::GetPropertyAttributePostInterceptor( |
3105 JSObject* receiver, | 3104 JSObject* receiver, |
3106 String* name, | 3105 String* name, |
3107 bool continue_search) { | 3106 bool continue_search) { |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3338 } else { | 3337 } else { |
3339 property_count += 2; // Make space for two more properties. | 3338 property_count += 2; // Make space for two more properties. |
3340 } | 3339 } |
3341 StringDictionary* dictionary; | 3340 StringDictionary* dictionary; |
3342 { MaybeObject* maybe_dictionary = StringDictionary::Allocate(property_count); | 3341 { MaybeObject* maybe_dictionary = StringDictionary::Allocate(property_count); |
3343 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; | 3342 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; |
3344 } | 3343 } |
3345 | 3344 |
3346 DescriptorArray* descs = map_of_this->instance_descriptors(); | 3345 DescriptorArray* descs = map_of_this->instance_descriptors(); |
3347 for (int i = 0; i < descs->number_of_descriptors(); i++) { | 3346 for (int i = 0; i < descs->number_of_descriptors(); i++) { |
3348 PropertyDetails details(descs->GetDetails(i)); | 3347 PropertyDetails details = descs->GetDetails(i); |
3349 switch (details.type()) { | 3348 switch (details.type()) { |
3350 case CONSTANT_FUNCTION: { | 3349 case CONSTANT_FUNCTION: { |
3351 PropertyDetails d = | 3350 PropertyDetails d = |
3352 PropertyDetails(details.attributes(), NORMAL, details.index()); | 3351 PropertyDetails(details.attributes(), NORMAL, details.index()); |
3353 Object* value = descs->GetConstantFunction(i); | 3352 Object* value = descs->GetConstantFunction(i); |
3354 MaybeObject* maybe_dictionary = | 3353 MaybeObject* maybe_dictionary = |
3355 dictionary->Add(descs->GetKey(i), value, d); | 3354 dictionary->Add(descs->GetKey(i), value, d); |
3356 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; | 3355 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; |
3357 break; | 3356 break; |
3358 } | 3357 } |
(...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4200 } | 4199 } |
4201 } | 4200 } |
4202 return true; | 4201 return true; |
4203 } | 4202 } |
4204 | 4203 |
4205 | 4204 |
4206 int Map::NumberOfDescribedProperties(PropertyAttributes filter) { | 4205 int Map::NumberOfDescribedProperties(PropertyAttributes filter) { |
4207 int result = 0; | 4206 int result = 0; |
4208 DescriptorArray* descs = instance_descriptors(); | 4207 DescriptorArray* descs = instance_descriptors(); |
4209 for (int i = 0; i < descs->number_of_descriptors(); i++) { | 4208 for (int i = 0; i < descs->number_of_descriptors(); i++) { |
4210 PropertyDetails details(descs->GetDetails(i)); | 4209 PropertyDetails details = descs->GetDetails(i); |
4211 if (descs->IsProperty(i) && (details.attributes() & filter) == 0) { | 4210 if (descs->IsProperty(i) && (details.attributes() & filter) == 0) { |
4212 result++; | 4211 result++; |
4213 } | 4212 } |
4214 } | 4213 } |
4215 return result; | 4214 return result; |
4216 } | 4215 } |
4217 | 4216 |
4218 | 4217 |
4219 int Map::PropertyIndexFor(String* name) { | 4218 int Map::PropertyIndexFor(String* name) { |
4220 DescriptorArray* descs = instance_descriptors(); | 4219 DescriptorArray* descs = instance_descriptors(); |
(...skipping 1460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5681 CALL_HEAP_FUNCTION_VOID(dst->GetIsolate(), | 5680 CALL_HEAP_FUNCTION_VOID(dst->GetIsolate(), |
5682 dst->CopyFrom(dst_index, *src, src_index, witness)); | 5681 dst->CopyFrom(dst_index, *src, src_index, witness)); |
5683 } | 5682 } |
5684 | 5683 |
5685 | 5684 |
5686 MaybeObject* DescriptorArray::CopyFrom(int dst_index, | 5685 MaybeObject* DescriptorArray::CopyFrom(int dst_index, |
5687 DescriptorArray* src, | 5686 DescriptorArray* src, |
5688 int src_index, | 5687 int src_index, |
5689 const WhitenessWitness& witness) { | 5688 const WhitenessWitness& witness) { |
5690 Object* value = src->GetValue(src_index); | 5689 Object* value = src->GetValue(src_index); |
5691 PropertyDetails details(src->GetDetails(src_index)); | 5690 PropertyDetails details = src->GetDetails(src_index); |
5692 if (details.type() == CALLBACKS && value->IsAccessorPair()) { | 5691 if (details.type() == CALLBACKS && value->IsAccessorPair()) { |
5693 MaybeObject* maybe_copy = | 5692 MaybeObject* maybe_copy = |
5694 AccessorPair::cast(value)->CopyWithoutTransitions(); | 5693 AccessorPair::cast(value)->CopyWithoutTransitions(); |
5695 if (!maybe_copy->To(&value)) return maybe_copy; | 5694 if (!maybe_copy->To(&value)) return maybe_copy; |
5696 } | 5695 } |
5697 Descriptor desc(src->GetKey(src_index), value, details); | 5696 Descriptor desc(src->GetKey(src_index), value, details); |
5698 Set(dst_index, &desc, witness); | 5697 Set(dst_index, &desc, witness); |
5699 return this; | 5698 return this; |
5700 } | 5699 } |
5701 | 5700 |
(...skipping 22 matching lines...) Expand all Loading... |
5724 } | 5723 } |
5725 | 5724 |
5726 // 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. |
5727 // Count a null descriptor for key as inserted, not replaced. | 5726 // Count a null descriptor for key as inserted, not replaced. |
5728 int index = Search(descriptor->GetKey()); | 5727 int index = Search(descriptor->GetKey()); |
5729 const bool replacing = (index != kNotFound); | 5728 const bool replacing = (index != kNotFound); |
5730 bool keep_enumeration_index = false; | 5729 bool keep_enumeration_index = false; |
5731 if (replacing) { | 5730 if (replacing) { |
5732 // We are replacing an existing descriptor. We keep the enumeration | 5731 // We are replacing an existing descriptor. We keep the enumeration |
5733 // index of a visible property. | 5732 // index of a visible property. |
5734 PropertyType t = PropertyDetails(GetDetails(index)).type(); | 5733 PropertyType t = GetDetails(index).type(); |
5735 if (t == CONSTANT_FUNCTION || | 5734 if (t == CONSTANT_FUNCTION || |
5736 t == FIELD || | 5735 t == FIELD || |
5737 t == CALLBACKS || | 5736 t == CALLBACKS || |
5738 t == INTERCEPTOR) { | 5737 t == INTERCEPTOR) { |
5739 keep_enumeration_index = true; | 5738 keep_enumeration_index = true; |
5740 } else if (remove_transitions) { | 5739 } else if (remove_transitions) { |
5741 // Replaced descriptor has been counted as removed if it is | 5740 // Replaced descriptor has been counted as removed if it is |
5742 // a transition that will be replaced. Adjust count in this case. | 5741 // a transition that will be replaced. Adjust count in this case. |
5743 ++new_size; | 5742 ++new_size; |
5744 } | 5743 } |
5745 } else { | 5744 } else { |
5746 ++new_size; | 5745 ++new_size; |
5747 } | 5746 } |
5748 | 5747 |
5749 DescriptorArray* new_descriptors; | 5748 DescriptorArray* new_descriptors; |
5750 { MaybeObject* maybe_result = Allocate(new_size); | 5749 { MaybeObject* maybe_result = Allocate(new_size); |
5751 if (!maybe_result->To(&new_descriptors)) return maybe_result; | 5750 if (!maybe_result->To(&new_descriptors)) return maybe_result; |
5752 } | 5751 } |
5753 | 5752 |
5754 DescriptorArray::WhitenessWitness witness(new_descriptors); | 5753 DescriptorArray::WhitenessWitness witness(new_descriptors); |
5755 | 5754 |
5756 // 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 |
5757 // in the result. | 5756 // in the result. |
5758 int enumeration_index = NextEnumerationIndex(); | 5757 int enumeration_index = NextEnumerationIndex(); |
5759 if (!descriptor->ContainsTransition()) { | 5758 if (!descriptor->ContainsTransition()) { |
5760 if (keep_enumeration_index) { | 5759 if (keep_enumeration_index) { |
5761 descriptor->SetEnumerationIndex( | 5760 descriptor->SetEnumerationIndex(GetDetails(index).index()); |
5762 PropertyDetails(GetDetails(index)).index()); | |
5763 } else { | 5761 } else { |
5764 descriptor->SetEnumerationIndex(enumeration_index); | 5762 descriptor->SetEnumerationIndex(enumeration_index); |
5765 ++enumeration_index; | 5763 ++enumeration_index; |
5766 } | 5764 } |
5767 } | 5765 } |
5768 new_descriptors->SetNextEnumerationIndex(enumeration_index); | 5766 new_descriptors->SetNextEnumerationIndex(enumeration_index); |
5769 | 5767 |
5770 // Copy the descriptors, filtering out transitions and null descriptors, | 5768 // Copy the descriptors, filtering out transitions and null descriptors, |
5771 // and inserting or replacing a descriptor. | 5769 // and inserting or replacing a descriptor. |
5772 int to_index = 0; | 5770 int to_index = 0; |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5896 continue; | 5894 continue; |
5897 } | 5895 } |
5898 if (mid_hash < hash) { | 5896 if (mid_hash < hash) { |
5899 low = mid + 1; | 5897 low = mid + 1; |
5900 continue; | 5898 continue; |
5901 } | 5899 } |
5902 // Found an element with the same hash-code. | 5900 // Found an element with the same hash-code. |
5903 ASSERT(hash == mid_hash); | 5901 ASSERT(hash == mid_hash); |
5904 // There might be more, so we find the first one and | 5902 // There might be more, so we find the first one and |
5905 // check them all to see if we have a match. | 5903 // check them all to see if we have a match. |
5906 if (name == mid_name && !is_null_descriptor(mid)) return mid; | 5904 if (name == mid_name && !IsNullDescriptor(mid)) return mid; |
5907 while ((mid > low) && (GetKey(mid - 1)->Hash() == hash)) mid--; | 5905 while ((mid > low) && (GetKey(mid - 1)->Hash() == hash)) mid--; |
5908 for (; (mid <= high) && (GetKey(mid)->Hash() == hash); mid++) { | 5906 for (; (mid <= high) && (GetKey(mid)->Hash() == hash); mid++) { |
5909 if (GetKey(mid)->Equals(name) && !is_null_descriptor(mid)) return mid; | 5907 if (GetKey(mid)->Equals(name) && !IsNullDescriptor(mid)) return mid; |
5910 } | 5908 } |
5911 break; | 5909 break; |
5912 } | 5910 } |
5913 return kNotFound; | 5911 return kNotFound; |
5914 } | 5912 } |
5915 | 5913 |
5916 | 5914 |
5917 int DescriptorArray::LinearSearch(String* name, int len) { | 5915 int DescriptorArray::LinearSearch(String* name, int len) { |
5918 uint32_t hash = name->Hash(); | 5916 uint32_t hash = name->Hash(); |
5919 for (int number = 0; number < len; number++) { | 5917 for (int number = 0; number < len; number++) { |
5920 String* entry = GetKey(number); | 5918 String* entry = GetKey(number); |
5921 if ((entry->Hash() == hash) && | 5919 if ((entry->Hash() == hash) && |
5922 name->Equals(entry) && | 5920 name->Equals(entry) && |
5923 !is_null_descriptor(number)) { | 5921 !IsNullDescriptor(number)) { |
5924 return number; | 5922 return number; |
5925 } | 5923 } |
5926 } | 5924 } |
5927 return kNotFound; | 5925 return kNotFound; |
5928 } | 5926 } |
5929 | 5927 |
5930 | 5928 |
5931 MaybeObject* AccessorPair::CopyWithoutTransitions() { | 5929 MaybeObject* AccessorPair::CopyWithoutTransitions() { |
5932 Heap* heap = GetHeap(); | 5930 Heap* heap = GetHeap(); |
5933 AccessorPair* copy; | 5931 AccessorPair* copy; |
(...skipping 7031 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12965 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 12963 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
12966 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 12964 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
12967 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 12965 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
12968 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 12966 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
12969 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 12967 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
12970 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 12968 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
12971 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 12969 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
12972 } | 12970 } |
12973 | 12971 |
12974 } } // namespace v8::internal | 12972 } } // namespace v8::internal |
OLD | NEW |