| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 2530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2541 descriptors->InitializeRepresentations(Representation::Tagged()); | 2541 descriptors->InitializeRepresentations(Representation::Tagged()); |
| 2542 | 2542 |
| 2543 // Unless the instance is being migrated, ensure that modify_index is a field. | 2543 // Unless the instance is being migrated, ensure that modify_index is a field. |
| 2544 PropertyDetails details = descriptors->GetDetails(modify_index); | 2544 PropertyDetails details = descriptors->GetDetails(modify_index); |
| 2545 if (store_mode == FORCE_FIELD && details.type() != FIELD) { | 2545 if (store_mode == FORCE_FIELD && details.type() != FIELD) { |
| 2546 FieldDescriptor d(handle(descriptors->GetKey(modify_index), | 2546 FieldDescriptor d(handle(descriptors->GetKey(modify_index), |
| 2547 map->GetIsolate()), | 2547 map->GetIsolate()), |
| 2548 new_map->NumberOfFields(), | 2548 new_map->NumberOfFields(), |
| 2549 attributes, | 2549 attributes, |
| 2550 Representation::Tagged()); | 2550 Representation::Tagged()); |
| 2551 d.SetSortedKeyIndex(details.pointer()); | 2551 descriptors->Replace(modify_index, &d); |
| 2552 descriptors->Set(modify_index, &d); | |
| 2553 int unused_property_fields = new_map->unused_property_fields() - 1; | 2552 int unused_property_fields = new_map->unused_property_fields() - 1; |
| 2554 if (unused_property_fields < 0) { | 2553 if (unused_property_fields < 0) { |
| 2555 unused_property_fields += JSObject::kFieldsAdded; | 2554 unused_property_fields += JSObject::kFieldsAdded; |
| 2556 } | 2555 } |
| 2557 new_map->set_unused_property_fields(unused_property_fields); | 2556 new_map->set_unused_property_fields(unused_property_fields); |
| 2558 } | 2557 } |
| 2559 | 2558 |
| 2560 if (FLAG_trace_generalization) { | 2559 if (FLAG_trace_generalization) { |
| 2561 map->PrintGeneralization(stdout, reason, modify_index, | 2560 map->PrintGeneralization(stdout, reason, modify_index, |
| 2562 new_map->NumberOfOwnDescriptors(), | 2561 new_map->NumberOfOwnDescriptors(), |
| (...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3114 Handle<Object> args[] = { name, object }; | 3113 Handle<Object> args[] = { name, object }; |
| 3115 Handle<Object> error = isolate->factory()->NewTypeError( | 3114 Handle<Object> error = isolate->factory()->NewTypeError( |
| 3116 "strict_read_only_property", HandleVector(args, ARRAY_SIZE(args))); | 3115 "strict_read_only_property", HandleVector(args, ARRAY_SIZE(args))); |
| 3117 return isolate->Throw<Object>(error); | 3116 return isolate->Throw<Object>(error); |
| 3118 } | 3117 } |
| 3119 return isolate->factory()->the_hole_value(); | 3118 return isolate->factory()->the_hole_value(); |
| 3120 } | 3119 } |
| 3121 | 3120 |
| 3122 | 3121 |
| 3123 void Map::EnsureDescriptorSlack(Handle<Map> map, int slack) { | 3122 void Map::EnsureDescriptorSlack(Handle<Map> map, int slack) { |
| 3123 // Only supports adding slack to owned descriptors. |
| 3124 ASSERT(map->owns_descriptors()); |
| 3125 |
| 3124 Handle<DescriptorArray> descriptors(map->instance_descriptors()); | 3126 Handle<DescriptorArray> descriptors(map->instance_descriptors()); |
| 3127 int old_size = map->NumberOfOwnDescriptors(); |
| 3125 if (slack <= descriptors->NumberOfSlackDescriptors()) return; | 3128 if (slack <= descriptors->NumberOfSlackDescriptors()) return; |
| 3126 int number_of_descriptors = descriptors->number_of_descriptors(); | |
| 3127 Isolate* isolate = map->GetIsolate(); | |
| 3128 Handle<DescriptorArray> new_descriptors = | |
| 3129 isolate->factory()->NewDescriptorArray(number_of_descriptors, slack); | |
| 3130 DescriptorArray::WhitenessWitness witness(*new_descriptors); | |
| 3131 | 3129 |
| 3132 for (int i = 0; i < number_of_descriptors; ++i) { | 3130 Handle<DescriptorArray> new_descriptors = DescriptorArray::CopyUpTo( |
| 3133 new_descriptors->CopyFrom(i, *descriptors, i, witness); | 3131 descriptors, old_size, slack); |
| 3132 |
| 3133 if (old_size == 0) { |
| 3134 map->set_instance_descriptors(*new_descriptors); |
| 3135 return; |
| 3136 } |
| 3137 |
| 3138 // If the source descriptors had an enum cache we copy it. This ensures |
| 3139 // that the maps to which we push the new descriptor array back can rely |
| 3140 // on a cache always being available once it is set. If the map has more |
| 3141 // enumerated descriptors than available in the original cache, the cache |
| 3142 // will be lazily replaced by the extended cache when needed. |
| 3143 if (descriptors->HasEnumCache()) { |
| 3144 new_descriptors->CopyEnumCacheFrom(*descriptors); |
| 3145 } |
| 3146 |
| 3147 // Replace descriptors by new_descriptors in all maps that share it. |
| 3148 map->GetHeap()->incremental_marking()->RecordWrites(*descriptors); |
| 3149 |
| 3150 Map* walk_map; |
| 3151 for (Object* current = map->GetBackPointer(); |
| 3152 !current->IsUndefined(); |
| 3153 current = walk_map->GetBackPointer()) { |
| 3154 walk_map = Map::cast(current); |
| 3155 if (walk_map->instance_descriptors() != *descriptors) break; |
| 3156 walk_map->set_instance_descriptors(*new_descriptors); |
| 3134 } | 3157 } |
| 3135 | 3158 |
| 3136 map->set_instance_descriptors(*new_descriptors); | 3159 map->set_instance_descriptors(*new_descriptors); |
| 3137 } | 3160 } |
| 3138 | 3161 |
| 3139 | 3162 |
| 3140 template<class T> | 3163 template<class T> |
| 3141 static int AppendUniqueCallbacks(NeanderArray* callbacks, | 3164 static int AppendUniqueCallbacks(NeanderArray* callbacks, |
| 3142 Handle<typename T::Array> array, | 3165 Handle<typename T::Array> array, |
| 3143 int valid_descriptors) { | 3166 int valid_descriptors) { |
| (...skipping 3689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6833 | 6856 |
| 6834 | 6857 |
| 6835 Handle<Map> Map::ShareDescriptor(Handle<Map> map, | 6858 Handle<Map> Map::ShareDescriptor(Handle<Map> map, |
| 6836 Handle<DescriptorArray> descriptors, | 6859 Handle<DescriptorArray> descriptors, |
| 6837 Descriptor* descriptor) { | 6860 Descriptor* descriptor) { |
| 6838 // Sanity check. This path is only to be taken if the map owns its descriptor | 6861 // Sanity check. This path is only to be taken if the map owns its descriptor |
| 6839 // array, implying that its NumberOfOwnDescriptors equals the number of | 6862 // array, implying that its NumberOfOwnDescriptors equals the number of |
| 6840 // descriptors in the descriptor array. | 6863 // descriptors in the descriptor array. |
| 6841 ASSERT(map->NumberOfOwnDescriptors() == | 6864 ASSERT(map->NumberOfOwnDescriptors() == |
| 6842 map->instance_descriptors()->number_of_descriptors()); | 6865 map->instance_descriptors()->number_of_descriptors()); |
| 6866 |
| 6843 Handle<Map> result = Map::CopyDropDescriptors(map); | 6867 Handle<Map> result = Map::CopyDropDescriptors(map); |
| 6844 | |
| 6845 Handle<Name> name = descriptor->GetKey(); | 6868 Handle<Name> name = descriptor->GetKey(); |
| 6846 | |
| 6847 Handle<TransitionArray> transitions = | 6869 Handle<TransitionArray> transitions = |
| 6848 Map::AddTransition(map, name, result, SIMPLE_TRANSITION); | 6870 Map::AddTransition(map, name, result, SIMPLE_TRANSITION); |
| 6849 | 6871 |
| 6850 if (descriptors->NumberOfSlackDescriptors() > 0) { | 6872 // Ensure there's space for the new descriptor in the shared descriptor array. |
| 6851 descriptors->Append(descriptor); | 6873 if (descriptors->NumberOfSlackDescriptors() == 0) { |
| 6852 result->SetBackPointer(*map); | |
| 6853 result->InitializeDescriptors(*descriptors); | |
| 6854 } else { | |
| 6855 int old_size = descriptors->number_of_descriptors(); | 6874 int old_size = descriptors->number_of_descriptors(); |
| 6856 // Descriptor arrays grow by 50%. | 6875 if (old_size == 0) { |
| 6857 Handle<DescriptorArray> new_descriptors = | 6876 descriptors = map->GetIsolate()->factory()->NewDescriptorArray(0, 1); |
| 6858 map->GetIsolate()->factory()->NewDescriptorArray( | 6877 } else { |
| 6859 old_size, old_size < 4 ? 1 : old_size / 2); | 6878 Map::EnsureDescriptorSlack(map, old_size < 4 ? 1 : old_size / 2); |
| 6879 descriptors = handle(map->instance_descriptors()); |
| 6880 } |
| 6881 } |
| 6860 | 6882 |
| 6861 DisallowHeapAllocation no_gc; | 6883 // Commit the state atomically. |
| 6862 DescriptorArray::WhitenessWitness witness(*new_descriptors); | 6884 DisallowHeapAllocation no_gc; |
| 6863 | 6885 |
| 6864 // Copy the descriptors, inserting a descriptor. | 6886 descriptors->Append(descriptor); |
| 6865 for (int i = 0; i < old_size; ++i) { | 6887 result->SetBackPointer(*map); |
| 6866 new_descriptors->CopyFrom(i, *descriptors, i, witness); | 6888 result->InitializeDescriptors(*descriptors); |
| 6867 } | |
| 6868 | |
| 6869 new_descriptors->Append(descriptor, witness); | |
| 6870 | |
| 6871 if (old_size > 0) { | |
| 6872 // If the source descriptors had an enum cache we copy it. This ensures | |
| 6873 // that the maps to which we push the new descriptor array back can rely | |
| 6874 // on a cache always being available once it is set. If the map has more | |
| 6875 // enumerated descriptors than available in the original cache, the cache | |
| 6876 // will be lazily replaced by the extended cache when needed. | |
| 6877 if (descriptors->HasEnumCache()) { | |
| 6878 new_descriptors->CopyEnumCacheFrom(*descriptors); | |
| 6879 } | |
| 6880 | |
| 6881 Map* walk_map; | |
| 6882 // Replace descriptors by new_descriptors in all maps that share it. | |
| 6883 | |
| 6884 map->GetHeap()->incremental_marking()->RecordWrites(*descriptors); | |
| 6885 for (Object* current = map->GetBackPointer(); | |
| 6886 !current->IsUndefined(); | |
| 6887 current = walk_map->GetBackPointer()) { | |
| 6888 walk_map = Map::cast(current); | |
| 6889 if (walk_map->instance_descriptors() != *descriptors) break; | |
| 6890 walk_map->set_instance_descriptors(*new_descriptors); | |
| 6891 } | |
| 6892 | |
| 6893 map->set_instance_descriptors(*new_descriptors); | |
| 6894 } | |
| 6895 | |
| 6896 result->SetBackPointer(*map); | |
| 6897 result->InitializeDescriptors(*new_descriptors); | |
| 6898 } | |
| 6899 | 6889 |
| 6900 ASSERT(result->NumberOfOwnDescriptors() == map->NumberOfOwnDescriptors() + 1); | 6890 ASSERT(result->NumberOfOwnDescriptors() == map->NumberOfOwnDescriptors() + 1); |
| 6901 | 6891 |
| 6902 map->set_transitions(*transitions); | 6892 map->set_transitions(*transitions); |
| 6903 map->set_owns_descriptors(false); | 6893 map->set_owns_descriptors(false); |
| 6904 | 6894 |
| 6905 return result; | 6895 return result; |
| 6906 } | 6896 } |
| 6907 | 6897 |
| 6908 | 6898 |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7091 | 7081 |
| 7092 | 7082 |
| 7093 Handle<Map> Map::CopyAddDescriptor(Handle<Map> map, | 7083 Handle<Map> Map::CopyAddDescriptor(Handle<Map> map, |
| 7094 Descriptor* descriptor, | 7084 Descriptor* descriptor, |
| 7095 TransitionFlag flag) { | 7085 TransitionFlag flag) { |
| 7096 Handle<DescriptorArray> descriptors(map->instance_descriptors()); | 7086 Handle<DescriptorArray> descriptors(map->instance_descriptors()); |
| 7097 | 7087 |
| 7098 // Ensure the key is unique. | 7088 // Ensure the key is unique. |
| 7099 descriptor->KeyToUniqueName(); | 7089 descriptor->KeyToUniqueName(); |
| 7100 | 7090 |
| 7101 int old_size = map->NumberOfOwnDescriptors(); | |
| 7102 int new_size = old_size + 1; | |
| 7103 | |
| 7104 if (flag == INSERT_TRANSITION && | 7091 if (flag == INSERT_TRANSITION && |
| 7105 map->owns_descriptors() && | 7092 map->owns_descriptors() && |
| 7106 map->CanHaveMoreTransitions()) { | 7093 map->CanHaveMoreTransitions()) { |
| 7107 return Map::ShareDescriptor(map, descriptors, descriptor); | 7094 return Map::ShareDescriptor(map, descriptors, descriptor); |
| 7108 } | 7095 } |
| 7109 | 7096 |
| 7110 Handle<DescriptorArray> new_descriptors = | 7097 Handle<DescriptorArray> new_descriptors = DescriptorArray::CopyUpTo( |
| 7111 map->GetIsolate()->factory()->NewDescriptorArray(old_size, 1); | 7098 descriptors, map->NumberOfOwnDescriptors(), 1); |
| 7099 new_descriptors->Append(descriptor); |
| 7112 | 7100 |
| 7113 DescriptorArray::WhitenessWitness witness(*new_descriptors); | |
| 7114 | |
| 7115 // Copy the descriptors, inserting a descriptor. | |
| 7116 for (int i = 0; i < old_size; ++i) { | |
| 7117 new_descriptors->CopyFrom(i, *descriptors, i, witness); | |
| 7118 } | |
| 7119 | |
| 7120 if (old_size != descriptors->number_of_descriptors()) { | |
| 7121 new_descriptors->SetNumberOfDescriptors(new_size); | |
| 7122 new_descriptors->Set(old_size, descriptor, witness); | |
| 7123 new_descriptors->Sort(); | |
| 7124 } else { | |
| 7125 new_descriptors->Append(descriptor, witness); | |
| 7126 } | |
| 7127 | |
| 7128 Handle<Name> key = descriptor->GetKey(); | |
| 7129 return Map::CopyReplaceDescriptors( | 7101 return Map::CopyReplaceDescriptors( |
| 7130 map, new_descriptors, flag, key, SIMPLE_TRANSITION); | 7102 map, new_descriptors, flag, descriptor->GetKey(), SIMPLE_TRANSITION); |
| 7131 } | 7103 } |
| 7132 | 7104 |
| 7133 | 7105 |
| 7134 Handle<Map> Map::CopyInsertDescriptor(Handle<Map> map, | 7106 Handle<Map> Map::CopyInsertDescriptor(Handle<Map> map, |
| 7135 Descriptor* descriptor, | 7107 Descriptor* descriptor, |
| 7136 TransitionFlag flag) { | 7108 TransitionFlag flag) { |
| 7137 Handle<DescriptorArray> old_descriptors(map->instance_descriptors()); | 7109 Handle<DescriptorArray> old_descriptors(map->instance_descriptors()); |
| 7138 | 7110 |
| 7139 // Ensure the key is unique. | 7111 // Ensure the key is unique. |
| 7140 descriptor->KeyToUniqueName(); | 7112 descriptor->KeyToUniqueName(); |
| 7141 | 7113 |
| 7142 // We replace the key if it is already present. | 7114 // We replace the key if it is already present. |
| 7143 int index = old_descriptors->SearchWithCache(*descriptor->GetKey(), *map); | 7115 int index = old_descriptors->SearchWithCache(*descriptor->GetKey(), *map); |
| 7144 if (index != DescriptorArray::kNotFound) { | 7116 if (index != DescriptorArray::kNotFound) { |
| 7145 return Map::CopyReplaceDescriptor( | 7117 return Map::CopyReplaceDescriptor( |
| 7146 map, old_descriptors, descriptor, index, flag); | 7118 map, old_descriptors, descriptor, index, flag); |
| 7147 } | 7119 } |
| 7148 return Map::CopyAddDescriptor(map, descriptor, flag); | 7120 return Map::CopyAddDescriptor(map, descriptor, flag); |
| 7149 } | 7121 } |
| 7150 | 7122 |
| 7151 | 7123 |
| 7152 Handle<DescriptorArray> DescriptorArray::CopyUpTo( | 7124 Handle<DescriptorArray> DescriptorArray::CopyUpTo( |
| 7153 Handle<DescriptorArray> desc, | 7125 Handle<DescriptorArray> desc, |
| 7154 int enumeration_index) { | 7126 int enumeration_index, |
| 7155 return DescriptorArray::CopyUpToAddAttributes(desc, | 7127 int slack) { |
| 7156 enumeration_index, | 7128 return DescriptorArray::CopyUpToAddAttributes( |
| 7157 NONE); | 7129 desc, enumeration_index, NONE, slack); |
| 7158 } | 7130 } |
| 7159 | 7131 |
| 7160 | 7132 |
| 7161 Handle<DescriptorArray> DescriptorArray::CopyUpToAddAttributes( | 7133 Handle<DescriptorArray> DescriptorArray::CopyUpToAddAttributes( |
| 7162 Handle<DescriptorArray> desc, | 7134 Handle<DescriptorArray> desc, |
| 7163 int enumeration_index, | 7135 int enumeration_index, |
| 7164 PropertyAttributes attributes) { | 7136 PropertyAttributes attributes, |
| 7165 if (enumeration_index == 0) { | 7137 int slack) { |
| 7138 if (enumeration_index + slack == 0) { |
| 7166 return desc->GetIsolate()->factory()->empty_descriptor_array(); | 7139 return desc->GetIsolate()->factory()->empty_descriptor_array(); |
| 7167 } | 7140 } |
| 7168 | 7141 |
| 7169 int size = enumeration_index; | 7142 int size = enumeration_index; |
| 7170 | 7143 |
| 7171 Handle<DescriptorArray> descriptors = | 7144 Handle<DescriptorArray> descriptors = |
| 7172 desc->GetIsolate()->factory()->NewDescriptorArray(size); | 7145 desc->GetIsolate()->factory()->NewDescriptorArray(size, slack); |
| 7173 DescriptorArray::WhitenessWitness witness(*descriptors); | 7146 DescriptorArray::WhitenessWitness witness(*descriptors); |
| 7174 | 7147 |
| 7175 if (attributes != NONE) { | 7148 if (attributes != NONE) { |
| 7176 for (int i = 0; i < size; ++i) { | 7149 for (int i = 0; i < size; ++i) { |
| 7177 Object* value = desc->GetValue(i); | 7150 Object* value = desc->GetValue(i); |
| 7178 PropertyDetails details = desc->GetDetails(i); | 7151 PropertyDetails details = desc->GetDetails(i); |
| 7179 int mask = DONT_DELETE | DONT_ENUM; | 7152 int mask = DONT_DELETE | DONT_ENUM; |
| 7180 // READ_ONLY is an invalid attribute for JS setters/getters. | 7153 // READ_ONLY is an invalid attribute for JS setters/getters. |
| 7181 if (details.type() != CALLBACKS || !value->IsAccessorPair()) { | 7154 if (details.type() != CALLBACKS || !value->IsAccessorPair()) { |
| 7182 mask |= READ_ONLY; | 7155 mask |= READ_ONLY; |
| 7183 } | 7156 } |
| 7184 details = details.CopyAddAttributes( | 7157 details = details.CopyAddAttributes( |
| 7185 static_cast<PropertyAttributes>(attributes & mask)); | 7158 static_cast<PropertyAttributes>(attributes & mask)); |
| 7186 Descriptor inner_desc(handle(desc->GetKey(i)), | 7159 Descriptor inner_desc(handle(desc->GetKey(i)), |
| 7187 handle(value, desc->GetIsolate()), | 7160 handle(value, desc->GetIsolate()), |
| 7188 details); | 7161 details); |
| 7189 descriptors->Set(i, &inner_desc, witness); | 7162 descriptors->Set(i, &inner_desc, witness); |
| 7190 } | 7163 } |
| 7191 } else { | 7164 } else { |
| 7192 for (int i = 0; i < size; ++i) { | 7165 for (int i = 0; i < size; ++i) { |
| 7193 descriptors->CopyFrom(i, *desc, i, witness); | 7166 descriptors->CopyFrom(i, *desc, witness); |
| 7194 } | 7167 } |
| 7195 } | 7168 } |
| 7196 | 7169 |
| 7197 if (desc->number_of_descriptors() != enumeration_index) descriptors->Sort(); | 7170 if (desc->number_of_descriptors() != enumeration_index) descriptors->Sort(); |
| 7198 | 7171 |
| 7199 return descriptors; | 7172 return descriptors; |
| 7200 } | 7173 } |
| 7201 | 7174 |
| 7202 | 7175 |
| 7203 Handle<Map> Map::CopyReplaceDescriptor(Handle<Map> map, | 7176 Handle<Map> Map::CopyReplaceDescriptor(Handle<Map> map, |
| 7204 Handle<DescriptorArray> descriptors, | 7177 Handle<DescriptorArray> descriptors, |
| 7205 Descriptor* descriptor, | 7178 Descriptor* descriptor, |
| 7206 int insertion_index, | 7179 int insertion_index, |
| 7207 TransitionFlag flag) { | 7180 TransitionFlag flag) { |
| 7208 // Ensure the key is unique. | 7181 // Ensure the key is unique. |
| 7209 descriptor->KeyToUniqueName(); | 7182 descriptor->KeyToUniqueName(); |
| 7210 | 7183 |
| 7211 Handle<Name> key = descriptor->GetKey(); | 7184 Handle<Name> key = descriptor->GetKey(); |
| 7212 ASSERT(*key == descriptors->GetKey(insertion_index)); | 7185 ASSERT(*key == descriptors->GetKey(insertion_index)); |
| 7213 | 7186 |
| 7214 int new_size = map->NumberOfOwnDescriptors(); | 7187 Handle<DescriptorArray> new_descriptors = DescriptorArray::CopyUpTo( |
| 7215 ASSERT(0 <= insertion_index && insertion_index < new_size); | 7188 descriptors, map->NumberOfOwnDescriptors()); |
| 7216 | 7189 |
| 7217 ASSERT_LT(insertion_index, new_size); | 7190 new_descriptors->Replace(insertion_index, descriptor); |
| 7218 | |
| 7219 Handle<DescriptorArray> new_descriptors = | |
| 7220 map->GetIsolate()->factory()->NewDescriptorArray(new_size); | |
| 7221 DescriptorArray::WhitenessWitness witness(*new_descriptors); | |
| 7222 | |
| 7223 for (int i = 0; i < new_size; ++i) { | |
| 7224 if (i == insertion_index) { | |
| 7225 new_descriptors->Set(i, descriptor, witness); | |
| 7226 } else { | |
| 7227 new_descriptors->CopyFrom(i, *descriptors, i, witness); | |
| 7228 } | |
| 7229 } | |
| 7230 | |
| 7231 new_descriptors->Sort(); | |
| 7232 | 7191 |
| 7233 SimpleTransitionFlag simple_flag = | 7192 SimpleTransitionFlag simple_flag = |
| 7234 (insertion_index == descriptors->number_of_descriptors() - 1) | 7193 (insertion_index == descriptors->number_of_descriptors() - 1) |
| 7235 ? SIMPLE_TRANSITION | 7194 ? SIMPLE_TRANSITION |
| 7236 : FULL_TRANSITION; | 7195 : FULL_TRANSITION; |
| 7237 return Map::CopyReplaceDescriptors( | 7196 return Map::CopyReplaceDescriptors( |
| 7238 map, new_descriptors, flag, key, simple_flag); | 7197 map, new_descriptors, flag, key, simple_flag); |
| 7239 } | 7198 } |
| 7240 | 7199 |
| 7241 | 7200 |
| (...skipping 809 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8051 result->set(kEnumCacheIndex, Smi::FromInt(0)); | 8010 result->set(kEnumCacheIndex, Smi::FromInt(0)); |
| 8052 return result; | 8011 return result; |
| 8053 } | 8012 } |
| 8054 | 8013 |
| 8055 | 8014 |
| 8056 void DescriptorArray::ClearEnumCache() { | 8015 void DescriptorArray::ClearEnumCache() { |
| 8057 set(kEnumCacheIndex, Smi::FromInt(0)); | 8016 set(kEnumCacheIndex, Smi::FromInt(0)); |
| 8058 } | 8017 } |
| 8059 | 8018 |
| 8060 | 8019 |
| 8020 void DescriptorArray::Replace(int index, Descriptor* descriptor) { |
| 8021 descriptor->SetSortedKeyIndex(GetSortedKeyIndex(index)); |
| 8022 Set(index, descriptor); |
| 8023 } |
| 8024 |
| 8025 |
| 8061 void DescriptorArray::SetEnumCache(FixedArray* bridge_storage, | 8026 void DescriptorArray::SetEnumCache(FixedArray* bridge_storage, |
| 8062 FixedArray* new_cache, | 8027 FixedArray* new_cache, |
| 8063 Object* new_index_cache) { | 8028 Object* new_index_cache) { |
| 8064 ASSERT(bridge_storage->length() >= kEnumCacheBridgeLength); | 8029 ASSERT(bridge_storage->length() >= kEnumCacheBridgeLength); |
| 8065 ASSERT(new_index_cache->IsSmi() || new_index_cache->IsFixedArray()); | 8030 ASSERT(new_index_cache->IsSmi() || new_index_cache->IsFixedArray()); |
| 8066 ASSERT(!IsEmpty()); | 8031 ASSERT(!IsEmpty()); |
| 8067 ASSERT(!HasEnumCache() || new_cache->length() > GetEnumCache()->length()); | 8032 ASSERT(!HasEnumCache() || new_cache->length() > GetEnumCache()->length()); |
| 8068 FixedArray::cast(bridge_storage)-> | 8033 FixedArray::cast(bridge_storage)-> |
| 8069 set(kEnumCacheBridgeCacheIndex, new_cache); | 8034 set(kEnumCacheBridgeCacheIndex, new_cache); |
| 8070 FixedArray::cast(bridge_storage)-> | 8035 FixedArray::cast(bridge_storage)-> |
| 8071 set(kEnumCacheBridgeIndicesCacheIndex, new_index_cache); | 8036 set(kEnumCacheBridgeIndicesCacheIndex, new_index_cache); |
| 8072 set(kEnumCacheIndex, bridge_storage); | 8037 set(kEnumCacheIndex, bridge_storage); |
| 8073 } | 8038 } |
| 8074 | 8039 |
| 8075 | 8040 |
| 8076 void DescriptorArray::CopyFrom(int dst_index, | 8041 void DescriptorArray::CopyFrom(int index, |
| 8077 DescriptorArray* src, | 8042 DescriptorArray* src, |
| 8078 int src_index, | |
| 8079 const WhitenessWitness& witness) { | 8043 const WhitenessWitness& witness) { |
| 8080 Object* value = src->GetValue(src_index); | 8044 Object* value = src->GetValue(index); |
| 8081 PropertyDetails details = src->GetDetails(src_index); | 8045 PropertyDetails details = src->GetDetails(index); |
| 8082 Descriptor desc(handle(src->GetKey(src_index)), | 8046 Descriptor desc(handle(src->GetKey(index)), |
| 8083 handle(value, src->GetIsolate()), | 8047 handle(value, src->GetIsolate()), |
| 8084 details); | 8048 details); |
| 8085 Set(dst_index, &desc, witness); | 8049 Set(index, &desc, witness); |
| 8086 } | 8050 } |
| 8087 | 8051 |
| 8088 | 8052 |
| 8089 // Creates a new descriptor array by merging the descriptor array of |right_map| | 8053 // Creates a new descriptor array by merging the descriptor array of |right_map| |
| 8090 // into the (at least partly) updated descriptor array of |left_map|. | 8054 // into the (at least partly) updated descriptor array of |left_map|. |
| 8091 // The method merges two descriptor array in three parts. Both descriptor arrays | 8055 // The method merges two descriptor array in three parts. Both descriptor arrays |
| 8092 // are identical up to |verbatim|. They also overlap in keys up to |valid|. | 8056 // are identical up to |verbatim|. They also overlap in keys up to |valid|. |
| 8093 // Between |verbatim| and |valid|, the resulting descriptor type as well as the | 8057 // Between |verbatim| and |valid|, the resulting descriptor type as well as the |
| 8094 // representation are generalized from both |left_map| and |right_map|. Beyond | 8058 // representation are generalized from both |left_map| and |right_map|. Beyond |
| 8095 // |valid|, the descriptors are copied verbatim from |right_map| up to | 8059 // |valid|, the descriptors are copied verbatim from |right_map| up to |
| (...skipping 8575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16671 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16635 #define ERROR_MESSAGES_TEXTS(C, T) T, |
| 16672 static const char* error_messages_[] = { | 16636 static const char* error_messages_[] = { |
| 16673 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16637 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
| 16674 }; | 16638 }; |
| 16675 #undef ERROR_MESSAGES_TEXTS | 16639 #undef ERROR_MESSAGES_TEXTS |
| 16676 return error_messages_[reason]; | 16640 return error_messages_[reason]; |
| 16677 } | 16641 } |
| 16678 | 16642 |
| 16679 | 16643 |
| 16680 } } // namespace v8::internal | 16644 } } // namespace v8::internal |
| OLD | NEW |